Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Mar 27, 2008, 5:04:41 PM (17 years ago)
Author:
landauf
Message:

XMLPort uses now executors and has default-values.

Location:
code/branches/core2/src/orxonox/core
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • code/branches/core2/src/orxonox/core/Executor.cc

    r932 r933  
    8181            else
    8282            {
    83                 COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     83                COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << temp << ")." << std::endl;
    8484                return false;
    8585            }
     
    9393                if (!this->bAddedDefaultValue_[i])
    9494                {
    95                     COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     95                    COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input:" << params << ")." << std::endl;
    9696                    return false;
    9797                }
     
    151151    }
    152152
    153     void Executor::description(const std::string& description)
     153    void Executor::setDescription(const std::string& description)
    154154    {
    155155        if (!this->bAddedDescription_)
     
    166166    }
    167167
    168     void Executor::descriptionParam(int param, const std::string& description)
     168    void Executor::setDescriptionParam(int param, const std::string& description)
    169169    {
    170170        if (param >= 0 && param < MAX_FUNCTOR_ARGUMENTS)
     
    191191    }
    192192
    193     void Executor::descriptionReturnvalue(const std::string& description)
     193    void Executor::setDescriptionReturnvalue(const std::string& description)
    194194    {
    195195        if (!this->bAddedDescriptionReturnvalue_)
     
    256256    }
    257257
    258     void Executor::setDefaultValue(int index, const MultiTypeMath& param)
     258    void Executor::setDefaultValue(unsigned int index, const MultiTypeMath& param)
    259259    {
    260260        if (index >= 0 && index < MAX_FUNCTOR_ARGUMENTS)
     
    264264        }
    265265    }
     266
     267    bool Executor::allDefaultValuesSet() const
     268    {
     269        for (unsigned int i = 0; i < this->functor_->getParamCount(); i++)
     270            if (!this->bAddedDefaultValue_[i])
     271                return false;
     272
     273        return true;
     274    }
    266275}
  • code/branches/core2/src/orxonox/core/Executor.h

    r932 r933  
    6262            const std::string& getName() const;
    6363
    64             void description(const std::string& description);
     64            void setDescription(const std::string& description);
    6565            const std::string& getDescription() const;
    6666
    67             void descriptionParam(int param, const std::string& description);
     67            void setDescriptionParam(int param, const std::string& description);
    6868            const std::string& getDescriptionParam(int param) const;
    6969
    70             void descriptionReturnvalue(const std::string& description);
     70            void setDescriptionReturnvalue(const std::string& description);
    7171            const std::string& getDescriptionReturnvalue(int param) const;
    7272
     
    8989            void setDefaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4);
    9090            void setDefaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4, const MultiTypeMath& param5);
    91             void setDefaultValue(int index, const MultiTypeMath& param);
     91            void setDefaultValue(unsigned int index, const MultiTypeMath& param);
     92
     93            bool allDefaultValuesSet() const;
    9294
    9395        protected:
    9496            Functor* functor_;
     97            std::string name_;
     98            MultiTypeMath defaultValue_[MAX_FUNCTOR_ARGUMENTS];
     99            bool bAddedDefaultValue_[MAX_FUNCTOR_ARGUMENTS];
    95100
    96101        private:
    97             std::string name_;
    98 
    99102            LanguageEntryLabel description_;
    100103            LanguageEntryLabel descriptionReturnvalue_;
     
    104107            bool bAddedDescriptionReturnvalue_;
    105108            bool bAddedDescriptionParam_[MAX_FUNCTOR_ARGUMENTS];
    106 
    107             MultiTypeMath defaultValue_[MAX_FUNCTOR_ARGUMENTS];
    108             bool bAddedDefaultValue_[MAX_FUNCTOR_ARGUMENTS];
    109109    };
    110110
     
    155155                { ((FunctorMember<T>*)this->functor_)->setObject(object); }
    156156
    157             bool parse(T* object, const std::string& params, const std::string& delimiter) const
     157            bool parse(T* object, const std::string& params, const std::string& delimiter = " ") const
    158158            {
    159159                unsigned int paramCount = this->functor_->getParamCount();
     
    179179                    else
    180180                    {
    181                         COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     181                        COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << temp << ")." << std::endl;
    182182                        return false;
    183183                    }
     
    191191                        if (!this->bAddedDefaultValue_[i])
    192192                        {
    193                             COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     193                            COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input:" << params << ")." << std::endl;
    194194                            return false;
    195195                        }
     
    239239            }
    240240
    241             bool parse(const T* object, const std::string& params, const std::string& delimiter) const
     241            bool parse(const T* object, const std::string& params, const std::string& delimiter = " ") const
    242242            {
    243243                unsigned int paramCount = this->functor_->getParamCount();
     
    263263                    else
    264264                    {
    265                         COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     265                        COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input: " << temp << ")." << std::endl;
    266266                        return false;
    267267                    }
     
    275275                        if (!this->bAddedDefaultValue_[i])
    276276                        {
    277                             COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given." << std::endl;
     277                            COUT(2) << "Warning: Can't call executor " << this->name_ << " through parser: Not enough parameters or default values given (input:" << params << ")." << std::endl;
    278278                            return false;
    279279                        }
     
    323323            }
    324324    };
     325
     326    inline Executor* createExecutor(Functor* functor, const std::string& name = "")
     327    {
     328        return new Executor(functor, name);
     329    }
     330
     331    template <class T>
     332    inline ExecutorMember<T>* createExecutor(FunctorMember<T>* functor, const std::string& name = "")
     333    {
     334        return new ExecutorMember<T>(functor, name);
     335    }
     336
     337    inline ExecutorStatic* createExecutor(FunctorStatic* functor, const std::string& name = "")
     338    {
     339        return new ExecutorStatic(functor, name);
     340    }
    325341}
    326342
  • code/branches/core2/src/orxonox/core/XMLPort.cc

    r878 r933  
    3434namespace orxonox
    3535{
    36     // ###############################
    37     // ###  XMLPortParamContainer  ###
    38     // ###############################
    39     XMLPortParamContainer::XMLPortParamContainer()
    40     {
    41         this->bAddedDescription_ = false;
    42         this->bAddedDefaultValues_ = false;
    43     }
    44 
    45     XMLPortParamContainer& XMLPortParamContainer::description(const std::string description)
    46     {
    47         if (!this->bAddedDescription_)
    48         {
    49             this->description_ = std::string("XMLPortParamContainer::" + this->classname_ + "::" + this->paramname_);
    50             AddLanguageEntry(this->description_, description);
    51             this->bAddedDescription_ = true;
    52         }
    53 
    54         return (*this);
    55     }
    56 
    57     const std::string& XMLPortParamContainer::getDescription()
    58     {
    59         return GetLocalisation(this->description_);
    60     }
    61 
    62 
    6336    // ################################
    6437    // ###  XMLPortObjectContainer  ###
    6538    // ################################
    66     XMLPortObjectContainer::XMLPortObjectContainer()
    67     {
    68         this->bAddedDescription_ = false;
    69         this->bApplyLoaderMask_ = false;
    70     }
    71 
    72     XMLPortObjectContainer& XMLPortObjectContainer::description(const std::string description)
    73     {
    74         if (!this->bAddedDescription_)
    75         {
    76             this->description_ = std::string("XMLPortObjectContainer::" + this->classname_ + "::" + this->sectionname_);
    77             AddLanguageEntry(this->description_, description);
    78             this->bAddedDescription_ = true;
    79         }
    80 
    81         return (*this);
    82     }
    83 
    84     const std::string& XMLPortObjectContainer::getDescription()
    85     {
    86         return GetLocalisation(this->description_);
    87     }
    88 
    8939    bool XMLPortObjectContainer::identifierIsIncludedInLoaderMask(const Identifier* identifier)
    9040    {
  • code/branches/core2/src/orxonox/core/XMLPort.h

    r931 r933  
    3333#include "util/tinyxml/ticpp.h"
    3434#include "util/SubString.h"
    35 #include "Functor.h"
     35#include "Executor.h"
    3636#include "Debug.h"
    3737#include "CoreIncludes.h"
     
    4141
    4242
    43 #define XMLPortParam(classname, paramname, loadfunction, savefunction, xmlelement, loading) \
    44     XMLPortParamGeneric(classname, paramname, xmlcontainer##loadfunction##savefunction, createFunctor(&classname::loadfunction), createFunctor(&classname::savefunction), xmlelement, loading)
    45 #define XMLPortParam_Template(classname, paramname, loadtemplate, loadfunction, savetemplate, savefunction, xmlelement, loading) \
    46     XMLPortParamGeneric(classname, paramname, xmlcontainer##loadfunction##savefunction, createFunctor loadtemplate (&classname::loadfunction), createFunctor savetemplate (&classname::savefunction), xmlelement, loading)
    47 
    48 
    49 #define XMLPortParamLoadOnly(classname, paramname, loadfunction, xmlelement, loading) \
    50     XMLPortParamGeneric(classname, paramname, xmlcontainer##loadfunction##0, createFunctor(&classname::loadfunction), 0, xmlelement, loading)
    51 #define XMLPortParamLoadOnly_Template(classname, paramname, loadtemplate, loadfunction, xmlelement, loading) \
    52     XMLPortParamGeneric(classname, paramname, xmlcontainer##loadfunction##0, createFunctor loadtemplate (&classname::loadfunction), 0, xmlelement, loading)
    53 
    54 
    55 #define XMLPortParamGeneric(classname, paramname, containername, loadfunctor, savefunctor, xmlelement, loading) \
     43#define XMLPortParam(classname, paramname, loadfunction, savefunction, xmlelement, mode) \
     44    XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, paramname, createExecutor(createFunctor(&classname::loadfunction), #loadfunction), createExecutor(createFunctor(&classname::savefunction), #savefunction), xmlelement, mode)
     45#define XMLPortParam_Template(classname, paramname, loadtemplate, loadfunction, savetemplate, savefunction, xmlelement, mode) \
     46    XMLPortParamGeneric(xmlcontainer##loadfunction##savefunction, classname, paramname, createExecutor(createFunctor loadtemplate (&classname::loadfunction), #loadfunction), createExecutor(createFunctor savetemplate (&classname::savefunction), #savefunction), xmlelement, mode)
     47
     48#define XMLPortParamLoadOnly(classname, paramname, loadfunction, xmlelement, mode) \
     49    XMLPortParamGeneric(xmlcontainer##loadfunction##0, classname, paramname, createExecutor(createFunctor(&classname::loadfunction), #loadfunction), 0, xmlelement, mode)
     50#define XMLPortParamLoadOnly_Template(classname, paramname, loadtemplate, loadfunction, xmlelement, mode) \
     51    XMLPortParamGeneric(xmlcontainer##loadfunction##0, classname, paramname, createExecutor(createFunctor loadtemplate (&classname::loadfunction), #loadfunction), 0, xmlelement, mode)
     52
     53#define XMLPortParamGeneric(containername, classname, paramname, loadexecutor, saveexecutor, xmlelement, mode) \
    5654    orxonox::XMLPortClassParamContainer<classname>* containername = (orxonox::XMLPortClassParamContainer<classname>*)(this->getIdentifier()->getXMLPortParamContainer(paramname)); \
    5755    if (!containername) \
    5856    { \
    59         containername = new orxonox::XMLPortClassParamContainer<classname>(this->getIdentifier()->getName(), std::string(paramname), loadfunctor, savefunctor); \
     57        containername = new orxonox::XMLPortClassParamContainer<classname>(std::string(paramname), loadexecutor, saveexecutor); \
    6058        this->getIdentifier()->addXMLPortParamContainer(paramname, containername); \
    6159    } \
    62     containername->port(this, xmlelement, loading)
    63 
    64 
    65 #define XMLPortObject(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, loading, bApplyLoaderMask, bLoadBefore) \
    66     orxonox::XMLPortClassObjectContainer<classname, objectclass>* xmlcontainer##loadfunction##savefunction = (orxonox::XMLPortClassObjectContainer<classname, objectclass>*)(this->getIdentifier()->getXMLPortObjectContainer(sectionname)); \
    67     if (!xmlcontainer##loadfunction##savefunction) \
     60    containername->port(this, xmlelement, mode)
     61
     62
     63#define XMLPortObject(classname, objectclass, sectionname, loadfunction, savefunction, xmlelement, mode, bApplyLoaderMask, bLoadBefore) \
     64    XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, createExecutor(createFunctor(&classname::loadfunction), #loadfunction), createExecutor(createFunctor(&classname::savefunction), #savefunction), xmlelement, mode, bApplyLoaderMask, bLoadBefore)
     65#define XMLPortObject_Template(classname, objectclass, sectionname, loadtemplate, loadfunction, savetemplate, savefunction, xmlelement, mode, bApplyLoaderMask, bLoadBefore) \
     66    XMLPortObjectGeneric(xmlcontainer##loadfunction##savefunction, classname, objectclass, sectionname, createExecutor(createFunctor loadtemplate (&classname::loadfunction), #loadfunction), createExecutor(createFunctor savetemplate (&classname::savefunction), #savefunction), xmlelement, mode, bApplyLoaderMask, bLoadBefore)
     67
     68#define XMLPortObjectGeneric(containername, classname, objectclass, sectionname, loadexecutor, saveexecutor, xmlelement, mode, bApplyLoaderMask, bLoadBefore) \
     69    orxonox::XMLPortClassObjectContainer<classname, objectclass>* containername = (orxonox::XMLPortClassObjectContainer<classname, objectclass>*)(this->getIdentifier()->getXMLPortObjectContainer(sectionname)); \
     70    if (!containername) \
    6871    { \
    69         xmlcontainer##loadfunction##savefunction = new orxonox::XMLPortClassObjectContainer<classname, objectclass>(this->getIdentifier()->getName(), std::string(sectionname), &classname::loadfunction, &classname::savefunction, bApplyLoaderMask, bLoadBefore); \
    70         this->getIdentifier()->addXMLPortObjectContainer(sectionname, xmlcontainer##loadfunction##savefunction); \
     72        containername = new orxonox::XMLPortClassObjectContainer<classname, objectclass>(std::string(sectionname), loadexecutor, saveexecutor, bApplyLoaderMask, bLoadBefore); \
     73        this->getIdentifier()->addXMLPortObjectContainer(sectionname, containername); \
    7174    } \
    72     xmlcontainer##loadfunction##savefunction->port(this, xmlelement, loading)
     75    containername->port(this, xmlelement, mode)
    7376
    7477
     
    9396    class _CoreExport XMLPortParamContainer
    9497    {
     98        enum ParseResult
     99        {
     100            PR_not_started,
     101            PR_finished,
     102            PR_waiting_for_default_values
     103        };
     104
    95105        public:
    96             XMLPortParamContainer();
     106            XMLPortParamContainer()
     107                { this->parseResult_ = PR_not_started; }
     108            virtual ~XMLPortParamContainer() {}
    97109
    98110            inline const std::string& getName() const
    99111                { return this->paramname_; }
    100112
    101             XMLPortParamContainer& description(const std::string description);
    102             const std::string& getDescription();
     113            virtual XMLPortParamContainer& description(const std::string description) = 0;
     114            virtual const std::string& getDescription() = 0;
     115
     116            virtual XMLPortParamContainer& defaultValue(unsigned int index, const MultiTypeMath& param) = 0;
     117            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1) = 0;
     118            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2) = 0;
     119            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3) = 0;
     120            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4) = 0;
     121            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4, const MultiTypeMath& param5) = 0;
    103122
    104123        protected:
    105             std::string classname_;
    106124            std::string paramname_;
    107 
    108         private:
    109             LanguageEntryLabel description_;
    110             bool bAddedDescription_;
    111             bool bAddedDefaultValues_;
     125            ParseResult parseResult_;
     126
    112127    };
    113128
     
    115130    class XMLPortClassParamContainer : public XMLPortParamContainer
    116131    {
     132        struct ParseParams
     133        {
     134            T* object;
     135            Element* xmlelement;
     136            XMLPort::Mode mode;
     137        };
     138
    117139        public:
    118             XMLPortClassParamContainer(const std::string classname, const std::string paramname, FunctorMember<T>* loadfunction, FunctorMember<T>* savefunction)
    119             {
    120                 this->classname_ = classname;
     140            XMLPortClassParamContainer(const std::string paramname, ExecutorMember<T>* loadexecutor, ExecutorMember<T>* saveexecutor)
     141            {
    121142                this->paramname_ = paramname;
    122                 this->loadfunction_ = loadfunction;
    123                 this->savefunction_ = savefunction;
     143                this->loadexecutor_ = loadexecutor;
     144                this->saveexecutor_ = saveexecutor;
     145
     146                this->setDefaultValue_[0] = false;
     147                this->setDefaultValue_[1] = false;
     148                this->setDefaultValue_[2] = false;
     149                this->setDefaultValue_[3] = false;
     150                this->setDefaultValue_[4] = false;
    124151            }
    125152
    126153            XMLPortParamContainer& port(T* object, Element& xmlelement, XMLPort::Mode mode)
    127154            {
     155                this->parseParams_.object = object;
     156                this->parseParams_.xmlelement = &xmlelement;
     157                this->parseParams_.mode = mode;
     158
    128159                if (mode == XMLPort::LoadObject)
    129160                {
     
    131162                    {
    132163                        std::string attribute = xmlelement.GetAttribute(this->paramname_);
    133                         if (attribute.size() > 0)
     164                        if ((attribute.size() > 0) || (this->loadexecutor_->allDefaultValuesSet()))
    134165                        {
    135                             SubString tokens(attribute, ",", SubString::WhiteSpaces, false, '\\', '"', '(', ')', '\0');
    136                             if ((unsigned int)tokens.size() >= (unsigned int)this->loadfunction_->getParamCount())
    137                             {
    138                                 COUT(5) << object->getLoaderIndentation() << "Loading parameter " << this->paramname_ << " in " << this->classname_ << " (objectname " << object->getName() << ") with ";
    139                                 if (this->loadfunction_->getParamCount() == 1)
    140                                 {
    141                                     COUT(5) << "1 parameter (using whole string):" << std::endl;
    142                                     COUT(5) << object->getLoaderIndentation() << "  " << attribute << std::endl;
    143                                     (*this->loadfunction_)(object, MultiTypeMath(attribute));
    144                                 }
    145                                 else
    146                                 {
    147                                     COUT(5) << tokens.size() << " parameter (using MultiTypeMath)." << std::endl;
    148                                     MultiTypeMath param1 = MT_null, param2 = MT_null, param3 = MT_null, param4 = MT_null, param5 = MT_null;
    149                                     if (tokens.size() >= 1) param1 = tokens[0];
    150                                     if (tokens.size() >= 2) param2 = tokens[1];
    151                                     if (tokens.size() >= 3) param3 = tokens[2];
    152                                     if (tokens.size() >= 4) param4 = tokens[3];
    153                                     if (tokens.size() >= 5) param5 = tokens[4];
    154                                     COUT(5) << object->getLoaderIndentation() << "  " << attribute << std::endl;
    155                                     COUT(5) << object->getLoaderIndentation() << "  " << param1 << ", " << param2 << ", " << param3 << ", " << param4 << ", " << param5 << std::endl;
    156 
    157                                     (*this->loadfunction_)(object, param1, param2, param3, param4, param5);
    158                                 }
    159                             }
     166                            COUT(5) << object->getLoaderIndentation() << "Loading parameter " << this->paramname_ << " in " << object->getIdentifier()->getName() << " (objectname " << object->getName() << ")." << std::endl << object->getLoaderIndentation();
     167                            if (this->loadexecutor_->parse(object, attribute, ","))
     168                                this->parseResult_ = PR_finished;
    160169                            else
    161                             {
    162                                 COUT(2) << object->getLoaderIndentation() << "Warning: Parameter \"" << this->paramname_ << "\" in \"" << this->classname_ << "\" (objectname: " << object->getName() << ") is incomplete and couln't be loaded." << std::endl;
    163                             }
     170                                this->parseResult_ = PR_waiting_for_default_values;
    164171                        }
    165172                    }
     
    167174                    {
    168175                        COUT(1) << std::endl;
    169                         COUT(1) << "An error occurred in XMLPort.h while loading attribute '" << this->paramname_ << "' of '" << this->classname_ << "' (objectname: " << object->getName() << ") in " << object->getLevelfile() << ":" << std::endl;
     176                        COUT(1) << "An error occurred in XMLPort.h while loading attribute '" << this->paramname_ << "' of '" << object->getIdentifier()->getName() << "' (objectname: " << object->getName() << ") in " << object->getLevelfile() << ":" << std::endl;
    170177                        COUT(1) << ex.what() << std::endl;
    171178                    }
     
    173180                else
    174181                {
    175                     if (this->savefunction_)
     182                    if (this->saveexecutor_)
    176183                    {
    177184//                        xmlelement.SetAttribute(this->paramname_, "...");
     
    182189            }
    183190
     191            XMLPortParamContainer& port(const ParseParams& parseParams)
     192            {
     193                return this->port(parseParams.object, *parseParams.xmlelement, parseParams.mode);
     194            }
     195
     196            XMLPortParamContainer& portIfWaitingForDefaultValues(const ParseResult& result, const ParseParams& params)
     197            {
     198                if (result == PR_waiting_for_default_values)
     199                    return this->port(params);
     200                else
     201                    return (*this);
     202            }
     203
     204            virtual XMLPortParamContainer& description(const std::string description)
     205                { this->loadexecutor_->setDescription(description); return (*this); }
     206            virtual const std::string& getDescription()
     207                { return this->loadexecutor_->getDescription(); }
     208
     209            virtual XMLPortParamContainer& defaultValue(unsigned int index, const MultiTypeMath& param)
     210            {
     211                if (!this->setDefaultValue_[index])
     212                {
     213                    this->setDefaultValue_[index] = true;
     214                    this->loadexecutor_->setDefaultValue(index, param);
     215                }
     216                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     217            }
     218            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1)
     219            {
     220                if (!this->setDefaultValue_[0])
     221                {
     222                    this->setDefaultValue_[0] = true;
     223                    this->loadexecutor_->setDefaultValues(param1);
     224                }
     225                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     226            }
     227            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2)
     228            {
     229                if ((!this->setDefaultValue_[0]) || (!this->setDefaultValue_[1]))
     230                {
     231                    this->setDefaultValue_[0] = true;
     232                    this->setDefaultValue_[1] = true;
     233                    this->loadexecutor_->setDefaultValues(param1, param2);
     234                }
     235                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     236            }
     237            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3)
     238            {
     239                if ((!this->setDefaultValue_[0]) || (!this->setDefaultValue_[1]) || (!this->setDefaultValue_[2]))
     240                {
     241                    this->setDefaultValue_[0] = true;
     242                    this->setDefaultValue_[1] = true;
     243                    this->setDefaultValue_[3] = true;
     244                    this->loadexecutor_->setDefaultValues(param1, param2, param3);
     245                }
     246                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     247            }
     248            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4)
     249            {
     250                if ((!this->setDefaultValue_[0]) || (!this->setDefaultValue_[1]) || (!this->setDefaultValue_[2]) || (!this->setDefaultValue_[3]))
     251                {
     252                    this->setDefaultValue_[0] = true;
     253                    this->setDefaultValue_[1] = true;
     254                    this->setDefaultValue_[3] = true;
     255                    this->setDefaultValue_[4] = true;
     256                    this->loadexecutor_->setDefaultValues(param1, param2, param3, param4);
     257                }
     258                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     259            }
     260            virtual XMLPortParamContainer& defaultValues(const MultiTypeMath& param1, const MultiTypeMath& param2, const MultiTypeMath& param3, const MultiTypeMath& param4, const MultiTypeMath& param5)
     261            {
     262                if ((!this->setDefaultValue_[0]) || (!this->setDefaultValue_[1]) || (!this->setDefaultValue_[2]) || (!this->setDefaultValue_[3]) || (!this->setDefaultValue_[4]))
     263                {
     264                    this->setDefaultValue_[0] = true;
     265                    this->setDefaultValue_[1] = true;
     266                    this->setDefaultValue_[3] = true;
     267                    this->setDefaultValue_[4] = true;
     268                    this->setDefaultValue_[5] = true;
     269                    this->loadexecutor_->setDefaultValues(param1, param2, param3, param4, param5);
     270                }
     271                return this->portIfWaitingForDefaultValues(this->parseResult_, this->parseParams_);
     272            }
     273
    184274        private:
    185             FunctorMember<T>* loadfunction_;
    186             FunctorMember<T>* savefunction_;
     275            ExecutorMember<T>* loadexecutor_;
     276            ExecutorMember<T>* saveexecutor_;
     277            ParseParams parseParams_;
     278            bool setDefaultValue_[5];
    187279    };
    188280
     
    194286    {
    195287        public:
    196             XMLPortObjectContainer();
     288            XMLPortObjectContainer()
     289                { this->bApplyLoaderMask_ = false; }
     290            virtual ~XMLPortObjectContainer() {}
    197291
    198292            inline const std::string& getName() const
    199293                { return this->sectionname_; }
    200294
    201             XMLPortObjectContainer& description(const std::string description);
    202             const std::string& getDescription();
     295            virtual XMLPortObjectContainer& description(const std::string description) = 0;
     296            virtual const std::string& getDescription() = 0;
     297
    203298            bool identifierIsIncludedInLoaderMask(const Identifier* identifier);
    204299
    205300        protected:
    206             std::string classname_;
    207301            std::string sectionname_;
    208302            bool bApplyLoaderMask_;
    209303            bool bLoadBefore_;
    210 
    211         private:
    212             LanguageEntryLabel description_;
    213             bool bAddedDescription_;
    214304    };
    215305
     
    218308    {
    219309        public:
    220             XMLPortClassObjectContainer(const std::string classname, const std::string sectionname, void (T::*loadfunction)(O*), const O* (T::*savefunction)(unsigned int) const, bool bApplyLoaderMask, bool bLoadBefore)
    221             {
    222                 this->classname_ = classname;
     310            XMLPortClassObjectContainer(const std::string sectionname, ExecutorMember<T>* loadexecutor, ExecutorMember<T>* saveexecutor, bool bApplyLoaderMask, bool bLoadBefore)
     311            {
    223312                this->sectionname_ = sectionname;
    224                 this->loadfunction_ = loadfunction;
    225                 this->savefunction_ = savefunction;
     313                this->loadexecutor_ = loadexecutor;
     314                this->saveexecutor_ = saveexecutor;
    226315                this->bApplyLoaderMask_ = bApplyLoaderMask;
    227316                this->bLoadBefore_ = bLoadBefore;
     
    252341                                        {
    253342                                            COUT(4) << object->getLoaderIndentation() << "fabricating " << child->Value() << "..." << std::endl;
     343
    254344                                            O* newObject = (O*)identifier->fabricate();
    255345                                            newObject->setLoaderIndentation(object->getLoaderIndentation() + "  ");
    256346                                            newObject->setLevel(object->getLevel());
    257347                                            newObject->setNamespace(object->getNamespace());
     348
    258349                                            if (this->bLoadBefore_)
    259350                                            {
    260351                                                newObject->XMLPort(*child, XMLPort::LoadObject);
    261                                                 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << this->classname_ << " (objectname " << object->getName() << ")" << std::endl;
     352                                                COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (objectname " << newObject->getName() << ") to " << object->getIdentifier()->getName() << " (objectname " << object->getName() << ")" << std::endl;
    262353                                            }
    263354                                            else
    264355                                            {
    265                                                 COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << this->classname_ << " (objectname " << object->getName() << ")" << std::endl;
     356                                                COUT(4) << object->getLoaderIndentation() << "assigning " << child->Value() << " (object not yet loaded) to " << object->getIdentifier()->getName() << " (objectname " << object->getName() << ")" << std::endl;
    266357                                            }
    267                                             (*object.*this->loadfunction_)(newObject);
     358
     359                                            COUT(5) << object->getLoaderIndentation();
     360                                            (*this->loadexecutor_)(object, newObject);
     361
    268362                                            if (!this->bLoadBefore_)
    269363                                                newObject->XMLPort(*child, XMLPort::LoadObject);
     364
    270365                                            COUT(5) << object->getLoaderIndentation() << "...fabricated " << child->Value() << " (objectname " << newObject->getName() << ")." << std::endl;
    271366                                        }
     
    286381                    {
    287382                        COUT(1) << std::endl;
    288                         COUT(1) << "An error occurred in XMLPort.h while loading a '" << Class(O)->getName() << "' in '" << this->sectionname_ << "' of '" << this->classname_ << "' (objectname: " << object->getName() << ") in " << object->getLevelfile() << ":" << std::endl;
     383                        COUT(1) << "An error occurred in XMLPort.h while loading a '" << Class(O)->getName() << "' in '" << this->sectionname_ << "' of '" << object->getIdentifier()->getName() << "' (objectname: " << object->getName() << ") in " << object->getLevelfile() << ":" << std::endl;
    289384                        COUT(1) << ex.what() << std::endl;
    290385                    }
     
    297392            }
    298393
     394            virtual XMLPortObjectContainer& description(const std::string description)
     395                { this->loadexecutor_->setDescription(description); return (*this); }
     396            virtual const std::string& getDescription()
     397                { return this->loadexecutor_->getDescription(); }
     398
    299399        private:
    300             void     (T::*loadfunction_)(O*);
    301             const O* (T::*savefunction_)(unsigned int) const;
     400            ExecutorMember<T>* loadexecutor_;
     401            ExecutorMember<T>* saveexecutor_;
    302402    };
    303403}
Note: See TracChangeset for help on using the changeset viewer.