1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-02-12 00:40:23 +00:00

- changed namespace

This commit is contained in:
terrorfisch 2014-10-10 23:28:49 +02:00
parent db1b93498d
commit 5248917a6c
2 changed files with 99 additions and 94 deletions

View File

@ -19,13 +19,13 @@ namespace ESM
}
}
template< class Base > class DerivedClassStorage;
namespace MWMechanics
{
class AiPackage;
template< class Base > class DerivedClassStorage;
class AiTemporaryBase;
typedef DerivedClassStorage<AiTemporaryBase> AiState;

View File

@ -8,110 +8,115 @@
#include <boost/static_assert.hpp>
#include <boost/type_traits/is_base_of.hpp>
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<Base,Derived> , "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<Base,Derived>::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<Derived>();
// assert that Derived is derived from Base.
template< class Derived >
void assert_derived()
{
// c++11:
// static_assert( std::is_base_of<Base,Derived> , "DerivedClassStorage may only store derived classes" );
// boost:
BOOST_STATIC_ASSERT(boost::is_base_of<Base,Derived>::value);//,"DerivedClassStorage may only store derived classes");
}
Derived* result = dynamic_cast<Derived*>(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>();
Derived* result = dynamic_cast<Derived*>(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<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<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<Derived>();
if(!mStorage)
throw std::runtime_error("Cant move out: empty storage.");
Derived* result = dynamic_cast<Derived*>(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<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<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<Derived>();
};
if(!mStorage)
throw std::runtime_error("Cant move out: empty storage.");
Derived* result = dynamic_cast<Derived*>(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