diff --git a/src/gui/official/utilspp/singleton/CreationStatic.hpp b/src/gui/official/utilspp/singleton/CreationStatic.hpp new file mode 100644 index 0000000000000000000000000000000000000000..27570f5308802c89614944ae3ab97b7fafdf7c8f --- /dev/null +++ b/src/gui/official/utilspp/singleton/CreationStatic.hpp @@ -0,0 +1,49 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef CREATION_STATIC_HPP +#define CREATION_STATIC_HPP + +/** + * This class is a creation policy for the utilspp::singleton_holder. The + * policy is creating the singleton by a static memory. The constructor is + * called the first time we call the utilspp::creation_static::create() + * function. + * + * Note don't use this class because it's not complete, and at this time it's + * not REALY complyant with the lifetime policy. + */ +namespace utilspp +{ + template< typename T > + class CreationStatic + { + public: + static T* create(); + static void destroy( T* obj ); + }; +}; + +#include "CreationStatic.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/CreationStatic.inl b/src/gui/official/utilspp/singleton/CreationStatic.inl new file mode 100644 index 0000000000000000000000000000000000000000..9572e5eca75f2d2e054cb7ea12d68a2cb33677b4 --- /dev/null +++ b/src/gui/official/utilspp/singleton/CreationStatic.inl @@ -0,0 +1,43 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef CREATION_STATIC_INL +#define CREATION_STATIC_INL + +template< typename T > +T* +utilspp::CreationStatic::create() +{ + static T mObj; + return new(&mObj) T; +}; + +template< typename T > +void +utilspp::CreationStatic::destroy( T* obj ) +{ + obj->~T(); +} + + +#endif \ No newline at end of file diff --git a/src/gui/official/utilspp/singleton/CreationUsingNew.hpp b/src/gui/official/utilspp/singleton/CreationUsingNew.hpp new file mode 100644 index 0000000000000000000000000000000000000000..5055db5b8ff0866159e9ad488312cee6e9a900c5 --- /dev/null +++ b/src/gui/official/utilspp/singleton/CreationUsingNew.hpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef CREATION_USING_NEW_HPP +#define CREATION_USING_NEW_HPP + +/** + * This class is a creation policy for the utilspp::singleton_holder. The + * policy is creating the singleton by a "new" call. + */ +namespace utilspp +{ + template< typename T > + struct CreationUsingNew + { + static T *create(); + static void destroy( T *obj ); + }; +}; + +#include "CreationUsingNew.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/CreationUsingNew.inl b/src/gui/official/utilspp/singleton/CreationUsingNew.inl new file mode 100644 index 0000000000000000000000000000000000000000..adb66ede9ee12036dbcc41f9469475378190a8b3 --- /dev/null +++ b/src/gui/official/utilspp/singleton/CreationUsingNew.inl @@ -0,0 +1,42 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef CREATION_USING_NEW_INL +#define CREATION_USING_NEW_INL + +template< typename T > +T * +utilspp::CreationUsingNew< T >::create() +{ + return new T; +} + +template< typename T > +void +utilspp::CreationUsingNew< T >::destroy( T *obj ) +{ + delete obj; +} + + +#endif diff --git a/src/gui/official/utilspp/singleton/LifetimeDefault.hpp b/src/gui/official/utilspp/singleton/LifetimeDefault.hpp new file mode 100644 index 0000000000000000000000000000000000000000..9c77138109a0385d267c52626e381fe0f3e5f36e --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeDefault.hpp @@ -0,0 +1,43 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIFETIME_DEFAULT_HPP +#define LIFETIME_DEFAULT_HPP + +#include <stdexcept> +#include <cstdlib> + +namespace utilspp +{ + template< typename T > + class LifetimeDefault + { + public: + static void scheduleDestruction( T *obj, void (*func)() ); + static void onDeadReference(); + }; +}; + +#include "LifetimeDefault.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/LifetimeDefault.inl b/src/gui/official/utilspp/singleton/LifetimeDefault.inl new file mode 100644 index 0000000000000000000000000000000000000000..a8e63f9fc43ede97e653513d336327ca93e242a7 --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeDefault.inl @@ -0,0 +1,42 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIFETIME_DEFAULT_INL +#define LIFETIME_DEFAULT_INL + +template< typename T > +void +utilspp::LifetimeDefault< T >::scheduleDestruction( T *, void (*func)() ) +{ + std::atexit(func); +} + +template< typename T > +void +utilspp::LifetimeDefault< T >::onDeadReference() +{ + throw std::logic_error( "Dead reference detected" ); +} + + +#endif diff --git a/src/gui/official/utilspp/singleton/LifetimeLibrary.hpp b/src/gui/official/utilspp/singleton/LifetimeLibrary.hpp new file mode 100644 index 0000000000000000000000000000000000000000..80fba716ab70484e4cd5525be39e9e08cf40a276 --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeLibrary.hpp @@ -0,0 +1,104 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIFETIME_LIBRARY_HPP +#define LIFETIME_LIBRARY_HPP + +#include <cassert> + +#include "PrivateMembers.hpp" +#include "CreationUsingNew.hpp" + +namespace utilspp +{ + + template< typename T > + unsigned int getLongevity( T *p ); + + /** + * Assigns an object a longevity. Ensures ordered destructions of objects + * registered thusly during the exit sequence of the application. + */ + template< typename T, typename TDestroyer > + void setLibraryLongevity( + T *obj, + unsigned int longevity, + TDestroyer d = utilspp::PrivateMembers::Deleter< T >::deleteObject + ); + + /** + * This class is a lifetime policy for the singleton. This + * class allow you to terminate the singleton explicitly. + * You can terminate by calling: + * + * LifetimeLibrarySingleton::instance().terminate() + * + * This singleton use the utilspp::LifetimeWithLongevity policy. + */ + template< typename T > + struct LifetimeLibrary + { + static void scheduleDestruction( T *obj, void (*func)() ); + static void onDeadReference(); + }; + + class LifetimeLibraryImpl + { + public: + LifetimeLibraryImpl(); + ~LifetimeLibraryImpl(); + + void add( utilspp::PrivateMembers::LifetimeTracker *tracker ); + void terminate(); + + private: + utilspp::PrivateMembers::TrackerArray mTrackerArray; + int mNbElements; + }; + + unsigned int getLongevity( utilspp::LifetimeLibraryImpl *p ); + + typedef utilspp::SingletonHolder< + utilspp::LifetimeLibraryImpl, + utilspp::CreationUsingNew, + utilspp::LifetimeWithLongevity + > LifetimeLibrarySingleton; + + /** + * This class will ensure that + * + * LifetimeLibraryImpl::terminate() + * + * is called. + */ + template< typename T = utilspp::LifetimeLibrarySingleton > + class LifetimeLibraryGuard + { + public: + ~LifetimeLibraryGuard(); + }; +}; + +#include "LifetimeLibrary.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/LifetimeLibrary.inl b/src/gui/official/utilspp/singleton/LifetimeLibrary.inl new file mode 100644 index 0000000000000000000000000000000000000000..b7ab8e6d66d2bb38719e8b0b6d163636f33bcdbd --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeLibrary.inl @@ -0,0 +1,33 @@ +template< typename T, typename TDestroyer > +void +utilspp::setLibraryLongevity( T *obj, unsigned int longevity, TDestroyer d ) +{ + using namespace utilspp::PrivateMembers; + + LifetimeTracker *p = new ConcreteLifetimeTracker< T, TDestroyer >( + obj, longevity, d); + + utilspp::LifetimeLibrarySingleton::instance().add( p ); +}; + +template< typename T > +void +utilspp::LifetimeLibrary< T >::scheduleDestruction( T *obj, void (*func)() ) +{ + utilspp::PrivateMembers::adapter<T> adapter = { func }; + utilspp::setLibraryLongevity( obj, getLongevity( obj ), adapter ); +} + +template< typename T > +void +utilspp::LifetimeLibrary< T >::onDeadReference() +{ + throw std::logic_error("Dead reference detected"); +} + +template< typename T > +utilspp::LifetimeLibraryGuard< T >::~LifetimeLibraryGuard() +{ + T::instance().terminate(); +} + diff --git a/src/gui/official/utilspp/singleton/LifetimeWithLongevity.hpp b/src/gui/official/utilspp/singleton/LifetimeWithLongevity.hpp new file mode 100644 index 0000000000000000000000000000000000000000..888475126411719da68a0d7043ef358eac7b79da --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeWithLongevity.hpp @@ -0,0 +1,56 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef LIFETIME_WITH_LONGEVITY_HPP +#define LIFETIME_WITH_LONGEVITY_HPP + +#include <cassert> + +#include "PrivateMembers.hpp" + +namespace utilspp +{ + + template< typename T > + unsigned int getLongevity( T *p ); + + /** + * Assigns an object a longevity. Ensures ordered destructions of objects + * registered thusly during the exit sequence of the application. + */ + template< typename T, typename TDestroyer > + void setLongevity(T *obj, + unsigned int longevity, + TDestroyer d = utilspp::PrivateMembers::Deleter< T >::deleteObject); + + template< typename T > + struct LifetimeWithLongevity + { + static void scheduleDestruction( T *obj, void (*func)() ); + static void onDeadReference(); + }; +}; + +#include "LifetimeWithLongevity.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/LifetimeWithLongevity.inl b/src/gui/official/utilspp/singleton/LifetimeWithLongevity.inl new file mode 100644 index 0000000000000000000000000000000000000000..aaaf0ebfb5befbf0b528e247ccc0b2157576f499 --- /dev/null +++ b/src/gui/official/utilspp/singleton/LifetimeWithLongevity.inl @@ -0,0 +1,56 @@ +template< typename T, typename TDestroyer > +void +utilspp::setLongevity( T *obj, unsigned int longevity, TDestroyer d ) +{ + using namespace utilspp::PrivateMembers; + + TrackerArray newArray = static_cast< TrackerArray >( + std::realloc(mTrackerArray, mNbElements + 1)); + if( newArray == NULL ) + { + throw std::bad_alloc(); + } + + LifetimeTracker *p = + new ConcreteLifetimeTracker< T, TDestroyer >(obj, longevity, d); + + mTrackerArray = newArray; + + TrackerArray pos = std::upper_bound( + mTrackerArray, + mTrackerArray + mNbElements, + p, + &LifetimeTracker::compare); + std::copy_backward( + pos, + mTrackerArray + mNbElements, + mTrackerArray + mNbElements + 1); + + *pos = p; + mNbElements++; + std::atexit( &atExitFunc ); +}; + +template< typename T > +void +utilspp::LifetimeWithLongevity< T >::scheduleDestruction( T *obj, void (*func)() ) +{ + utilspp::PrivateMembers::adapter<T> adapter = { func }; + utilspp::setLongevity( obj, getLongevity( obj ), adapter ); +} + +template< typename T > +void +utilspp::LifetimeWithLongevity< T >::onDeadReference() +{ + throw std::logic_error("Dead reference detected"); +} + +template< typename T > +unsigned int +utilspp::getLongevity( T * ) +{ + return 1000; +} + + diff --git a/src/gui/official/utilspp/singleton/PrivateMembers.hpp b/src/gui/official/utilspp/singleton/PrivateMembers.hpp new file mode 100644 index 0000000000000000000000000000000000000000..b1fb8cd22e7b9d7356a9e57fa735c1e4f0ff91e8 --- /dev/null +++ b/src/gui/official/utilspp/singleton/PrivateMembers.hpp @@ -0,0 +1,93 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef PRIVATE_MEMBERS_HPP +#define PRIVATE_MEMBERS_HPP + +#include <cassert> + +namespace utilspp +{ + namespace PrivateMembers + { + /** + * Helper class for utils::setLongevity + */ + class LifetimeTracker + { + public: + LifetimeTracker( unsigned int longevity ); + virtual ~LifetimeTracker(); + static bool compare( + const LifetimeTracker *l, + const LifetimeTracker *r + ); + + private: + unsigned int mLongevity; + }; + + typedef LifetimeTracker** TrackerArray; + + extern TrackerArray mTrackerArray; + extern int mNbElements; + + /** + * Helper class for Destroyer + */ + template< typename T > + struct Deleter + { + void deleteObject( T *obj ); + }; + + /** + * Concrete lifetime tracker for objects of type T + */ + template< typename T, typename TDestroyer > + class ConcreteLifetimeTracker : public LifetimeTracker + { + public: + ConcreteLifetimeTracker(T *obj, unsigned int longevity, TDestroyer d); + + ~ConcreteLifetimeTracker(); + + private: + T* mTracked; + TDestroyer mDestroyer; + }; + + void atExitFunc(); + + template <class T> + struct adapter + { + void operator()(T*); + void (*mFunc)(); + }; + }; +}; + +#include "PrivateMembers.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/PrivateMembers.inl b/src/gui/official/utilspp/singleton/PrivateMembers.inl new file mode 100644 index 0000000000000000000000000000000000000000..8f3609416cd2e78a4995ab0594b62c0a73729237 --- /dev/null +++ b/src/gui/official/utilspp/singleton/PrivateMembers.inl @@ -0,0 +1,30 @@ + +template< typename T > +void +utilspp::PrivateMembers::Deleter< T >::deleteObject( T *obj ) +{ + delete obj; +} + +template< typename T, typename TDestroyer > +utilspp::PrivateMembers::ConcreteLifetimeTracker< T, TDestroyer >::ConcreteLifetimeTracker( + T *obj, unsigned int longevity, TDestroyer d) +: LifetimeTracker( longevity ) +, mTracked( obj ) +, mDestroyer( d ) +{} + +template< typename T, typename TDestroyer > +utilspp::PrivateMembers::ConcreteLifetimeTracker< T, TDestroyer >::~ConcreteLifetimeTracker() +{ + mDestroyer( mTracked ); +} + + +template < typename T > +void +utilspp::PrivateMembers::adapter< T >::operator()(T*) +{ + return (*mFunc)(); +} + diff --git a/src/gui/official/utilspp/singleton/SingletonHolder.hpp b/src/gui/official/utilspp/singleton/SingletonHolder.hpp new file mode 100644 index 0000000000000000000000000000000000000000..8a8590a7b2e31666547357ccef12678244a42e40 --- /dev/null +++ b/src/gui/official/utilspp/singleton/SingletonHolder.hpp @@ -0,0 +1,66 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SINGLETON_HOLDER_HPP +#define SINGLETON_HOLDER_HPP + +#include <cassert> + +#include "CreationUsingNew.hpp" +#include "LifetimeDefault.hpp" +#include "LifetimeWithLongevity.hpp" +#include "../ThreadingSingle.hpp" + +namespace utilspp +{ + template + < class T, + template < class > class CreationPolicy = utilspp::CreationUsingNew, + template < class > class LifetimePolicy = utilspp::LifetimeDefault, + template < class > class ThreadingModel = utilspp::ThreadingSingle > + class SingletonHolder + { + public: + //the accessor method. + static T& instance(); + static void makeInstance(); + static void terminate(); + + protected: + //protected to be sure that nobody may create one by himself. + SingletonHolder(); + + private: + static void destroySingleton(); + + private: + typedef typename ThreadingModel< T * >::VolatileType InstanceType; + static InstanceType mInstance; + static bool mDestroyed; + }; + +}; + +#include "SingletonHolder.inl" + +#endif diff --git a/src/gui/official/utilspp/singleton/SingletonHolder.inl b/src/gui/official/utilspp/singleton/SingletonHolder.inl new file mode 100644 index 0000000000000000000000000000000000000000..84f27bea9feb7ea73475d31fd5903df56b5c72a8 --- /dev/null +++ b/src/gui/official/utilspp/singleton/SingletonHolder.inl @@ -0,0 +1,126 @@ +/* + * Copyright (c) <2002-2004> <Jean-Philippe Barrette-LaPierre> + * + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files + * (cURLpp), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, + * publish, distribute, sublicense, and/or sell copies of the Software, + * and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included + * in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef SINGLETON_HOLDER_INL +#define SINGLETON_HOLDER_INL + +template +< +class T, +template < class > class CreationPolicy, +template < class > class LifetimePolicy, +template < class > class ThreadingModel +> +T& +utilspp::SingletonHolder +< +T, +CreationPolicy, +LifetimePolicy, +ThreadingModel +> +::instance() +{ + if ( mInstance == NULL ) + { + makeInstance(); + } + + return ( *mInstance ); +}; + +template +< +class T, +template < class > class CreationPolicy, +template < class > class LifetimePolicy, +template < class > class ThreadingModel +> +void +utilspp::SingletonHolder +< +T, +CreationPolicy, +LifetimePolicy, +ThreadingModel +>::makeInstance() +{ + if ( mInstance == NULL ) + { + typename ThreadingModel< T >::lock guard; + (void)guard; + + if ( mInstance == NULL ) { + if ( mDestroyed ) + { + LifetimePolicy< T >::onDeadReference(); + mDestroyed = false; + } + + mInstance = CreationPolicy< T >::create(); + LifetimePolicy< T >::scheduleDestruction( mInstance, &destroySingleton ); + } + } +} + +template +< +class T, +template < class > class CreationPolicy, +template < class > class LifetimePolicy, +template < class > class ThreadingModel +> +void +utilspp::SingletonHolder +< +T, +CreationPolicy, +LifetimePolicy, +ThreadingModel +> +::destroySingleton() +{ + assert( !mDestroyed ); + CreationPolicy< T >::destroy( mInstance ); + mInstance = NULL; + mDestroyed = true; +} + +template < class T, +template < class > class C, +template < class > class L, +template < class > class M +> +typename utilspp::SingletonHolder< T, C, L, M>::InstanceType +utilspp::SingletonHolder< T, C, L, M >::mInstance; + +template +< +class T, +template < class > class C, +template < class > class L, +template < class > class M +> +bool utilspp::SingletonHolder< T, C, L, M >::mDestroyed; + +#endif