7_interface.cpp File Reference

Tutorial, runtime interface. More...

#include <iostream>
#include "libfaudes.h"

Go to the source code of this file.

Functions

int main ()
 

Detailed Description

Tutorial, runtime interface.

This tutorial demonstrates access to libFAUDES data types and functions via the type- and function registries. The runtime interface addresses the development of applications that transparently propagate libFAUDES extensions to the user.

/** @file 7_interface.cpp
Tutorial, runtime interface. This tutorial demonstrates access to
libFAUDES data types and functions via the type- and function
registries. The runtime interface addresses the development
of applications that transparently propagate libFAUDES extensions
to the user.
@ingroup Tutorials
@include 7_interface.cpp
*/
#include <iostream>
#include "libfaudes.h"
using namespace faudes;
int main(){
// ******************** basic ussage of the faudes type interface
// load (do so once on application startup)
LoadRegistry("../include/libfaudes.rti");
// report to console
std::cout << "################################\n";
std::cout << "# tutorial, faudes types \n";
// instatiate an object by faudes type
Type* fobject = NewFaudesObject("System");
// query type of an object
std::cout << " faudes type of object: " << FaudesTypeName(*fobject) << "\n";
// type test: can we cast this to a plain generator?
Generator gen;
bool isvg= ( gen.Cast(fobject)!=NULL );
if(isvg)
std::cout << " faudes object casts to Generator: ok [expected]\n";
else
std::cout << " faudes object casts to Generator: failed\n";
// type test: can we cast this to an eventset?
EventSet eset;
bool ises = ( eset.Cast(fobject) != NULL ) ;
if(ises)
std::cout << " faudes object cast to EventSet: ok\n";
else
std::cout << " faudes object cast to EventSet: failed [expected]\n";
// Record test case
FAUDES_TEST_DUMP("faudes type",FaudesTypeName(*fobject));
FAUDES_TEST_DUMP("cast to generator",isvg);
FAUDES_TEST_DUMP("cast to eventset",ises);
// report
std::cout << "################################\n";
// ******************** basic ussage of the function registry
// instatiate some generators via the registry
Type* data0 = NewFaudesObject("Generator");
Type* data1 = NewFaudesObject("Generator");
Type* data2 = NewFaudesObject("Generator");
// load input data from files
data0->Read("./data/simplemachine.gen");
data1->Read("./data/buffer.gen");
// instantiate a function via registry
Function* funct = NewFaudesFunction("Parallel");
// set parameter values (exception on accessing positional parameter out of range)
funct->ParamValue(0,data0);
funct->ParamValue(1,data1);
funct->ParamValue(2,data2);
// execute function (exception on type mismatch)
funct->Execute();
// report to console
std::cout << "################################\n";
std::cout << "# tutorial, rti parallel \n";
data2->Write();
std::cout << "################################\n";
// test case
Generator* vgen=dynamic_cast<Generator*>(data2);
if(!vgen) {
std::cout << "ERR: res does not cast to Generator\n";
exit(1);
}
if(vgen->Size()!=6) {
std::cout << "ERR: res is expected to have 6 states\n";
exit(1);
}
// record test case
FAUDES_TEST_DUMP("rti parallel",*data2);
// clear registry for below demos
// delete my objects
delete data0;
delete data1;
delete data2;
// ******************** elementary type, String
// create new String instance
String fstring;
// assign from corresponding c type std::string
fstring = "hello faudes types";
// assign to corresponding c type std::string
std::string sstring = fstring;
// file io
fstring.Write("tmp_string.txt");
fstring.Read("tmp_string.txt");
// report to console
std::cout << "################################\n";
std::cout << "# tutorial, rti string \n";
fstring.Write();
std::cout << "################################\n";
// ******************** elementary type, Integer
// create new Integer instance
Integer fint;
// assign from corresponding c type std::int
fint = 42;
// assign to corresponding c type std::int
int sint = fint;
// arithmetic
fint = 2*fint+16;
// file io
fint.Write("tmp_int.txt");
fint.Read("tmp_int.txt");
// report to console
std::cout << "################################\n";
std::cout << "# tutorial, rti integer \n";
fint.Write();
std::cout << "################################\n";
// test case
if(fint!=100) {
std::cout << "ERR: expected 100\n";
exit(1);
}
// ******************** elementary type, Boolean
// create new Integer instance
Boolean fbool;
// assign from corresponding c type std::int
fbool = false;
// assign to corresponding c type std::int
bool sbool = !fbool;
// file io
fbool.Write("tmp_bool.txt");
fbool.Read("tmp_bool.txt");
// report to console
std::cout << "################################\n";
std::cout << "# tutorial, rti bool \n";
fbool.Write();
std::cout << "################################\n";
// ******************** advanced: type definitions and registry
// defining a type with specified faudes type name (and no documentation)
TypeDefinition* tdalphabet = TypeDefinition::Constructor<Alphabet>("EventSet");
// defining a type with type name "System" and documentation from specified file
TypeDefinition* tdgenerator = TypeDefinition::FromFile<System>("data/generator.rti");
// register previously defined types
TypeRegistry::G()->Insert(tdalphabet);
TypeRegistry::G()->Insert(tdgenerator);
// load any additional documentation from file (event set is missing from above)
TypeRegistry::G()->MergeDocumentation("../include/libfaudes.rti");
// dump registry to console
std::cout << "################################\n";
std::cout << "# tutorial, type registry \n";
std::cout << "################################\n";
// use the registry to construct an object by its type name
Type* generator = NewFaudesObject("System");
// test generator object
if(dynamic_cast<System*>(generator))
std::cout << "Faudes object casts to System: OK [expected]\n";
else
std::cout << "Faudes object does not casts to System: ERR [test case error]\n";
// recover faudes type name from object
std::cout << "Its a \"" << FaudesTypeName(*generator) << "\"\n";
// delete my objects
delete generator;
// done
std::cout << "################################\n";
return(0);
}
#define FAUDES_TEST_DUMP(mes, dat)
Test protocol record macro ("mangle" filename for platform independance)
Definition: cfl_helper.h:483
void MergeDocumentation(TokenReader &rTr)
Scan token input for type documentation.
static TypeRegistry * G()
Method to access the single global instance of the registry.
void Insert(TypeDefinition *pTypeDef)
Add another type definition to the registry.
void Write(const Type *pContext=0) const
Write configuration data to console.
Definition: cfl_types.cpp:139
int main(int argc, char *argv[])
NameSet EventSet
Convenience typedef for plain event sets.
Definition: cfl_nameset.h:531
vGenerator Generator
Plain generator, api typedef for generator with no attributes.
TcGenerator< AttributeVoid, AttributeVoid, AttributeCFlags, AttributeVoid > System
Convenience typedef for std System.
Function * NewFaudesFunction(const std::string &rFunctName)
Instantiate faudes function objects by function name.
void ClearRegistry(void)
Clear all registry.
void LoadRegistry(const std::string &rPath)
Load all registered types and functions.
const std::string & FaudesTypeName(const Type &rObject)
Query type name.
Type * NewFaudesObject(const std::string &rTypeName)
Instantiate faudes typed objects by type name.
Includes all libFAUDES headers, incl plugings
libFAUDES resides within the namespace faudes.

Definition in file 7_interface.cpp.

Function Documentation

◆ main()

int main ( void  )

Definition at line 22 of file 7_interface.cpp.

libFAUDES 2.32b --- 2024.03.01 --- c++ api documentaion by doxygen