35 #ifndef _BLAZE_UTIL_SINGLETON_SINGLETON_H_
36 #define _BLAZE_UTIL_SINGLETON_SINGLETON_H_
60 template<
typename >
class Dependency;
83 struct HasCyclicDependencyHelper;
98 struct HasCyclicDependencyHelper<TL,
NullType,N>
100 enum :
bool { value = 0 };
114 template<
typename TL
116 struct HasCyclicDependencyHelper<TL,D,1>
118 typedef typename TypeAt<D,0>::Result D1;
120 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value };
134 template<
typename TL
136 struct HasCyclicDependencyHelper<TL,D,2>
138 typedef typename TypeAt<D,0>::Result D1;
139 typedef typename TypeAt<D,1>::Result D2;
141 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
142 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value };
156 template<
typename TL
158 struct HasCyclicDependencyHelper<TL,D,3>
160 typedef typename TypeAt<D,0>::Result D1;
161 typedef typename TypeAt<D,1>::Result D2;
162 typedef typename TypeAt<D,2>::Result D3;
164 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
165 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
166 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value };
180 template<
typename TL
182 struct HasCyclicDependencyHelper<TL,D,4>
184 typedef typename TypeAt<D,0>::Result D1;
185 typedef typename TypeAt<D,1>::Result D2;
186 typedef typename TypeAt<D,2>::Result D3;
187 typedef typename TypeAt<D,3>::Result D4;
189 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
190 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
191 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
192 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value };
206 template<
typename TL
208 struct HasCyclicDependencyHelper<TL,D,5>
210 typedef typename TypeAt<D,0>::Result D1;
211 typedef typename TypeAt<D,1>::Result D2;
212 typedef typename TypeAt<D,2>::Result D3;
213 typedef typename TypeAt<D,3>::Result D4;
214 typedef typename TypeAt<D,4>::Result D5;
216 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
217 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
218 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
219 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
220 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value };
234 template<
typename TL
236 struct HasCyclicDependencyHelper<TL,D,6>
238 typedef typename TypeAt<D,0>::Result D1;
239 typedef typename TypeAt<D,1>::Result D2;
240 typedef typename TypeAt<D,2>::Result D3;
241 typedef typename TypeAt<D,3>::Result D4;
242 typedef typename TypeAt<D,4>::Result D5;
243 typedef typename TypeAt<D,5>::Result D6;
245 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
246 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
247 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
248 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
249 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
250 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value };
264 template<
typename TL
266 struct HasCyclicDependencyHelper<TL,D,7>
268 typedef typename TypeAt<D,0>::Result D1;
269 typedef typename TypeAt<D,1>::Result D2;
270 typedef typename TypeAt<D,2>::Result D3;
271 typedef typename TypeAt<D,3>::Result D4;
272 typedef typename TypeAt<D,4>::Result D5;
273 typedef typename TypeAt<D,5>::Result D6;
274 typedef typename TypeAt<D,6>::Result D7;
276 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
277 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
278 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
279 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
280 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
281 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value ||
282 HasCyclicDependency<D7,TL,Contains<TL,D7>::value>::value };
296 template<
typename TL
298 struct HasCyclicDependencyHelper<TL,D,8>
300 typedef typename TypeAt<D,0>::Result D1;
301 typedef typename TypeAt<D,1>::Result D2;
302 typedef typename TypeAt<D,2>::Result D3;
303 typedef typename TypeAt<D,3>::Result D4;
304 typedef typename TypeAt<D,4>::Result D5;
305 typedef typename TypeAt<D,5>::Result D6;
306 typedef typename TypeAt<D,6>::Result D7;
307 typedef typename TypeAt<D,7>::Result D8;
309 enum :
bool { value = HasCyclicDependency<D1,TL,Contains<TL,D1>::value>::value ||
310 HasCyclicDependency<D2,TL,Contains<TL,D2>::value>::value ||
311 HasCyclicDependency<D3,TL,Contains<TL,D3>::value>::value ||
312 HasCyclicDependency<D4,TL,Contains<TL,D4>::value>::value ||
313 HasCyclicDependency<D5,TL,Contains<TL,D5>::value>::value ||
314 HasCyclicDependency<D6,TL,Contains<TL,D6>::value>::value ||
315 HasCyclicDependency<D7,TL,Contains<TL,D7>::value>::value ||
316 HasCyclicDependency<D8,TL,Contains<TL,D8>::value>::value };
341 ,
bool C=Contains<TL,T>::value >
342 struct HasCyclicDependency
344 typedef typename Append<TL,T>::Result ETL;
345 enum :
bool { value = HasCyclicDependencyHelper<ETL,typename T::Dependencies>::value };
362 struct HasCyclicDependency<T,TL,true>
364 enum :
bool { value = 1 };
384 #define BLAZE_DETECT_CYCLIC_LIFETIME_DEPENDENCY(T) \
385 static_assert( ( !blaze::HasCyclicDependency<T,blaze::NullType>::value ), "Cyclic dependency detected" )
404 #define BLAZE_BEFRIEND_SINGLETON \
405 template< typename, typename, typename, typename, typename, typename, typename, typename, typename > friend class blaze::Singleton; \
406 template< typename, typename, bool > friend struct blaze::HasCyclicDependency; \
407 template< typename > friend class blaze::Dependency;
555 ,
typename D1 = NullType
556 ,
typename D2 = NullType
557 ,
typename D3 = NullType
558 ,
typename D4 = NullType
559 ,
typename D5 = NullType
560 ,
typename D6 = NullType
561 ,
typename D7 = NullType
562 ,
typename D8 = NullType >
621 static std::shared_ptr<T> instance()
623 static std::shared_ptr<T> object(
new T() );
726 static std::shared_ptr<T> instance()
728 static std::shared_ptr<T> object(
new T() );
775 class Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType> :
private NonCopyable
780 typedef Singleton<T,D1,D2,D3,D4,D5,D6,NullType,NullType>
SingletonType;
827 static std::shared_ptr<T> instance()
829 static std::shared_ptr<T> object(
new T() );
874 class Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType> :
private NonCopyable
879 typedef Singleton<T,D1,D2,D3,D4,D5,NullType,NullType,NullType>
SingletonType;
923 static std::shared_ptr<T> instance()
925 static std::shared_ptr<T> object(
new T() );
968 class Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType> :
private NonCopyable
973 typedef Singleton<T,D1,D2,D3,D4,NullType,NullType,NullType,NullType>
SingletonType;
1014 static std::shared_ptr<T> instance()
1016 static std::shared_ptr<T> object(
new T() );
1053 template<
typename T
1057 class Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1062 typedef Singleton<T,D1,D2,D3,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1100 static std::shared_ptr<T> instance()
1102 static std::shared_ptr<T> object(
new T() );
1138 template<
typename T
1141 class Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1146 typedef Singleton<T,D1,D2,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1181 static std::shared_ptr<T> instance()
1183 static std::shared_ptr<T> object(
new T() );
1218 template<
typename T
1220 class Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1225 typedef Singleton<T,D1,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1257 static std::shared_ptr<T> instance()
1259 static std::shared_ptr<T> object(
new T() );
1293 template<
typename T >
1294 class Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType> :
private NonCopyable
1299 typedef Singleton<T,NullType,NullType,NullType,NullType,NullType,NullType,NullType,NullType>
SingletonType;
1302 typedef NullType Dependencies;
1328 static std::shared_ptr<T> instance()
1330 static std::shared_ptr<T> object(
new T() );
#define BLAZE_TYPELIST_3(T1, T2, T3)
Type list generation macro.This macro creates a type list consisting of the three types T1...
Definition: TypeList.h:191
Utility type for generic codes.
#define BLAZE_TYPELIST_6(T1, T2, T3, T4, T5, T6)
Type list generation macro.This macro creates a type list consisting of the six types T1...
Definition: TypeList.h:254
std::shared_ptr< D1 > dependency1_
Handle to the first lifetime dependency.
Definition: Singleton.h:633
Base class for non-copyable class instances.
std::shared_ptr< D2 > dependency2_
Handle to the second lifetime dependency.
Definition: Singleton.h:634
std::shared_ptr< D7 > dependency7_
Handle to the seventh lifetime dependency.
Definition: Singleton.h:639
std::shared_ptr< D4 > dependency4_
Handle to the fourth lifetime dependency.
Definition: Singleton.h:636
typedef BLAZE_TYPELIST_8(D1, D2, D3, D4, D5, D6, D7, D8) Dependencies
Type list of all lifetime dependencies.
~Singleton()
Destructor for the Singleton class.
Definition: Singleton.h:613
std::shared_ptr< D8 > dependency8_
Handle to the eighth lifetime dependency.
Definition: Singleton.h:640
std::shared_ptr< D5 > dependency5_
Handle to the fifth lifetime dependency.
Definition: Singleton.h:637
std::shared_ptr< D3 > dependency3_
Handle to the third lifetime dependency.
Definition: Singleton.h:635
Namespace of the Blaze C++ math library.
Definition: Blaze.h:57
std::shared_ptr< D6 > dependency6_
Handle to the sixth lifetime dependency.
Definition: Singleton.h:638
#define BLAZE_TYPELIST_1(T1)
Type list generation macro.This macro creates a type list only consisting of the type T1...
Definition: TypeList.h:149
#define BLAZE_TYPELIST_7(T1, T2, T3, T4, T5, T6, T7)
Type list generation macro.This macro creates a type list consisting of the seven types T1...
Definition: TypeList.h:275
#define BLAZE_CONSTRAINT_MUST_BE_DERIVED_FROM(D, B)
Constraint on the inheritance relationship of a data type.In case D is not derived from B...
Definition: DerivedFrom.h:60
#define BLAZE_TYPELIST_2(T1, T2)
Type list generation macro.This macro creates a type list consisting of the two types T1 and T2...
Definition: TypeList.h:170
Base class for non-copyable class instances.The NonCopyable class is intended to work as a base class...
Definition: NonCopyable.h:63
Constraint on the inheritance relationship of a data type.
Calculating the length of a type list.The Length class can be used to obtain the length of a type lis...
Definition: TypeList.h:369
Base class for all lifetime managed singletons.The Singleton class represents the base class for all ...
Definition: Singleton.h:563
#define BLAZE_TYPELIST_5(T1, T2, T3, T4, T5)
Type list generation macro.This macro creates a type list consisting of the five types T1...
Definition: TypeList.h:233
Header file for a type list implementation.
Utility type for generic codes.The NullType class represents an invalid or terminating data type for ...
Definition: NullType.h:54
Singleton< T, D1, D2, D3, D4, D5, D6, D7, D8 > SingletonType
Type of this Singleton instance.
Definition: Singleton.h:568
#define BLAZE_TYPELIST_4(T1, T2, T3, T4)
Type list generation macro.This macro creates a type list consisting of the four types T1...
Definition: TypeList.h:212
Definition: Singleton.h:61
#define BLAZE_DETECT_CYCLIC_LIFETIME_DEPENDENCY(T)
Constraint on the data type.In case the given data type T is not an integral data type...
Definition: Singleton.h:384
Singleton()
Constructor for the Singleton class.
Definition: Singleton.h:580
Header file for compile time constraints.