00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00026
00028 #ifndef __TYPEDFIELD_H__
00029 #define __TYPEDFIELD_H__
00030
00031 #include <sstream>
00032 #include "TypedFieldCheck.h"
00033
00034 namespace H3D {
00035 using namespace TypedFieldTypeCheck;
00080
00081 template< class BaseField,
00082 class RequiredArgTypes,
00083 class OptionalArgTypes = void >
00084 class TypedField : public BaseField {
00085 public:
00086 TypedField() {
00087 try {
00088 checkTemplateArguments();
00089 } catch( const InvalidTemplateArguments &e ) {
00090 stringstream s;
00091 s << e << " in definition of field named \"" << this->getFullName()
00092 << "\". ";
00093 throw TypedFieldError( s.str() );
00094 }
00095 }
00096
00097 protected:
00106 void checkFieldType( Field *f, int index ) {
00107 try {
00108 TypedFieldCheck< RequiredArgTypes,
00109 OptionalArgTypes >::checkFieldType( f, index, 0 );
00110 } catch( TypedFieldError &e ) {
00111 stringstream s;
00112 s << e.message << " Source field: \"" << f->getFullName()
00113 << "\". Destination field: \"" << this->getFullName()
00114 << "\".";
00115 e.message = s.str();
00116 throw e;
00117 }
00118 }
00119
00124 void checkTemplateArguments() {
00125 TypedFieldCheck< RequiredArgTypes,
00126 OptionalArgTypes >::checkTemplateArguments();
00127 }
00128 };
00129 }
00130
00131 #endif