22 #ifndef _BLAZE_UTIL_SINGLETON_SINGLETON_H_
23 #define _BLAZE_UTIL_SINGLETON_SINGLETON_H_
30 #include <boost/shared_ptr.hpp>
31 #include <boost/thread/mutex.hpp>
47 template<
typename >
class Dependency;
70 struct HasCyclicDependencyHelper;
85 struct HasCyclicDependencyHelper<TL,NullType,N>
101 template<
typename TL
103 struct HasCyclicDependencyHelper<TL,D,1>
121 template<
typename TL
123 struct HasCyclicDependencyHelper<TL,D,2>
143 template<
typename TL
145 struct HasCyclicDependencyHelper<TL,D,3>
167 template<
typename TL
169 struct HasCyclicDependencyHelper<TL,D,4>
193 template<
typename TL
195 struct HasCyclicDependencyHelper<TL,D,5>
221 template<
typename TL
223 struct HasCyclicDependencyHelper<TL,D,6>
251 template<
typename TL
253 struct HasCyclicDependencyHelper<TL,D,7>
283 template<
typename TL
285 struct HasCyclicDependencyHelper<TL,D,8>
332 enum { value = HasCyclicDependencyHelper<ETL,typename T::Dependencies>::value };
376 template<
int >
struct CYCLIC_LIFETIME_DEPENDENCY_TEST {};
399 template<
bool >
struct CYCLIC_LIFETIME_DEPENDENCY_DETECTED;
400 template<>
struct CYCLIC_LIFETIME_DEPENDENCY_DETECTED<false> {
enum { value = 1 }; };
411 #define BLAZE_DETECT_CYCLIC_LIFETIME_DEPENDENCY(T) \
413 blaze::CYCLIC_LIFETIME_DEPENDENCY_TEST< \
414 blaze::CYCLIC_LIFETIME_DEPENDENCY_DETECTED< blaze::HasCyclicDependency<T,blaze::NullType>::value >::value > \
415 BLAZE_JOIN( DETECT_CYCLIC_LIFETIME_DEPENDENCY_TYPEDEF, __LINE__ )
434 #define BLAZE_BEFRIEND_SINGLETON \
435 template< typename, typename, typename, typename, typename, typename, typename, typename, typename > friend class blaze::Singleton; \
436 template< typename, typename, bool > friend struct blaze::HasCyclicDependency; \
437 template< typename > friend class blaze::Dependency;
566 ,
typename D1 = NullType
567 ,
typename D2 = NullType
568 ,
typename D3 = NullType
569 ,
typename D4 = NullType
570 ,
typename D5 = NullType
571 ,
typename D6 = NullType
572 ,
typename D7 = NullType
573 ,
typename D8 = NullType >
632 static boost::shared_ptr<T> instance()
635 static boost::shared_ptr<T> object(
new T() );
746 static boost::shared_ptr<T> instance()
749 static boost::shared_ptr<T> object(
new T() );
804 class Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType> :
private NonCopyable
809 typedef Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType>
SingletonType;
856 static boost::shared_ptr<T> instance()
859 static boost::shared_ptr<T> object(
new T() );
912 class Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType> :
private NonCopyable
917 typedef Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType>
SingletonType;
961 static boost::shared_ptr<T> instance()
964 static boost::shared_ptr<T> object(
new T() );
1010 template<
typename T
1015 class Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType> :
private NonCopyable
1020 typedef Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType>
SingletonType;
1061 static boost::shared_ptr<T> instance()
1064 static boost::shared_ptr<T> object(
new T() );
1109 template<
typename T
1113 class Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1118 typedef Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1156 static boost::shared_ptr<T> instance()
1159 static boost::shared_ptr<T> object(
new T() );
1203 template<
typename T
1206 class Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1211 typedef Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1246 static boost::shared_ptr<T> instance()
1249 static boost::shared_ptr<T> object(
new T() );
1292 template<
typename T
1294 class Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1299 typedef Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1331 static boost::shared_ptr<T> instance()
1334 static boost::shared_ptr<T> object(
new T() );
1376 template<
typename T >
1377 class Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1382 typedef Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1385 typedef NullType Dependencies;
1411 static boost::shared_ptr<T> instance()
1414 static boost::shared_ptr<T> object(
new T() );
1440 template<
typename T
1449 boost::mutex Singleton<T,A,B,C,D,E,F,G,H>::instanceMutex_;
1451 template<
typename T
1459 boost::mutex Singleton<T,A,B,C,D,E,F,G,NullType>::instanceMutex_;
1461 template<
typename T
1468 boost::mutex Singleton<T,A,B,C,D,E,F,NullType,NullType>::instanceMutex_;
1470 template<
typename T
1476 boost::mutex Singleton<T,A,B,C,D,E,NullType,NullType,NullType>::instanceMutex_;
1478 template<
typename T
1483 boost::mutex Singleton<T,A,B,C,D,NullType,NullType,NullType,NullType>::instanceMutex_;
1485 template<
typename T
1489 boost::mutex Singleton<T,A,B,C,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1491 template<
typename T
1494 boost::mutex Singleton<T,A,B,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1496 template<
typename T
1498 boost::mutex Singleton<T,A,NullType,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1500 template<
typename T >
1501 boost::mutex Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;