84 #define XMLPortParam(classname, paramname, loadfunction, savefunction, xmlelement, mode) \ 85 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 86 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 87 XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, classname, this, paramname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode) 104 #define XMLPortParamVariable(classname, paramname, variable, xmlelement, mode) \ 105 XMLPortVariableHelperClass xmlcontainer##variable##dummy(static_cast<void*>(&variable)); \ 106 static ExecutorMemberPtr<orxonox::XMLPortVariableHelperClass> xmlcontainer##variable##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(orxonox::XMLPortVariableHelperClass::getLoader(variable)), std::string( #classname ) + "::" + #variable + "loader"); \ 107 static ExecutorMemberPtr<orxonox::XMLPortVariableHelperClass> xmlcontainer##variable##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(orxonox::XMLPortVariableHelperClass::getSaver (variable)), std::string( #classname ) + "::" + #variable + "saver" ); \ 108 XMLPortParamGeneric(xmlcontainer##variable, classname, orxonox::XMLPortVariableHelperClass, &xmlcontainer##variable##dummy, paramname, xmlcontainer##variable##loadexecutor, xmlcontainer##variable##saveexecutor, xmlelement, mode) 121 #define XMLPortParamTemplate(classname, paramname, loadfunction, savefunction, xmlelement, mode, ...) \ 122 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor<void, classname, __VA_ARGS__ >(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 123 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 124 XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, classname, this, paramname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode) 140 #define XMLPortParamLoadOnly(classname, paramname, loadfunction, xmlelement, mode) \ 141 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##0##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 142 XMLPortParamGeneric(xmlcontainer##loadfunction##0, classname, classname, this, paramname, xmlcontainer##loadfunction##0##loadexecutor, 0, xmlelement, mode) 146 #define XMLPortParamLoadOnlyTemplate(classname, paramname, loadfunction, xmlelement, mode, ...) \ 147 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##0##loadexecutor = orxonox::createExecutor(orxonox::createFunctor<void, classname, __VA_ARGS__ >(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 148 XMLPortParamGeneric(xmlcontainer##loadfunction##0, classname, classname, this, paramname, xmlcontainer##loadfunction##0##loadexecutor, 0, xmlelement, mode) 174 #define XMLPortParamExtern(classname, externclass, object, paramname, loadfunction, savefunction, xmlelement, mode) \ 175 static ExecutorMemberPtr<externclass> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(&externclass::loadfunction), std::string( #externclass ) + "::" + #loadfunction); \ 176 static ExecutorMemberPtr<externclass> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&externclass::savefunction), std::string( #externclass ) + "::" + #savefunction); \ 177 XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, externclass, object, paramname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode); 181 #define XMLPortParamExternTemplate(classname, externclass, object, paramname, loadfunction, savefunction, xmlelement, mode, ...) \ 182 static ExecutorMemberPtr<externclass> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor<void, externclass, __VA_ARGS__ >(&externclass::loadfunction), std::string( #externclass ) + "::" + #loadfunction); \ 183 static ExecutorMemberPtr<externclass> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&externclass::savefunction), std::string( #externclass ) + "::" + #savefunction); \ 184 XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, externclass, object, paramname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode); 192 #define XMLPortParamGeneric(containername, classname, objectclass, object, paramname, loadexecutor, saveexecutor, xmlelement, mode) \ 193 orxonox::XMLPortClassParamContainer<objectclass>* containername = static_cast<orxonox::XMLPortClassParamContainer<objectclass>*>(ClassIdentifier<classname>::getIdentifier()->getXMLPortParamContainer(paramname)); \ 194 if (!containername) \ 196 containername = new orxonox::XMLPortClassParamContainer<objectclass>(std::string(paramname), ClassIdentifier<classname>::getIdentifier(), loadexecutor, saveexecutor); \ 197 ClassIdentifier<classname>::getIdentifier()->addXMLPortParamContainer(paramname, containername); \ 199 containername->port(orxonox_cast<BaseObject*>(this), object, xmlelement, mode) 272 #define XMLPortObjectExtended(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, mode, bApplyLoaderMask, bLoadBefore) \ 273 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 274 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 275 XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode, bApplyLoaderMask, bLoadBefore) 279 #define XMLPortObjectExtendedTemplate(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, mode, bApplyLoaderMask, bLoadBefore, ...) \ 280 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor<void, classname, __VA_ARGS__ >(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 281 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 282 XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode, bApplyLoaderMask, bLoadBefore) 290 #define XMLPortObject(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, mode) \ 291 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 292 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 293 XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode, false, true) 297 #define XMLPortObjectTemplate(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, mode, ...) \ 298 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##loadexecutor = orxonox::createExecutor(orxonox::createFunctor<void, classname, __VA_ARGS__ >(&classname::loadfunction), std::string( #classname ) + "::" + #loadfunction); \ 299 static ExecutorMemberPtr<classname> xmlcontainer##loadfunction##savefunction##saveexecutor = orxonox::createExecutor(orxonox::createFunctor(&classname::savefunction), std::string( #classname ) + "::" + #savefunction); \ 300 XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, xmlcontainer##loadfunction##savefunction##loadexecutor, xmlcontainer##loadfunction##savefunction##saveexecutor, xmlelement, mode, false, true) 308 #define XMLPortObjectGeneric(containername, classname, objectclass, sectionname, loadexecutor, saveexecutor, xmlelement, mode, bApplyLoaderMask, bLoadBefore) \ 309 orxonox::XMLPortClassObjectContainer<classname, objectclass>* containername = (orxonox::XMLPortClassObjectContainer<classname, objectclass>*)(ClassIdentifier<classname>::getIdentifier()->getXMLPortObjectContainer(sectionname)); \ 310 if (!containername) \ 312 containername = new orxonox::XMLPortClassObjectContainer<classname, objectclass>(std::string(sectionname), ClassIdentifier<classname>::getIdentifier(), loadexecutor, saveexecutor, bApplyLoaderMask, bLoadBefore); \ 313 ClassIdentifier<classname>::getIdentifier()->addXMLPortObjectContainer(sectionname, containername); \ 315 containername->port(this, xmlelement, mode) 330 waiting_for_default_values
335 { this->parseResult_ = ParseResult::not_started; }
339 {
return this->paramname_; }
342 { this->description_ = description;
return *
this; }
344 {
return this->description_; }
374 this->paramname_ = paramname;
375 this->identifier_ = identifier;
376 this->loadexecutor_ = loadexecutor;
377 this->saveexecutor_ = saveexecutor;
382 OrxAssert(owner,
"XMLPortParamContainer must have a BaseObject as owner.");
383 this->owner_ = owner;
384 this->parseParams_.object = object;
386 this->parseParams_.mode = mode;
392 if (this->owner_->lastLoadedXMLElement_ != &xmlelement)
394 this->owner_->xmlAttributes_.clear();
396 ticpp::Attribute* attribute = xmlelement.FirstAttribute(
false);
397 while (attribute !=
nullptr)
399 this->owner_->xmlAttributes_[
getLowercase(attribute->Name())] = attribute->Value();
400 attribute = attribute->Next(
false);
402 this->owner_->lastLoadedXMLElement_ = &
xmlelement;
404 std::map<std::string, std::string>::const_iterator it = this->owner_->xmlAttributes_.find(
getLowercase(this->paramname_));
406 if (it != this->owner_->xmlAttributes_.end())
407 attributeValue = it->second;
411 if ((!attributeValue.empty()) || ((mode !=
XMLPort::ExpandObject) && this->loadexecutor_->allDefaultValuesSet()))
413 orxout(
verbose_more, context::xml) << this->owner_->getLoaderIndentation() <<
"Loading parameter " << this->paramname_ <<
" in " << this->identifier_->getName() <<
" (objectname " << this->owner_->getName() <<
")." << endl;
415 this->loadexecutor_->parse(
object, attributeValue, &error,
",");
417 this->parseResult_ = ParseResult::finished;
419 this->parseResult_ = ParseResult::waiting_for_default_values;
422 this->parseResult_ = ParseResult::finished;
424 this->parseResult_ = ParseResult::waiting_for_default_values;
426 catch (ticpp::Exception& ex)
429 orxout(
internal_error, context::xml) <<
"An error occurred in XMLPort.h while loading attribute '" << this->paramname_ <<
"' of '" << this->identifier_->getName() <<
"' (objectname: " << this->owner_->getName() <<
") in " << this->owner_->getFilename() <<
':' << endl;
435 if (this->saveexecutor_)
451 if (result == ParseResult::waiting_for_default_values)
452 return this->port(this->owner_, params);
459 if (!this->loadexecutor_->defaultValueSet(index))
460 this->loadexecutor_->setDefaultValue(index, param);
461 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
465 if (!this->loadexecutor_->defaultValueSet(0))
466 this->loadexecutor_->setDefaultValues(param1);
467 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
471 if ((!this->loadexecutor_->defaultValueSet(0)) || (!this->loadexecutor_->defaultValueSet(1)))
472 this->loadexecutor_->setDefaultValues(param1, param2);
473 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
477 if ((!this->loadexecutor_->defaultValueSet(0)) || (!this->loadexecutor_->defaultValueSet(1)) || (!this->loadexecutor_->defaultValueSet(2)))
478 this->loadexecutor_->setDefaultValues(param1, param2, param3);
479 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
483 if ((!this->loadexecutor_->defaultValueSet(0)) || (!this->loadexecutor_->defaultValueSet(1)) || (!this->loadexecutor_->defaultValueSet(2)) || (!this->loadexecutor_->defaultValueSet(3)))
484 this->loadexecutor_->setDefaultValues(param1, param2, param3, param4);
485 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
489 if ((!this->loadexecutor_->defaultValueSet(0)) || (!this->loadexecutor_->defaultValueSet(1)) || (!this->loadexecutor_->defaultValueSet(2)) || (!this->loadexecutor_->defaultValueSet(3)) || (!this->loadexecutor_->defaultValueSet(4)))
490 this->loadexecutor_->setDefaultValues(param1, param2, param3, param4, param5);
491 return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
508 { this->bApplyLoaderMask_ =
false; }
516 {
return this->sectionname_; }
519 { this->description_ = description;
return *
this; }
521 {
return this->description_; }
523 bool identifierIsIncludedInLoaderMask(
const Identifier* identifier);
534 template <
class T,
class O>
540 this->sectionname_ = sectionname;
541 this->identifier_ = identifier;
544 this->loadexecutor_ = loadexecutor;
545 this->saveexecutor_ = saveexecutor;
546 this->bApplyLoaderMask_ = bApplyLoaderMask;
547 this->bLoadBefore_ = bLoadBefore;
555 assert(castNewObject);
557 (*this->loadexecutor_)(castObject, castNewObject);
587 { *
static_cast<T*
>(this->variable_) = value; }
591 {
return *
static_cast<T*
>(this->variable_); }
595 {
return &XMLPortVariableHelperClass::load<T>; }
599 {
return &XMLPortVariableHelperClass::save<T>; }
The BaseObject is the parent of all classes representing an instance in the game. ...
Definition: BaseObject.h:63
Definition: CorePrereqs.h:105
The ClassIdentifier is derived from Identifier and holds all class-specific functions and variables t...
Definition: Identifier.h:262
Definition: InputPrereqs.h:82
Definition: XMLPort.h:323
XMLPortVariableHelperClass(void *var)
Definition: XMLPort.h:580
Definition: CorePrereqs.h:241
ExecutorMemberPtr< T > saveexecutor_
Definition: XMLPort.h:496
XMLPortObjectContainer & description(const std::string &description)
Definition: XMLPort.h:518
void error(const std::string &text)
Prints output with error level.
Definition: ConsoleCommandCompilation.cc:145
XMLPortParamContainer & description(const std::string &description)
Definition: XMLPort.h:341
const T & save()
Definition: XMLPort.h:590
Identifier * objectIdentifier_
Definition: XMLPort.h:530
virtual XMLPortParamContainer & defaultValues(const MultiType ¶m1, const MultiType ¶m2, const MultiType ¶m3, const MultiType ¶m4, const MultiType ¶m5) override
Definition: XMLPort.h:487
const std::string & getName() const
Definition: XMLPort.h:338
bool bLoadBefore_
Definition: XMLPort.h:528
std::string description_
Definition: XMLPort.h:358
Shared library macros, enums, constants and forward declarations for the core library ...
::std::string string
Definition: gtest-port.h:756
Element * xmlelement
Definition: XMLPort.h:367
XMLPortClassParamContainer(const std::string ¶mname, Identifier *identifier, const ExecutorMemberPtr< T > &loadexecutor, const ExecutorMemberPtr< T > &saveexecutor)
Definition: XMLPort.h:372
XMLPortParamContainer & portIfWaitingForDefaultValues(const ParseResult &result, const ParseParams ¶ms)
Definition: XMLPort.h:449
bool bApplyLoaderMask_
Definition: XMLPort.h:527
Definition: CorePrereqs.h:107
XMLPort::Mode mode
Definition: XMLPort.h:368
ExecutorMemberPtr< T > saveexecutor_
Definition: XMLPort.h:562
Output level, used for error messages which are important for developers.
Definition: OutputDefinitions.h:95
Declaration of Identifier, definition of ClassIdentifier<T>; used to identify the class of an object...
Helper class to load and save simple variables with XMLPort.
Definition: XMLPort.h:577
typedef void(ENET_CALLBACK *ENetPacketFreeCallback)(struct _ENetPacket *)
Identifier * identifier_
Definition: XMLPort.h:529
std::string getLowercase(const std::string &str)
Returns a copy of the given string where all chars are converted to lowercase.
Definition: StringUtils.cc:342
XMLPortParamContainer & port(BaseObject *owner, T *object, Element &xmlelement, XMLPort::Mode mode)
Definition: XMLPort.h:380
static ClassIdentifier< T > * getIdentifier()
Returns the only instance of this class.
Definition: Identifier.h:329
BaseObject * owner_
Definition: XMLPort.h:357
#define OrxAssert(condition, errorMessage)
Run time assertion like assert(), but with an embedded message.
Definition: OrxAssert.h:54
Declaration of facilities to handle exceptions.
const std::string & getName() const
Definition: XMLPort.h:515
Definition: XMLPort.h:504
xmlelement
Definition: Super.h:519
const std::string & getDescription() const
Definition: XMLPort.h:520
void load(const T &value)
Definition: XMLPort.h:586
ExecutorMemberPtr< T > loadexecutor_
Definition: XMLPort.h:561
false defaultValue(2, false).argumentCompleter(0
void * variable_
Definition: XMLPort.h:602
T * object
Definition: XMLPort.h:366
std::string paramname_
Definition: XMLPort.h:354
ParseParams parseParams_
Definition: XMLPort.h:497
static const T &(XMLPortVariableHelperClass::*)() getSaver(const T &var)
Definition: XMLPort.h:598
Declaration of the orxonox::Executor class and the createExecutor() functions.
virtual XMLPortParamContainer & defaultValues(const MultiType ¶m1, const MultiType ¶m2, const MultiType ¶m3) override
Definition: XMLPort.h:475
Definition: CorePrereqs.h:106
std::string sectionname_
Definition: XMLPort.h:526
OutputStream & orxout(OutputLevel level=level::debug_output, const OutputContextContainer &context=context::undefined())
This helper function returns a reference to a commonly used instance of OutputStream.
Definition: Output.h:81
Die Wagnis Klasse hat die folgenden Aufgaben:
Definition: ApplicationPaths.cc:66
bool isA(const Identifier *identifier) const
Returns true, if the Identifier is at least of the given type.
Definition: Identifier.cc:316
Declaration of the MultiType and some helper constructs.
#define _CoreExport
Definition: CorePrereqs.h:61
Mode
Definition: CorePrereqs.h:102
The MultiType can hold a value of many possible types and convert them to other types.
Definition: MultiType.h:130
The Identifier is used to identify the class of an object and to store information about the class...
Definition: Identifier.h:109
Defines the helper function orxout() and includes all necessary headers to use the output system...
ORX_FORCEINLINE T orxonox_cast(U *source)
Casts on object of type Identifiable to any derived type that is registered in the class hierarchy...
Definition: Identifier.h:485
XMLPortObjectContainer()
Definition: XMLPort.h:507
virtual XMLPortParamContainer & defaultValues(const MultiType ¶m1, const MultiType ¶m2) override
Definition: XMLPort.h:469
ExecutorMemberPtr< T > loadexecutor_
Definition: XMLPort.h:495
std::string description_
Definition: XMLPort.h:531
Definition: InputPrereqs.h:78
Declaration of BaseObject, the base class of all objects in Orxonox.
virtual XMLPortParamContainer & defaultValue(unsigned int index, const MultiType ¶m) override
Definition: XMLPort.h:457
Output level, usually not visible, used for unimportant debug information (less important than verbos...
Definition: OutputDefinitions.h:100
virtual void callLoadExecutor(BaseObject *object, BaseObject *newObject) override
Definition: XMLPort.h:550
Declaration of several string manipulation functions, used in many parts of the game.
virtual ~XMLPortVariableHelperClass()
Definition: XMLPort.h:583
std::shared_ptr< ExecutorMember< T >> ExecutorMemberPtr
Definition: ExecutorPtr.h:58
XMLPortClassObjectContainer(const std::string §ionname, Identifier *identifier, const ExecutorMemberPtr< T > &loadexecutor, const ExecutorMemberPtr< T > &saveexecutor, bool bApplyLoaderMask, bool bLoadBefore)
Definition: XMLPort.h:538
ParseResult
Definition: XMLPort.h:326
const std::string & getDescription() const
Definition: XMLPort.h:343
virtual XMLPortParamContainer & defaultValues(const MultiType ¶m1) override
Definition: XMLPort.h:463
Definition: XMLPort.h:364
static void(XMLPortVariableHelperClass::*)(const T &value) getLoader(const T &var)
Definition: XMLPort.h:594
Definition: CorePrereqs.h:243
virtual XMLPortParamContainer & defaultValues(const MultiType ¶m1, const MultiType ¶m2, const MultiType ¶m3, const MultiType ¶m4) override
Definition: XMLPort.h:481
Declaration of custom assertion facilities
ParseResult parseResult_
Definition: XMLPort.h:355
Identifier * identifier_
Definition: XMLPort.h:356
XMLPortParamContainer & port(BaseObject *owner, const ParseParams &parseParams)
Definition: XMLPort.h:444
XMLPortParamContainer()
Definition: XMLPort.h:334