From 5248917a6c1e40d4c997a9bd198a026f72064114 Mon Sep 17 00:00:00 2001 From: terrorfisch Date: Fri, 10 Oct 2014 23:28:49 +0200 Subject: [PATCH] - changed namespace --- apps/openmw/mwmechanics/aisequence.hpp | 4 +- apps/openmw/mwmechanics/aistate.hpp | 189 +++++++++++++------------ 2 files changed, 99 insertions(+), 94 deletions(-) diff --git a/apps/openmw/mwmechanics/aisequence.hpp b/apps/openmw/mwmechanics/aisequence.hpp index 055c1f99d..7fd649d26 100644 --- a/apps/openmw/mwmechanics/aisequence.hpp +++ b/apps/openmw/mwmechanics/aisequence.hpp @@ -19,13 +19,13 @@ namespace ESM } } -template< class Base > class DerivedClassStorage; + namespace MWMechanics { class AiPackage; - + template< class Base > class DerivedClassStorage; class AiTemporaryBase; typedef DerivedClassStorage AiState; diff --git a/apps/openmw/mwmechanics/aistate.hpp b/apps/openmw/mwmechanics/aistate.hpp index 3e72d013f..889092db9 100644 --- a/apps/openmw/mwmechanics/aistate.hpp +++ b/apps/openmw/mwmechanics/aistate.hpp @@ -8,110 +8,115 @@ #include #include +namespace MWMechanics +{ -/// \brief stores an object of any class derived from Base -template< class Base > -class DerivedClassStorage -{ -private: - Base* mStorage; - - // assert that Derived is derived from Base. - template< class Derived > - void assert_derived() - { - // c++11: - // static_assert( std::is_base_of , "DerivedClassStorage may only store derived classes" ); + /** \brief stores one object of any class derived from Base. + * Requesting a certain dereived class via get() either returns + * the stored object if it has the correct type or otherwise replaces + * it with an object of the requested type. + */ + template< class Base > + class DerivedClassStorage + { + private: + Base* mStorage; - // boost: - BOOST_STATIC_ASSERT(boost::is_base_of::value);//,"DerivedClassStorage may only store derived classes"); - } - - //if needed you have to provide a clone member function - DerivedClassStorage( const DerivedClassStorage& other ); - DerivedClassStorage& operator=( const DerivedClassStorage& ); - -public: - /// \brief returns reference to stored object or deletes it and creates a fitting - template< class Derived > - Derived& get() - { - assert_derived(); + // assert that Derived is derived from Base. + template< class Derived > + void assert_derived() + { + // c++11: + // static_assert( std::is_base_of , "DerivedClassStorage may only store derived classes" ); + + // boost: + BOOST_STATIC_ASSERT(boost::is_base_of::value);//,"DerivedClassStorage may only store derived classes"); + } - Derived* result = dynamic_cast(mStorage); + //if needed you have to provide a clone member function + DerivedClassStorage( const DerivedClassStorage& other ); + DerivedClassStorage& operator=( const DerivedClassStorage& ); - if(!result) + public: + /// \brief returns reference to stored object or deletes it and creates a fitting + template< class Derived > + Derived& get() + { + assert_derived(); + + Derived* result = dynamic_cast(mStorage); + + if(!result) + { + if(mStorage) + delete mStorage; + mStorage = result = new Derived(); + } + + //return a reference to the (new allocated) object + return *result; + } + + template< class Derived > + void store( const Derived& payload ) + { + assert_derived(); + if(mStorage) + delete mStorage; + mStorage = new Derived(payload); + } + + /// \brief takes ownership of the passed object + template< class Derived > + void moveIn( Derived* p ) + { + assert_derived(); + if(mStorage) + delete mStorage; + mStorage = p; + } + + /// \brief gives away ownership of object. Throws exception if storage does not contain Derived or is empty. + template< class Derived > + Derived* moveOut() + { + assert_derived(); + + + if(!mStorage) + throw std::runtime_error("Cant move out: empty storage."); + + Derived* result = dynamic_cast(mStorage); + + if(!mStorage) + throw std::runtime_error("Cant move out: wrong type requested."); + + return result; + } + + bool empty() const + { + return mStorage == NULL; + } + + const std::type_info& getType() const + { + return typeid(mStorage); + } + + + DerivedClassStorage():mStorage(NULL){}; + ~DerivedClassStorage() { if(mStorage) delete mStorage; - mStorage = result = new Derived(); - } - - //return a reference to the (new allocated) object - return *result; - } - - template< class Derived > - void store( const Derived& payload ) - { - assert_derived(); - if(mStorage) - delete mStorage; - mStorage = new Derived(payload); - } - - /// \brief takes ownership of the passed object - template< class Derived > - void moveIn( Derived* p ) - { - assert_derived(); - if(mStorage) - delete mStorage; - mStorage = p; - } - - /// \brief gives away ownership of object. Throws exception if storage does not contain Derived or is empty. - template< class Derived > - Derived* moveOut() - { - assert_derived(); + }; - if(!mStorage) - throw std::runtime_error("Cant move out: empty storage."); - Derived* result = dynamic_cast(mStorage); - - if(!mStorage) - throw std::runtime_error("Cant move out: wrong type requested."); - - return result; - } - - bool empty() const - { - return mStorage == NULL; - } - - const std::type_info& getType() const - { - return typeid(mStorage); - } - - - DerivedClassStorage():mStorage(NULL){}; - ~DerivedClassStorage() - { - if(mStorage) - delete mStorage; }; - - - -}; -namespace MWMechanics -{ + /// \brief base class for the temporary storage of AiPackages. /** * Each AI package with temporary values needs a AiPackageStorage class