28#ifndef FAUDES_MUTE_RTIAUTOLOAD
35#include "allplugins.h"
36#include "rtiautoload.h"
37#include "rtiautoload.cpp"
71 FD_DREG(
"TypeRegistry(): Constrtuct singleton");
79 FD_DREG(
"TypeRegistry::Clear(): begin with #" <<
Size());
81 std::map<std::string, TypeDefinition*>::iterator mit;
83 if(mit->second != NULL)
84 if(!mit->second->AutoRegistered()){
88 if(mit->second != NULL)
89 if(mit->second->AutoRegistered()){
90 FD_DREG(
"TypeRegistry::Clear(): detect autoreg " << mit->second->Name());
94 std::map<std::string, TypeDefinition*>::iterator dit;
104 FD_DREG(
"TypeRegistry::Clear(): keeping " << ptdef->
Name());
113 FD_DREG(
"TypeRegistry::ClearAll()");
115 std::map<std::string, TypeDefinition*>::iterator mit;
117 if(mit->second != NULL){
144 FD_DREG(
"TypeRegistry::Insert(): type name " << pTypeDef->
Name());
151 if((pt!=0) && (opt!=0))
152 if(
typeid(*pt).name() ==
typeid(*opt).name()) {
153 FD_DREG(
"TypeRegistry::Insert(): ignoring doublet " << pTypeDef->
Name());
159 std::stringstream err;
160 err <<
"Cannot overwrite existing entry with type " << pTypeDef->
Name() << std::endl;
161 throw Exception(
"TypeRegistry::Insert()", err.str(), 46);
164 if(pTypeDef->
Name()==
"") {
165 std::stringstream err;
166 err <<
"Cannot have empty name"<< std::endl;
167 throw Exception(
"TypeRegistry::Insert()", err.str(), 46);
180 FD_DV(
"TypeRegistry::MergeDocumentation(): using " << rTr.
FileName());
183 while(rTr.
Peek(token)) {
185 if(!token.
IsBegin(
"TypeDefinition")) { rTr.
Get(token);
continue; }
189 size_t pos=ftype.find(
"::");
190 if(pos!=std::string::npos) ftype=ftype.substr(pos+2);
191 FD_DRTI(
"TypeRegistry::MergeDocumentation(): " << ftype);
196 tit->second->MergeDocumentation(rTr);
215 FD_DREG(
"TypeRegistry::ElementTag("<<rTypeName<<
","<<rTag<<
")");
217 if(mit ==
End())
return;
218 mit->second->ElementTag(rTag);
225 static std::string estr=
"";
226 if(mit ==
End())
return estr;
227 return mit->second->ElementTag();
233 if(mit ==
End())
return;
234 mit->second->ElementType(rType);
240 static std::string estr=
"";
241 if(mit ==
End())
return estr;
242 return mit->second->ElementType();
249 FD_DREG(
"TypeRegistry::AutoRegistered(...): cannot access definition for faudes type " << rTypeName);
252 mit->second->AutoRegistered(flag);
258 if(mit ==
End())
return false;
259 return mit->second->AutoRegistered();
265 FD_DRTI(
"TypeRegistry::NewObject(\"" << rName <<
"\")");
268 std::stringstream err;
269 err <<
"Unknown Type " << rName << std::endl;
270 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
272 Type* res=mit->second->NewObject();
274 std::stringstream err;
275 err <<
"Failed to instatiate new " << rName << std::endl;
276 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
283 FD_DRTI(
"TypeRegistry::NewObject(prototype): typeid " <<
typeid(rType).name());
287 std::stringstream err;
288 err <<
"Unknown type by reference" << std::endl;
289 throw Exception(
"TypeRegistry::NewObject()", err.str(), 47);
296 FD_DRTI(
"TypeRegistry::Definition( " << rName <<
" )");
299 std::stringstream err;
300 err <<
"Type not found: \"" << rName <<
"\"";
301 throw Exception(
"TypeRegistry::Definition()", err.str(), 46);
303 return(*(mit->second));
308 FD_DRTI(
"TypeRegistry::Definition(): typeid " <<
typeid(rType).name());
312 std::stringstream err;
313 err <<
"Type not found: " <<
typeid(rType).name();
314 throw Exception(
"TypeRegistry::Definition()", err.str(), 46);
319 FD_DRTI(
"TypeRegistry::Definitionp( " << rName <<
" )");
321 if(mit ==
End())
return NULL;
327 FD_DRTI(
"TypeRegistry::Definitionp(): for typeid " <<
typeid(rType).name());
331 FD_DRTI(
"TypeRegistry::Definitionp(): not found");
335 FD_DRTI(
"TypeRegistry::Definitionp(): found faudes type " << fdp->
Name());
341 FD_DRTI(
"TypeRegistry::Prototype( " << rName <<
" )");
343 if(mit ==
End())
return 0;
344 return(mit->second->Prototype());
349 FD_DRTI(
"TypeRegistry::TypeName(): typeid " <<
typeid(rType).name());
353 static std::string empty(
"");
359 FD_DRTI(
"TypeRegistry::TypeTest(): typeid " <<
typeid(rObject).name());
361 if(mit ==
End())
return false;
362 if(!mit->second->Prototype())
return false;
363 FD_DRTI(
"TypeRegistry::TypeTest(): dst ftype " << rTypeName<<
" src typeid " <<
typeid(rObject).name()
364 <<
" res " << (mit->second->Prototype()->Cast(&rObject) != 0));
365 return ( mit->second->Prototype()->Cast(&rObject) != 0 );
389 rTw.
WriteXmlComment(
"===================================================");
390 rTw.
WriteXmlComment(
"===================================================");
392 rTw.
WriteXmlComment(
"===================================================");
393 rTw.
WriteXmlComment(
"===================================================");
395 tit->second->Write(rTw);
421 FD_DREG(
"FunctionRegistry(): Construct singleton");
429 FD_DREG(
"FunctionRegistry::Clear()");
431 std::map<std::string, FunctionDefinition*>::iterator mit;
433 if(mit->second != NULL) {
434 FD_DREG(
"FunctionRegistry::Clear: removing " << mit->second->Name());
461#ifdef FAUDES_DEBUG_REGISTRY
463 FD_DREG(
"FunctionRegistry::Insert(): definition for " << pFunctionDef->
Name());
465 FD_DREG(
"FunctionRegistry::Insert(): fake entry for " << pFunctionDef->
Name());
470 std::stringstream err;
471 err <<
"Cannot overwrite existing entry with function " << pFunctionDef->
Name() << std::endl;
472 throw Exception(
"FunctionRegistry::Insert()", err.str(), 46);
475 if(pFunctionDef->
Name()==
"") {
476 std::stringstream err;
477 err <<
"Cannot have empty name"<< std::endl;
478 throw Exception(
"FunctionRegistry::Insert()", err.str(), 46);
490 FD_DREG(
"FunctionRegistry::MergeDocumentation(): using " << rTr.
FileName());
493 while(rTr.
Peek(token)) {
497 { rTr.
Get(token);
continue; }
499 { rTr.
Get(token);
continue; }
501 { rTr.
Get(token);
continue; }
504 size_t pos=ffunction.find(
"::");
505 if(pos!=std::string::npos) ffunction=ffunction.substr(pos+2);
510 fit->second->MergeDocumentation(rTr);
530 FD_DRTI(
"FunctionRegistry::NewFunction(\"" << rName <<
"\")");
533 std::stringstream err;
534 err <<
"Unknown function " << rName << std::endl;
535 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
537 Function* res=mit->second->NewFunction();
539 std::stringstream err;
540 err <<
"Failed to instatiate new " << rName << std::endl;
541 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
548 FD_DRTI(
"FunctionRegistry::NewFunction(prototype): typeid " <<
typeid(rFunction).name());
552 std::stringstream err;
553 err <<
"Unknown function by reference" << std::endl;
554 throw Exception(
"FunctionRegistry::NewFunction()", err.str(), 47);
556 return(rFunction.
New());
561 FD_DRTI(
"FunctionRegistry::Definition( " << rName <<
" )");
564 std::stringstream err;
565 err <<
"Function not found: " << rName;
566 throw Exception(
"FunctionRegistry::Definition()", err.str(), 46);
568 return(*(mit->second));
573 FD_DRTI(
"FunctionRegistry::Definition(): typeid " <<
typeid(rFunction).name());
577 std::stringstream err;
578 err <<
"Function not found: " <<
typeid(rFunction).name();
579 throw Exception(
"FunctionRegistry::Definition()", err.str(), 46);
584 FD_DRTI(
"FunctionRegistry::Definition( " << rName <<
" )");
586 if(mit ==
End())
return nullptr;
592 FD_DRTI(
"FunctionRegistry::FunctionName(): typeid " <<
typeid(rFunction).name());
596 static const std::string empty(
"");
621 rTw.
WriteXmlComment(
"===================================================");
622 rTw.
WriteXmlComment(
"===================================================");
624 rTw.
WriteXmlComment(
"===================================================");
625 rTw.
WriteXmlComment(
"===================================================");
627 tit->second->
Write(rTw);
647 FD_DREG(
"LoadRegistry(" << rPath <<
")");
649 std::string rtipath = rPath;
650 if(rtipath==
"") rtipath=
"./libfaudes.rti";
656#ifndef FAUDES_MUTE_RTIAUTOLOAD
657 LoadRegisteredTypes();
662#ifdef FAUDES_PLUGINS_RTILOAD
663 FAUDES_PLUGINS_RTILOAD;
668#ifndef FAUDES_MUTE_RTIAUTOLOAD
669 LoadRegisteredFunctions();
678#ifndef FAUDES_MUTE_RTIAUTOLOAD
682 if(tit->second->PlugIn()!=
"IODevice")
683 if(tit->second->Prototype()==NULL)
684 FD_DREG(
"TypeRegistry: " << tit->second->Name() <<
" has no prototype");
689 if(fit->second->Prototype()==NULL)
690 FD_DREG(
"FunctionRegistry: " << fit->second->Name() <<
" has no prototype");
695 FD_DREG(
"LoadRegistry(" << rPath <<
"): done");
701 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
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)