Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Aug 18, 2010, 1:52:55 AM (14 years ago)
Author:
landauf
Message:

fixed a potential problem introduced in r7158 - calling an executor on a temporary object shouldn't change the internal state of the underlying functor.

Location:
code/trunk/src/libraries/core
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/trunk/src/libraries/core/Executor.h

    r7163 r7177  
    183183            bool parse(T* object, const std::string& params, const std::string& delimiter = " ") const
    184184            {
    185                 static_cast<FunctorMember<T>*>(this->functor_)->setObject(object);
    186                 if (Executor::parse(params, delimiter))
    187                     return true;
    188                 else
    189                 {
    190                     static_cast<FunctorMember<T>*>(this->functor_)->setObject((T*)NULL);
    191                     return false;
    192                 }
     185                FunctorMember<T>* functorMember = static_cast<FunctorMember<T>*>(this->functor_);
     186
     187                const typename FunctorMember<T>::Objects& objects = functorMember->getObjects();
     188
     189                functorMember->setObject(object);
     190                bool result = Executor::parse(params, delimiter);
     191                functorMember->setObjects(objects);
     192
     193                return result;
    193194            }
    194195
    195196            bool parse(const T* object, const std::string& params, const std::string& delimiter = " ") const
    196197            {
    197                 static_cast<FunctorMember<T>*>(this->functor_)->setObject(object);
    198                 if (Executor::parse(params, delimiter))
    199                     return true;
    200                 else
    201                 {
    202                     static_cast<FunctorMember<T>*>(this->functor_)->setObject((T*)NULL);
    203                     return false;
    204                 }
     198                FunctorMember<T>* functorMember = static_cast<FunctorMember<T>*>(this->functor_);
     199
     200                const typename FunctorMember<T>::Objects& objects = functorMember->getObjects();
     201
     202                functorMember->setObject(object);
     203                bool result = Executor::parse(params, delimiter);
     204                functorMember->setObjects(objects);
     205
     206                return result;
    205207            }
    206208    };
  • code/trunk/src/libraries/core/Functor.h

    r6417 r7177  
    135135            FunctorMember()
    136136            {
    137                 constObject_ = 0;
    138                 object_ = 0;
    139                 bConstObject_ = false;
     137                this->object_ = 0;
     138                this->constObject_ = 0;
    140139            }
    141140            virtual ~FunctorMember() {}
     
    146145            virtual void operator()(const MultiType& param1 = MT_Type::Null, const MultiType& param2 = MT_Type::Null, const MultiType& param3 = MT_Type::Null, const MultiType& param4 = MT_Type::Null, const MultiType& param5 = MT_Type::Null)
    147146            {
    148                 if (this->bConstObject_)
    149                 {
    150                     if (this->constObject_)
    151                         (*this)(this->constObject_, param1, param2, param3, param4, param5);
    152                     else
    153                     {
    154                         COUT(1) << "An error occurred in Functor.h:" << std::endl;
    155                         COUT(1) << "Error: No const object set." << std::endl;
    156                     }
    157                 }
     147                if (this->object_)
     148                    (*this)(this->object_, param1, param2, param3, param4, param5);
     149                else if (this->constObject_)
     150                    (*this)(this->constObject_, param1, param2, param3, param4, param5);
    158151                else
    159152                {
    160                     if (this->object_)
    161                         (*this)(this->object_, param1, param2, param3, param4, param5);
    162                     else
    163                     {
    164                         COUT(1) << "An error occurred in Functor.h:" << std::endl;
    165                         COUT(1) << "Error: No object set." << std::endl;
    166                     }
     153                    COUT(1) << "An error occurred in Functor.h:" << std::endl;
     154                    COUT(1) << "Error: No object set." << std::endl;
    167155                }
    168156            }
    169157
    170             FunctorMember<T>* setObject(T* object)
     158            inline FunctorMember<T>* setObject(T* object)
    171159            {
    172                 this->bConstObject_ = false;
    173160                this->object_ = object;
     161                this->constObject_ = 0;
    174162                return this;
    175163            }
    176164
    177             FunctorMember<T>* setObject(const T* object)
     165            inline FunctorMember<T>* setObject(const T* object)
    178166            {
    179                 this->bConstObject_ = true;
     167                this->object_ = 0;
    180168                this->constObject_ = object;
    181169                return this;
    182170            }
    183171
     172            typedef std::pair<T*, const T*> Objects;
     173
     174            inline Objects getObjects() const
     175            {
     176                return Objects(this->object_, this->constObject_);
     177            }
     178
     179            inline void setObjects(const Objects& objects)
     180            {
     181                this->object_ = objects.first;
     182                this->constObject_ = objects.second;
     183            }
     184
    184185        private:
     186            T* object_;
    185187            const T* constObject_;
    186             T* object_;
    187             bool bConstObject_;
    188188    };
    189189
Note: See TracChangeset for help on using the changeset viewer.