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>
105 typedef typename TypeAt<D,0>::Result D1;
107 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value };
121 template<
typename TL
123 struct HasCyclicDependencyHelper<TL,D,2>
125 typedef typename TypeAt<D,0>::Result D1;
126 typedef typename TypeAt<D,1>::Result D2;
128 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
129 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value };
143 template<
typename TL
145 struct HasCyclicDependencyHelper<TL,D,3>
147 typedef typename TypeAt<D,0>::Result D1;
148 typedef typename TypeAt<D,1>::Result D2;
149 typedef typename TypeAt<D,2>::Result D3;
151 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
152 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
153 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value };
167 template<
typename TL
169 struct HasCyclicDependencyHelper<TL,D,4>
171 typedef typename TypeAt<D,0>::Result D1;
172 typedef typename TypeAt<D,1>::Result D2;
173 typedef typename TypeAt<D,2>::Result D3;
174 typedef typename TypeAt<D,3>::Result D4;
176 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
177 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
178 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
179 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value };
193 template<
typename TL
195 struct HasCyclicDependencyHelper<TL,D,5>
197 typedef typename TypeAt<D,0>::Result D1;
198 typedef typename TypeAt<D,1>::Result D2;
199 typedef typename TypeAt<D,2>::Result D3;
200 typedef typename TypeAt<D,3>::Result D4;
201 typedef typename TypeAt<D,4>::Result D5;
203 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
204 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
205 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
206 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
207 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value };
221 template<
typename TL
223 struct HasCyclicDependencyHelper<TL,D,6>
225 typedef typename TypeAt<D,0>::Result D1;
226 typedef typename TypeAt<D,1>::Result D2;
227 typedef typename TypeAt<D,2>::Result D3;
228 typedef typename TypeAt<D,3>::Result D4;
229 typedef typename TypeAt<D,4>::Result D5;
230 typedef typename TypeAt<D,5>::Result D6;
232 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
233 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
234 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
235 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
236 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
237 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value };
251 template<
typename TL
253 struct HasCyclicDependencyHelper<TL,D,7>
255 typedef typename TypeAt<D,0>::Result D1;
256 typedef typename TypeAt<D,1>::Result D2;
257 typedef typename TypeAt<D,2>::Result D3;
258 typedef typename TypeAt<D,3>::Result D4;
259 typedef typename TypeAt<D,4>::Result D5;
260 typedef typename TypeAt<D,5>::Result D6;
261 typedef typename TypeAt<D,6>::Result D7;
263 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
264 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
265 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
266 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
267 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
268 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value ||
269 HasCyclicDependency<D7,TL,Contains<TL,D7>::value>::value };
283 template<
typename TL
285 struct HasCyclicDependencyHelper<TL,D,8>
287 typedef typename TypeAt<D,0>::Result D1;
288 typedef typename TypeAt<D,1>::Result D2;
289 typedef typename TypeAt<D,2>::Result D3;
290 typedef typename TypeAt<D,3>::Result D4;
291 typedef typename TypeAt<D,4>::Result D5;
292 typedef typename TypeAt<D,5>::Result D6;
293 typedef typename TypeAt<D,6>::Result D7;
294 typedef typename TypeAt<D,7>::Result D8;
296 enum { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
297 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
298 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
299 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
300 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
301 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value ||
302 HasCyclicDependency<D7,TL,Contains<TL,D7>::value>::value ||
303 HasCyclicDependency<D8,TL,Contains<TL,D8>::value>::value };
328 ,
bool C=Contains<TL,T>::value >
329 struct HasCyclicDependency
331 typedef typename Append<TL,T>::Result ETL;
332 enum { value = HasCyclicDependencyHelper<ETL,typename T::Dependencies>::value };
349 struct HasCyclicDependency<T,TL,true>
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;
585 ,
typename D1 = NullType
586 ,
typename D2 = NullType
587 ,
typename D3 = NullType
588 ,
typename D4 = NullType
589 ,
typename D5 = NullType
590 ,
typename D6 = NullType
591 ,
typename D7 = NullType
592 ,
typename D8 = NullType >
651 static boost::shared_ptr<T> instance()
654 static boost::shared_ptr<T> object(
new T() );
765 static boost::shared_ptr<T> instance()
768 static boost::shared_ptr<T> object(
new T() );
823 class Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType> :
private NonCopyable
828 typedef Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType>
SingletonType;
875 static boost::shared_ptr<T> instance()
878 static boost::shared_ptr<T> object(
new T() );
931 class Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType> :
private NonCopyable
936 typedef Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType>
SingletonType;
980 static boost::shared_ptr<T> instance()
983 static boost::shared_ptr<T> object(
new T() );
1029 template<
typename T
1034 class Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType> :
private NonCopyable
1039 typedef Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType>
SingletonType;
1080 static boost::shared_ptr<T> instance()
1083 static boost::shared_ptr<T> object(
new T() );
1128 template<
typename T
1132 class Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1137 typedef Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1175 static boost::shared_ptr<T> instance()
1178 static boost::shared_ptr<T> object(
new T() );
1222 template<
typename T
1225 class Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1230 typedef Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1265 static boost::shared_ptr<T> instance()
1268 static boost::shared_ptr<T> object(
new T() );
1311 template<
typename T
1313 class Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1318 typedef Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1350 static boost::shared_ptr<T> instance()
1353 static boost::shared_ptr<T> object(
new T() );
1395 template<
typename T >
1396 class Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1401 typedef Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1404 typedef NullType Dependencies;
1430 static boost::shared_ptr<T> instance()
1433 static boost::shared_ptr<T> object(
new T() );
1459 template<
typename T
1468 boost::mutex Singleton<T,A,B,C,D,E,F,G,H>::instanceMutex_;
1470 template<
typename T
1478 boost::mutex Singleton<T,A,B,C,D,E,F,G,NullType>::instanceMutex_;
1480 template<
typename T
1487 boost::mutex Singleton<T,A,B,C,D,E,F,NullType,NullType>::instanceMutex_;
1489 template<
typename T
1495 boost::mutex Singleton<T,A,B,C,D,E,NullType,NullType,NullType>::instanceMutex_;
1497 template<
typename T
1502 boost::mutex Singleton<T,A,B,C,D,NullType,NullType,NullType,NullType>::instanceMutex_;
1504 template<
typename T
1508 boost::mutex Singleton<T,A,B,C,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1510 template<
typename T
1513 boost::mutex Singleton<T,A,B,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1515 template<
typename T
1517 boost::mutex Singleton<T,A,NullType,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;
1519 template<
typename T >
1520 boost::mutex Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType>::instanceMutex_;