00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00027 #ifndef __FIELDTEMPLATES_H__
00028 #define __FIELDTEMPLATES_H__
00029
00030 #include <string>
00031 #include <set>
00032 #include <vector>
00033
00034 #include "SField.h"
00035 #include "MField.h"
00036 #include "TypedField.h"
00037
00038 using namespace std;
00039
00040 namespace H3D {
00041
00042 H3D_VALUE_EXCEPTION( string, InvalidNodeType );
00043
00049 template< class RefCountedType, class BaseRefCountType >
00050 class TypedRefCountField: public BaseRefCountType {
00051 protected:
00053 void onAdd( typename BaseRefCountType::value_type n) {
00054 if( !dynamic_cast< RefCountedType * >( n ) ) {
00055 stringstream s;
00056 s << "Expecting " << typeid( RefCountedType ).name();
00057 throw InvalidNodeType( typeid( n ).name(),
00058 s.str(),
00059 H3D_FULL_LOCATION );
00060
00061 } else {
00062 BaseRefCountType::onAdd( n );
00063 }
00064 }
00065 public:
00067 virtual RefCountedType *getValue() {
00068 return static_cast< RefCountedType * >( BaseRefCountType::getValue() );
00069 }
00070
00071 };
00072
00077 template< class BaseFieldType >
00078 struct AutoUpdate: public BaseFieldType {
00082 virtual void propagateEvent( Field::Event e ) {
00083 BaseFieldType::propagateEvent( e );
00084 this->upToDate();
00085 }
00086 };
00087 }
00088
00089 #endif
00090