00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <clipsmm/factory.h>
00020
00021 #include <string>
00022 #include <stdexcept>
00023
00024 extern "C" {
00025 #include <clips/clips.h>
00026 };
00027
00028 #include <clipsmm/environment.h>
00029
00030 namespace DACLIPS {
00031
00032 Values data_object_to_values( dataObject* clipsdo ) {
00033 return data_object_to_values( *clipsdo );
00034 }
00035
00036 Values data_object_to_values( dataObject& clipsdo ) {
00037 Values values;
00038
00039 std::string s;
00040 double d;
00041 long int i;
00042 void* p;
00043
00044 void* mfptr;
00045 long int end;
00046
00047 switch ( GetType( clipsdo ) ) {
00048 case RVOID:
00049 return values;
00050 case STRING:
00051 s = DOToString( clipsdo );
00052 values.push_back( Value( s, TYPE_STRING ) );
00053 return values;
00054 case INSTANCE_NAME:
00055 s = DOToString( clipsdo );
00056 values.push_back( Value( s, TYPE_INSTANCE_NAME ) );
00057 return values;
00058 case SYMBOL:
00059 s = DOToString( clipsdo );
00060 values.push_back( Value( s, TYPE_SYMBOL ) );
00061 return values;
00062 case FLOAT:
00063 d = DOToDouble( clipsdo );
00064 values.push_back( Value( d ) );
00065 return values;
00066 case INTEGER:
00067 i = DOToLong( clipsdo );
00068 values.push_back( Value( i ) );
00069 return values;
00070 case INSTANCE_ADDRESS:
00071 p = DOToPointer( clipsdo );
00072 values.push_back( Value( p, TYPE_INSTANCE_ADDRESS ) );
00073 return values;
00074 case EXTERNAL_ADDRESS:
00075 p = DOToPointer( clipsdo );
00076 values.push_back( Value( p, TYPE_EXTERNAL_ADDRESS ) );
00077 return values;
00078 case MULTIFIELD:
00079 end = GetDOEnd( clipsdo );
00080 mfptr = GetValue( clipsdo );
00081 for ( int iter = GetDOBegin( clipsdo ); iter <= end; iter++ ) {
00082 switch ( GetMFType( mfptr, iter ) ) {
00083 case STRING:
00084 s = ValueToString( GetMFValue( mfptr, iter ) );
00085 values.push_back( Value( s, TYPE_STRING ) );
00086 break;
00087 case SYMBOL:
00088 s = ValueToString( GetMFValue( mfptr, iter ) );
00089 values.push_back( Value( s, TYPE_SYMBOL ) );
00090 break;
00091 case FLOAT:
00092 d = ValueToDouble( GetMFValue( mfptr, iter ) );
00093 values.push_back( Value( d ) );
00094 break;
00095 case INTEGER:
00096 i = ValueToLong( GetMFValue( mfptr, iter ) );
00097 values.push_back( Value( i ) );
00098 break;
00099 default:
00100 throw std::logic_error( "clipsmm::data_object_to_values: Unhandled multifield type" );
00101 }
00102 }
00103 return values;
00104 default:
00105 std::cout << std::endl << "Type: " << GetType(clipsdo) << std::endl;
00106 throw std::logic_error( "clipsmm::data_object_to_values: Unhandled data object type" );
00107 }
00108 }
00109
00110 dataObject * value_to_data_object( const Environment& env, const Value & value )
00111 {
00112 void *p;
00113 dataObject* clipsdo = new dataObject;
00114
00115 SetpType(clipsdo, value.type() );
00116 switch ( value.type() ) {
00117 case SYMBOL:
00118 case STRING:
00119 case INSTANCE_NAME:
00120 p = EnvAddSymbol( env.cobj(),
00121 const_cast<char*>( value.as_string().c_str())
00122 );
00123 SetpValue(clipsdo, p);
00124 return clipsdo;
00125 case INTEGER:
00126 p = EnvAddLong( env.cobj(), value.as_integer() );
00127 SetpValue(clipsdo, p);
00128 return clipsdo;
00129 case FLOAT:
00130 p = EnvAddDouble( env.cobj(), value.as_float() );
00131 SetpValue(clipsdo, p);
00132 return clipsdo;
00133 default:
00134 throw std::logic_error( "clipsmm::value_to_data_object: Unhandled data object type" );
00135 }
00136
00137 return NULL;
00138 }
00139
00140 dataObject * value_to_data_object( const Environment& env, const Values & values )
00141 {
00142 void *p, *p2;
00143
00144 if (values.size() == 0 )
00145 return NULL;
00146
00147 if ( values.size() == 1 )
00148 return value_to_data_object( env, values[0] );
00149
00150 dataObject* clipsdo = new dataObject;
00151
00152 p = EnvCreateMultifield( env.cobj(), values.size() );
00153 for (unsigned int iter = 0; iter < values.size(); iter++) {
00154 SetMFType(p, iter, values[iter].type());
00155 switch ( values[iter].type() ) {
00156 case SYMBOL:
00157 case STRING:
00158 case INSTANCE_NAME:
00159 p2 = EnvAddSymbol( env.cobj(),
00160 const_cast<char*>(values[iter].as_string().c_str())
00161 );
00162 SetMFValue(p, iter, p2);
00163 break;
00164 case INTEGER:
00165 p2 = EnvAddLong( env.cobj(), values[iter].as_integer() );
00166 SetMFValue(p, iter, p2);
00167 break;
00168 case FLOAT:
00169 p2 = EnvAddDouble( env.cobj(), values[iter].as_float() );
00170 SetMFValue(p, iter, p2);
00171 break;
00172 default:
00173 throw std::logic_error( "clipsmm::value_to_data_object: Unhandled data object type" );
00174 }
00175 }
00176 SetpType(clipsdo, MULTIFIELD);
00177 SetpValue(clipsdo, p);
00178 return clipsdo;
00179 }
00180
00181 }