28#ifndef FAUDES_MUTE_RTIAUTOLOAD
35#include "allplugins.h"
37#include "rtiloader.cpp"
38#include "rtiwrapper.h"
39#include "rtiwrapper.cpp"
73 FD_DREG(
"TypeRegistry(): Constrtuct singleton");
81 FD_DREG(
"TypeRegistry::Clear(): begin with #" <<
Size());
83 std::map<std::string, TypeDefinition*>::iterator mit;
85 if(mit->second != NULL)
86 if(!mit->second->AutoRegistered()){
90 if(mit->second != NULL)
91 if(mit->second->AutoRegistered()){
92 FD_DREG(
"TypeRegistry::Clear(): detect autoreg " << mit->second->Name());
96 std::map<std::string, TypeDefinition*>::iterator dit;
106 FD_DREG(
"TypeRegistry::Clear(): keeping " << ptdef->
Name());
115 FD_DREG(
"TypeRegistry::ClearAll()");
117 std::map<std::string, TypeDefinition*>::iterator mit;
119 if(mit->second != NULL){
146 FD_DREG(
"TypeRegistry::Insert(): type name " << pTypeDef->
Name());
153 if((pt!=0) && (opt!=0))
154 if(
typeid(*pt).name() ==
typeid(*opt).name()) {
155 FD_DREG(
"TypeRegistry::Insert(): ignoring doublet " << pTypeDef->
Name());
161 std::stringstream err;
162 err <<
"Cannot overwrite existing entry with type " << pTypeDef->
Name() << std::endl;
163 throw Exception(
"TypeRegistry::Insert()", err.str(), 46);
166 if(pTypeDef->
Name()==
"") {
167 std::stringstream err;
168 err <<
"Cannot have empty name"<< std::endl;
169 throw Exception(
"TypeRegistry::Insert()", err.str(), 46);
182 FD_DV(
"TypeRegistry::MergeDocumentation(): using " << rTr.
FileName());
185 while(rTr.
Peek(token)) {
187 if(!token.
IsBegin(
"TypeDefinition")) { rTr.
Get(token);
continue; }
191 size_t pos=ftype.find(
"::");
192 if(pos!=std::string::npos) ftype=ftype.substr(pos+2);
193 FD_DRTI(
"TypeRegistry::MergeDocumentation(): " << ftype);
198 tit->second->MergeDocumentation(rTr);
217 FD_DREG(
"TypeRegistry::ElementTag("<<rTypeName<<
","<<rTag<<
")");
219 if(mit ==
End())
return;
220 mit->second->ElementTag(rTag);
227 static std::string estr=
"";
228 if(mit ==
End())
return estr;
229 return mit->second->ElementTag();
235 if(mit ==
End())
return;
236 mit->second->ElementType(rType);
242 static std::string estr=
"";
243 if(mit ==
End())
return estr;
244 return mit->second->ElementType();
251 FD_DREG(
"TypeRegistry::AutoRegistered(...): cannot access definition for faudes type " << rTypeName);
254 mit->second->AutoRegistered(flag);
260 if(mit ==
End())
return false;
261 return mit->second->AutoRegistered();
267 FD_DRTI(
"TypeRegistry::NewObject(\"" << rName <<
"\")");
270 std::stringstream err;
271 err <<
"Unknown Type " << rName << std::endl;
272 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
274 Type* res=mit->second->NewObject();
276 std::stringstream err;
277 err <<
"Failed to instatiate new " << rName << std::endl;
278 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
285 FD_DRTI(
"TypeRegistry::NewObject(prototype): typeid " <<
typeid(rType).name());
289 std::stringstream err;
290 err <<
"Unknown type by reference" << std::endl;
291 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
298 FD_DRTI(
"TypeRegistry::Definition( " << rName <<
" )");
301 std::stringstream err;
302 err <<
"Type not found: \"" << rName <<
"\"";
303 throw Exception(
"TypeRegistry::Definition()", err.str(), 46);
305 return(*(mit->second));
310 FD_DRTI(
"TypeRegistry::Definition(): typeid " <<
typeid(rType).name());
314 std::stringstream err;
315 err <<
"Type not found: " <<
typeid(rType).name();
316 throw Exception(
"TypeRegistry::Definition()", err.str(), 46);
321 FD_DRTI(
"TypeRegistry::Definitionp( " << rName <<
" )");
323 if(mit ==
End())
return NULL;
329 FD_DRTI(
"TypeRegistry::Definitionp(): for typeid " <<
typeid(rType).name());
333 FD_DRTI(
"TypeRegistry::Definitionp(): not found");
337 FD_DRTI(
"TypeRegistry::Definitionp(): found faudes type " << fdp->
Name());
343 FD_DRTI(
"TypeRegistry::Prototype( " << rName <<
" )");
345 if(mit ==
End())
return 0;
346 return(mit->second->Prototype());
351 FD_DRTI(
"TypeRegistry::TypeName(): typeid " <<
typeid(rType).name());
355 static std::string empty(
"");
361 FD_DRTI(
"TypeRegistry::TypeTest(): typeid " <<
typeid(rObject).name());
363 if(mit ==
End())
return false;
364 if(!mit->second->Prototype())
return false;
365 FD_DRTI(
"TypeRegistry::TypeTest(): dst ftype " << rTypeName<<
" src typeid " <<
typeid(rObject).name()
366 <<
" res " << (mit->second->Prototype()->Cast(&rObject) != 0));
367 return ( mit->second->Prototype()->Cast(&rObject) != 0 );
391 rTw.
WriteXmlComment(
"===================================================");
392 rTw.
WriteXmlComment(
"===================================================");
394 rTw.
WriteXmlComment(
"===================================================");
395 rTw.
WriteXmlComment(
"===================================================");
397 tit->second->Write(rTw);
423 FD_DREG(
"FunctionRegistry(): Construct singleton");
431 FD_DREG(
"FunctionRegistry::Clear()");
433 std::map<std::string, FunctionDefinition*>::iterator mit;
435 if(mit->second != NULL) {
436 FD_DREG(
"FunctionRegistry::Clear: removing " << mit->second->Name());
463#ifdef FAUDES_DEBUG_REGISTRY
465 FD_DREG(
"FunctionRegistry::Insert(): definition for " << pFunctionDef->
Name());
467 FD_DREG(
"FunctionRegistry::Insert(): fake entry for " << pFunctionDef->
Name());
472 std::stringstream err;
473 err <<
"Cannot overwrite existing entry with function " << pFunctionDef->
Name() << std::endl;
474 throw Exception(
"FunctionRegistry::Insert()", err.str(), 46);
477 if(pFunctionDef->
Name()==
"") {
478 std::stringstream err;
479 err <<
"Cannot have empty name"<< std::endl;
480 throw Exception(
"FunctionRegistry::Insert()", err.str(), 46);
492 FD_DREG(
"FunctionRegistry::MergeDocumentation(): using " << rTr.
FileName());
495 while(rTr.
Peek(token)) {
499 { rTr.
Get(token);
continue; }
501 { rTr.
Get(token);
continue; }
503 { rTr.
Get(token);
continue; }
506 size_t pos=ffunction.find(
"::");
507 if(pos!=std::string::npos) ffunction=ffunction.substr(pos+2);
512 fit->second->MergeDocumentation(rTr);
532 FD_DRTI(
"FunctionRegistry::NewFunction(\"" << rName <<
"\")");
535 std::stringstream err;
536 err <<
"Unknown function " << rName << std::endl;
537 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
539 Function* res=mit->second->NewFunction();
541 std::stringstream err;
542 err <<
"Failed to instatiate new " << rName << std::endl;
543 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
550 FD_DRTI(
"FunctionRegistry::NewFunction(prototype): typeid " <<
typeid(rFunction).name());
554 std::stringstream err;
555 err <<
"Unknown function by reference" << std::endl;
556 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
558 return(rFunction.
New());
563 FD_DRTI(
"FunctionRegistry::Definition( " << rName <<
" )");
566 std::stringstream err;
567 err <<
"Function not found: " << rName;
568 throw Exception(
"FunctionRegistry::Definition()", err.str(), 46);
570 return(*(mit->second));
575 FD_DRTI(
"FunctionRegistry::Definition(): typeid " <<
typeid(rFunction).name());
579 std::stringstream err;
580 err <<
"Function not found: " <<
typeid(rFunction).name();
581 throw Exception(
"FunctionRegistry::Definition()", err.str(), 46);
586 FD_DRTI(
"FunctionRegistry::Definition( " << rName <<
" )");
588 if(mit ==
End())
return nullptr;
594 FD_DRTI(
"FunctionRegistry::FunctionName(): typeid " <<
typeid(rFunction).name());
598 static const std::string empty(
"");
623 rTw.
WriteXmlComment(
"===================================================");
624 rTw.
WriteXmlComment(
"===================================================");
626 rTw.
WriteXmlComment(
"===================================================");
627 rTw.
WriteXmlComment(
"===================================================");
629 tit->second->
Write(rTw);
649 FD_DREG(
"LoadRegistry(" << rPath <<
")");
651 std::string rtipath = rPath;
652 if(rtipath==
"") rtipath=
"./libfaudes.rti";
658#ifndef FAUDES_MUTE_RTIAUTOLOAD
659 LoadRegisteredTypes();
664#ifdef FAUDES_PLUGINS_RTILOAD
665 FAUDES_PLUGINS_RTILOAD;
670#ifndef FAUDES_MUTE_RTIAUTOLOAD
671 LoadRegisteredFunctions();
680#ifndef FAUDES_MUTE_RTIAUTOLOAD
684 if(tit->second->PlugIn()!=
"IODevice")
685 if(tit->second->Prototype()==NULL)
686 FD_DREG(
"TypeRegistry: " << tit->second->Name() <<
" has no prototype");
691 if(fit->second->Prototype()==NULL)
692 FD_DREG(
"FunctionRegistry: " << fit->second->Name() <<
" has no prototype");
697 FD_DREG(
"LoadRegistry(" << rPath <<
"): done");
703 FD_DRTI(
"SaveRegistry(" << rPath <<
")");
virtual void MergeDocumentation(TokenReader &rTr)
const std::string & Name(void) const
const Function * Prototype(void) const
bool Exists(const std::string &rName) const
static FunctionRegistry * G()
std::map< std::string, FunctionDefinition * >::const_iterator Iterator
static FunctionRegistry * mpInstance
const FunctionDefinition & Definition(const std::string &rFunctionName) const
Function * NewFunction(const std::string &rFunctionName) const
virtual void DoWrite(TokenWriter &rTw, const std::string &rLabel="", const Type *pContext=0) const
void Insert(FunctionDefinition *pFunctionDef)
void MergeDocumentation(TokenReader &rTr)
std::map< std::string, FunctionDefinition * > mNameToFunctionDef
const std::string & FunctionName(const Function &rFunction) const
const FunctionDefinition * Definitionp(const std::string &rTypeName) const
std::map< std::string, FunctionDefinition * > mIdToFunctionDef
Iterator Begin(void) const
virtual Function * New() const =0
std::string FileName(void) const
std::string FileName(void) const
void WriteXmlComment(const std::string &rComment)
void Write(Token &rToken)
void WriteEnd(const std::string &rLabel)
void WriteBegin(const std::string &rLabel)
const std::string & StringValue(void) const
bool ExistsAttributeString(const std::string &name)
const std::string & AttributeStringValue(const std::string &name)
const Type * Prototype(void) const
Type * NewObject(const std::string &rTypeName) const
virtual void DoWrite(TokenWriter &rTw, const std::string &rLabel="", const Type *pContext=0) const
const std::string & TypeName(const Type &rType) const
void ElementTag(const std::string &rTypeName, const std::string &rTag)
void ElementType(const std::string &rTypeName, const std::string &rElementType)
const Type * Prototype(const std::string &rTypeName) const
std::map< std::string, TypeDefinition * > mIdToTypeDef
void MergeDocumentation(TokenReader &rTr)
const TypeDefinition & Definition(const std::string &rTypeName) const
static TypeRegistry * G()
static TypeRegistry * mpInstance
void Insert(TypeDefinition *pTypeDef)
std::map< std::string, TypeDefinition * >::const_iterator Iterator
void MergeDocumentation(const std::string &rFileName)
const TypeDefinition * Definitionp(const std::string &rTypeName) const
bool AutoRegistered(const std::string &rTypeName) const
Iterator Begin(void) const
virtual const std::string & TypeName(void) const
bool TypeTest(const std::string &rTypeName, const Type &rObject) const
std::map< std::string, TypeDefinition * > mNameToTypeDef
bool Exists(const std::string &rName) const
virtual Type * New(void) const
void Write(const Type *pContext=0) const
bool FaudesTypeTest(const std::string &rTypeName, const Type &rObject)
Function * NewFaudesFunction(const std::string &rFunctName)
const std::string & FaudesTypeName(const Type &rObject)
void SaveRegistry(const std::string &rPath)
Type * NewFaudesObject(const std::string &rTypeName)
void LoadRegistry(const std::string &rPath)
const std::string & FaudesFunctionName(const Function &rObject)