20 #ifndef INCLUDED_RTL_INSTANCE_HXX
21 #define INCLUDED_RTL_INSTANCE_HXX
263 template<
typename Inst,
typename InstCtor,
264 typename Guard,
typename GuardCtor,
265 typename Data = int,
typename DataCtor =
int >
269 static inline Inst * create(InstCtor aInstCtor, GuardCtor aGuardCtor)
272 static Inst * m_pInstance = 0;
274 Inst * p = m_pInstance;
277 Guard aGuard(aGuardCtor());
293 static inline Inst * create(InstCtor aInstCtor, GuardCtor aGuardCtor,
297 static Inst * m_pInstance = 0;
299 Inst * p = m_pInstance;
302 Data aData(aDataCtor());
303 Guard aGuard(aGuardCtor());
307 p = aInstCtor(aData);
319 static inline Inst * create(InstCtor aInstCtor, GuardCtor aGuardCtor,
323 static Inst * m_pInstance = 0;
325 Inst * p = m_pInstance;
328 Guard aGuard(aGuardCtor());
332 p = aInstCtor(rData);
345 #if !defined _MSC_VER
346 static Inst * m_pInstance;
350 #if !defined _MSC_VER
351 template<
typename Inst,
typename InstCtor,
352 typename Guard,
typename GuardCtor,
353 typename Data,
typename DataCtor >
355 rtl_Instance< Inst, InstCtor, Guard, GuardCtor, Data, DataCtor >::m_pInstance
382 #if HAVE_THREADSAFE_STATICS
383 template<
typename T,
typename Unique>
398 template<
typename T,
typename Unique>
408 return *rtl_Instance<
414 struct StaticInstance {
442 #if HAVE_THREADSAFE_STATICS
443 template<
typename T,
typename Data,
typename Unique>
444 class StaticWithArg {
452 static T &
get(
const Data& rData) {
453 static T instance(rData);
463 static T &
get(Data& rData) {
464 static T instance(rData);
469 template<
typename T,
typename Data,
typename Unique>
478 static T &
get(
const Data& rData) {
479 return *rtl_Instance<
480 T, StaticInstanceWithArg,
482 Data >::create( StaticInstanceWithArg(),
493 static T &
get(Data& rData) {
494 return *rtl_Instance<
495 T, StaticInstanceWithArg,
497 Data >::create( StaticInstanceWithArg(),
502 struct StaticInstanceWithArg {
503 T * operator () (
const Data& rData) {
504 static T instance(rData);
508 T * operator () (Data& rData) {
509 static T instance(rData);
524 #if HAVE_THREADSAFE_STATICS
525 template<
typename T,
typename InitAggregate>
526 class StaticAggregate {
536 static T *instance = InitAggregate()();
541 template<
typename T,
typename InitAggregate>
589 #if HAVE_THREADSAFE_STATICS
590 template<
typename T,
typename InitData,
591 typename Unique = InitData,
typename Data = T>
592 class StaticWithInit {
601 static T instance = InitData()();
606 template<
typename T,
typename InitData,
607 typename Unique = InitData,
typename Data = T>
617 return *rtl_Instance<
618 T, StaticInstanceWithInit,
620 Data, InitData >::create( StaticInstanceWithInit(),
625 struct StaticInstanceWithInit {
626 T * operator () ( Data d ) {
627 static T instance(d);
635 #endif // INCLUDED_RTL_INSTANCE_HXX
Helper base class for a late-initialized static variable, implementing the double-checked locking pat...
Definition: instance.hxx:608
Definition: bootstrap.hxx:24
Helper base class for a late-initialized (default-constructed) static variable, implementing the doub...
Definition: instance.hxx:399
Helper base class for a late-initialized (default-constructed) static variable, implementing the doub...
Definition: instance.hxx:470
Helper class for a late-initialized static aggregate, e.g.
Definition: instance.hxx:542
Guard< Mutex > MutexGuard
Definition: mutex.hxx:238
#define OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER()
A platform specific macro needed to make double-checked locking work.
Definition: doublecheckedlocking.h:67
A helper functor for the rtl_Instance template.
Definition: getglobalmutex.hxx:31