summaryrefslogtreecommitdiff
path: root/shared/loki/OrderedStatic.h
diff options
context:
space:
mode:
authorDaniel Wilhelm <daniel@wili.li>2014-04-18 17:01:29 +0200
committerDaniel Wilhelm <daniel@wili.li>2014-04-18 17:01:29 +0200
commit9a2a524f1e311853d08050be2dcdddc09ac7759a (patch)
treed8e4a24169fce88c2d89931d58514889a0bcb0ea /shared/loki/OrderedStatic.h
parent2.3 (diff)
downloadFreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.tar.gz
FreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.tar.bz2
FreeFileSync-9a2a524f1e311853d08050be2dcdddc09ac7759a.zip
3.0
Diffstat (limited to 'shared/loki/OrderedStatic.h')
-rw-r--r--shared/loki/OrderedStatic.h225
1 files changed, 225 insertions, 0 deletions
diff --git a/shared/loki/OrderedStatic.h b/shared/loki/OrderedStatic.h
new file mode 100644
index 00000000..6eaa20b9
--- /dev/null
+++ b/shared/loki/OrderedStatic.h
@@ -0,0 +1,225 @@
+////////////////////////////////////////////////////////////////////////////////
+// The Loki Library
+// Copyright (c) 2005 Peter Kümmel
+// Permission to use, copy, modify, distribute and sell this software for any
+// purpose is hereby granted without fee, provided that the above copyright
+// notice appear in all copies and that both that copyright notice and this
+// permission notice appear in supporting documentation.
+// The author makes no representations about the
+// suitability of this software for any purpose. It is provided "as is"
+// without express or implied warranty.
+////////////////////////////////////////////////////////////////////////////////
+#ifndef LOKI_ORDEREDSTATIC_INC_
+#define LOKI_ORDEREDSTATIC_INC_
+
+// $Id: OrderedStatic.h 751 2006-10-17 19:50:37Z syntheticpp $
+
+
+#include <vector>
+#include <iostream>
+
+#include "LokiExport.h"
+#include "Singleton.h"
+#include "Typelist.h"
+#include "Sequence.h"
+
+// usage: see test/OrderedStatic
+
+namespace Loki
+{
+ namespace Private
+ {
+ ////////////////////////////////////////////////////////////////////////////////
+ // polymorph base class for OrderedStatic template,
+ // necessary because of the creator
+ ////////////////////////////////////////////////////////////////////////////////
+ class LOKI_EXPORT OrderedStaticCreatorFunc
+ {
+ public:
+ virtual void createObject() = 0;
+
+ protected:
+ OrderedStaticCreatorFunc();
+ virtual ~OrderedStaticCreatorFunc();
+
+ private:
+ OrderedStaticCreatorFunc(const OrderedStaticCreatorFunc&);
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // template base clase for OrderedStatic template,
+ // common for all specializations
+ ////////////////////////////////////////////////////////////////////////////////
+ template<class T>
+ class OrderedStaticBase : public OrderedStaticCreatorFunc
+ {
+ public:
+ T& operator*()
+ {
+ return *val_;
+ }
+
+ T* operator->()
+ {
+ return val_;
+ }
+
+ protected:
+
+ OrderedStaticBase(unsigned int longevity) : val_(0), longevity_(longevity)
+ {
+ }
+
+ virtual ~OrderedStaticBase()
+ {
+ }
+
+ void SetLongevity(T* ptr)
+ {
+ val_=ptr;
+ Loki::SetLongevity(val_,longevity_);
+ }
+
+ private:
+ OrderedStaticBase();
+ OrderedStaticBase(const OrderedStaticBase&);
+ OrderedStaticBase& operator=(const OrderedStaticBase&);
+ T* val_;
+ unsigned int longevity_;
+
+ };
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // OrderedStaticManagerClass implements details
+ // OrderedStaticManager is then defined as a Singleton
+ ////////////////////////////////////////////////////////////////////////////////
+ class LOKI_EXPORT OrderedStaticManagerClass
+ {
+ public:
+ OrderedStaticManagerClass();
+ virtual ~OrderedStaticManagerClass();
+
+ typedef void (OrderedStaticCreatorFunc::*Creator)();
+
+ void createObjects();
+ void registerObject(unsigned int longevity,OrderedStaticCreatorFunc*,Creator);
+
+ private:
+ OrderedStaticManagerClass(const OrderedStaticManagerClass&);
+ OrderedStaticManagerClass& operator=(const OrderedStaticManagerClass&);
+
+ struct Data
+ {
+ Data(unsigned int,OrderedStaticCreatorFunc*, Creator);
+ unsigned int longevity;
+ OrderedStaticCreatorFunc* object;
+ Creator creator;
+ };
+
+ std::vector<Data> staticObjects_;
+ unsigned int max_longevity_;
+ unsigned int min_longevity_;
+ };
+
+ }// namespace Private
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // OrderedStaticManager is only a Singleton typedef
+ ////////////////////////////////////////////////////////////////////////////////
+
+ typedef Loki::SingletonHolder
+ <
+ Loki::Private::OrderedStaticManagerClass,
+ Loki::CreateUsingNew,
+ Loki::NoDestroy,
+ Loki::SingleThreaded
+ >
+ OrderedStaticManager;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // template OrderedStatic template:
+ // L : longevity
+ // T : object type
+ // TList : creator parameters
+ ////////////////////////////////////////////////////////////////////////////////
+
+ template<unsigned int L, class T, class TList = Loki::NullType>
+ class OrderedStatic;
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // OrderedStatic specializations
+ ////////////////////////////////////////////////////////////////////////////////
+
+ template<unsigned int L, class T>
+ class OrderedStatic<L, T, Loki::NullType> : public Private::OrderedStaticBase<T>
+ {
+ public:
+ OrderedStatic() : Private::OrderedStaticBase<T>(L)
+ {
+ OrderedStaticManager::Instance().registerObject
+ (L,this,&Private::OrderedStaticCreatorFunc::createObject);
+ }
+
+ void createObject()
+ {
+ Private::OrderedStaticBase<T>::SetLongevity(new T);
+ }
+
+ private:
+ OrderedStatic(const OrderedStatic&);
+ OrderedStatic& operator=(const OrderedStatic&);
+ };
+
+ template<unsigned int L, class T, typename P1>
+ class OrderedStatic<L, T, Loki::Seq<P1> > : public Private::OrderedStaticBase<T>
+ {
+ public:
+ OrderedStatic(P1 p) : Private::OrderedStaticBase<T>(L), para_(p)
+ {
+ OrderedStaticManager::Instance().registerObject
+ (L,this,&Private::OrderedStaticCreatorFunc::createObject);
+ }
+
+ void createObject()
+ {
+ Private::OrderedStaticBase<T>::SetLongevity(new T(para_));
+ }
+
+ private:
+ OrderedStatic();
+ OrderedStatic(const OrderedStatic&);
+ OrderedStatic& operator=(const OrderedStatic&);
+ P1 para_;
+ };
+
+ template<unsigned int L, class T, typename P1>
+ class OrderedStatic<L, T, P1(*)() > : public Private::OrderedStaticBase<T>
+ {
+ public:
+
+ typedef P1(*Func)();
+
+ OrderedStatic(Func p) : Private::OrderedStaticBase<T>(L), para_(p)
+ {
+ OrderedStaticManager::Instance().registerObject
+ (L,this,&Private::OrderedStaticCreatorFunc::createObject);
+ }
+
+ void createObject()
+ {
+ Private::OrderedStaticBase<T>::SetLongevity(new T(para_()));
+ }
+
+ private:
+ OrderedStatic();
+ OrderedStatic(const OrderedStatic&);
+ OrderedStatic& operator=(const OrderedStatic&);
+ Func para_;
+ };
+
+}// namespace Loki
+
+
+#endif // end file guardian
+
bgstack15