|
libFAUDES
Sections
Index
|
7_interface.cppGo to the documentation of this file.00001 /** @file 7_interface.cpp 00002 00003 Tutorial, runtime interface. This tutorial demonstrates access to 00004 libFAUDES data types and functions via the type- and function 00005 registries. The runtime interface addresses the development 00006 of applications that transparently propagate libFAUDES extensions 00007 to the user. 00008 00009 00010 @ingroup Tutorials 00011 00012 @include 7_interface.cpp 00013 00014 */ 00015 00016 #include <iostream> 00017 #include "libfaudes.h" 00018 00019 using namespace faudes; 00020 00021 00022 int main(){ 00023 00024 // ******************** basic ussage of the faudes type interface 00025 00026 // load (do so once on application startup) 00027 LoadRegistry("../include/libfaudes.rti"); 00028 00029 // report to console 00030 std::cout << "################################\n"; 00031 std::cout << "# tutorial, faudes types \n"; 00032 00033 // instatiate an object by faudes type 00034 Type* fobject = NewFaudesObject("System"); 00035 00036 // query type of an object 00037 std::cout << " faudes type of object: " << FaudesTypeName(*fobject) << "\n"; 00038 00039 // type test: can we cast this to a generator? 00040 vGenerator gen; 00041 if(gen.Cast(fobject)) 00042 std::cout << " faudes object cast to Generator: ok [expected]\n"; 00043 else 00044 std::cout << " faudes object cast to Generator: failed\n"; 00045 00046 // type test: can we cast this to an eventset? 00047 EventSet eset; 00048 if(eset.Cast(fobject)) 00049 std::cout << " faudes object cast to EventSet: ok\n"; 00050 else 00051 std::cout << " faudes object cast to EventSet: failed [expected]\n"; 00052 00053 00054 // report 00055 std::cout << "################################\n"; 00056 00057 // ******************** basic ussage of the function registry 00058 00059 // instatiate some generators via the registry 00060 Type* data0 = NewFaudesObject("Generator"); 00061 Type* data1 = NewFaudesObject("Generator"); 00062 Type* data2 = NewFaudesObject("Generator"); 00063 00064 // load input data from files 00065 data0->Read("./data/simplemachine.gen"); 00066 data1->Read("./data/buffer.gen"); 00067 00068 // instantiate a function via registry 00069 Function* funct = NewFaudesFunction("Parallel"); 00070 00071 // set parameter values (exception on accessing positional parameter out of range) 00072 funct->ParamValue(0,data0); 00073 funct->ParamValue(1,data1); 00074 funct->ParamValue(2,data2); 00075 00076 // execute function (exception on type mismatch) 00077 funct->Execute(); 00078 00079 // report to console 00080 std::cout << "################################\n"; 00081 std::cout << "# tutorial, rti parallel \n"; 00082 data2->Write(); 00083 std::cout << "################################\n"; 00084 00085 // test case 00086 vGenerator* vgen=dynamic_cast<vGenerator*>(data2); 00087 if(!vgen) { 00088 std::cout << "ERR: res does not cast to vGenerator\n"; 00089 exit(1); 00090 } 00091 if(vgen->Size()!=6) { 00092 std::cout << "ERR: res is expected to have 6 states\n"; 00093 exit(1); 00094 } 00095 00096 // clear registry for below demos 00097 ClearRegistry(); 00098 00099 // delete my objects 00100 delete data0; 00101 delete data1; 00102 delete data2; 00103 00104 // ******************** elementary type, String 00105 00106 // create new String instance 00107 String fstring; 00108 00109 // assign from corresponding c type std::string 00110 fstring = "hello faudes types"; 00111 00112 // assign to corresponding c type std::string 00113 std::string sstring = fstring; 00114 00115 // file io 00116 fstring.Write("tmp_string.txt"); 00117 fstring.Read("tmp_string.txt"); 00118 00119 // report to console 00120 std::cout << "################################\n"; 00121 std::cout << "# tutorial, rti string \n"; 00122 fstring.Write(); 00123 std::cout << "################################\n"; 00124 00125 00126 // ******************** elementary type, Integer 00127 00128 // create new Integer instance 00129 Integer fint; 00130 00131 // assign from corresponding c type std::int 00132 fint = 42; 00133 00134 // assign to corresponding c type std::int 00135 int sint = fint; 00136 00137 // arithmetic 00138 fint = 2*fint+16; 00139 00140 // file io 00141 fint.Write("tmp_int.txt"); 00142 fint.Read("tmp_int.txt"); 00143 00144 // report to console 00145 std::cout << "################################\n"; 00146 std::cout << "# tutorial, rti integer \n"; 00147 fint.Write(); 00148 std::cout << "################################\n"; 00149 00150 // test case 00151 if(fint!=100) { 00152 std::cout << "ERR: expected 100\n"; 00153 exit(1); 00154 } 00155 00156 00157 // ******************** elementary type, Boolean 00158 00159 // create new Integer instance 00160 Boolean fbool; 00161 00162 // assign from corresponding c type std::int 00163 fbool = false; 00164 00165 // assign to corresponding c type std::int 00166 bool sbool = !fbool; 00167 00168 // file io 00169 fbool.Write("tmp_bool.txt"); 00170 fbool.Read("tmp_bool.txt"); 00171 00172 // report to console 00173 std::cout << "################################\n"; 00174 std::cout << "# tutorial, rti bool \n"; 00175 fbool.Write(); 00176 std::cout << "################################\n"; 00177 00178 00179 // ******************** advanced: type definitions and registry 00180 00181 // defining a type with specified faudes type name (and no documentation) 00182 TypeDefinition* tdalphabet = TypeDefinition::Constructor<cEventSet>("EventSet"); 00183 00184 // defining a type with type name "Generator" and documentation from specified file 00185 TypeDefinition* tdgenerator = TypeDefinition::FromFile<cGenerator>("data/generator.rti"); 00186 00187 00188 // register previously defined types 00189 TypeRegistry::G()->Insert(tdalphabet); 00190 TypeRegistry::G()->Insert(tdgenerator); 00191 00192 // load any additional documentation from file (event set is missing from above) 00193 TypeRegistry::G()->MergeDocumentation("../include/libfaudes.rti"); 00194 00195 // dump registry to console 00196 std::cout << "################################\n"; 00197 std::cout << "# tutorial, type registry \n"; 00198 TypeRegistry::G()->Write(); 00199 std::cout << "################################\n"; 00200 00201 // use the registry to construct an object by its type name 00202 Type* generator = NewFaudesObject("Generator"); 00203 00204 // test generator object 00205 if(dynamic_cast<cGenerator*>(generator)) 00206 std::cout << "Faudes object casts to cGenerator: OK\n"; 00207 else 00208 std::cout << "Faudes object casts to cGenerator: ERR (cast failed)\n"; 00209 00210 // recover faudes type name from object 00211 std::cout << "Its a \"" << FaudesTypeName(*generator) << "\"\n"; 00212 00213 // delete my objects 00214 delete generator; 00215 00216 return(0); 00217 } |
libFAUDES 2.18b --- 2010-12-17 --- c++ source docu by doxygen 1.6.3