summaryrefslogtreecommitdiff
path: root/shared/loki/Register.h
diff options
context:
space:
mode:
Diffstat (limited to 'shared/loki/Register.h')
-rw-r--r--shared/loki/Register.h134
1 files changed, 134 insertions, 0 deletions
diff --git a/shared/loki/Register.h b/shared/loki/Register.h
new file mode 100644
index 00000000..0ad014ab
--- /dev/null
+++ b/shared/loki/Register.h
@@ -0,0 +1,134 @@
+////////////////////////////////////////////////////////////////////////////////
+// The Loki Library
+// Copyright (c) 2006 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_REGISTER_INC_
+#define LOKI_REGISTER_INC_
+
+// $Id: Register.h 776 2006-11-09 13:12:57Z syntheticpp $
+
+
+#include "TypeManip.h"
+#include "HierarchyGenerators.h"
+
+/// \defgroup RegisterGroup Register
+
+namespace Loki
+{
+
+ ////////////////////////////////////////////////////////////////////////////////
+ //
+ // Helper classes/functions for RegisterByCreateSet
+ //
+ ////////////////////////////////////////////////////////////////////////////////
+
+ ////////////////////////////////////////////////////////////////////////////////
+ /// \ingroup RegisterGroup
+ /// Must be specialized be the user
+ ////////////////////////////////////////////////////////////////////////////////
+ template<class t> bool RegisterFunction();
+
+ ////////////////////////////////////////////////////////////////////////////////
+ /// \ingroup RegisterGroup
+ /// Must be specialized be the user
+ ////////////////////////////////////////////////////////////////////////////////
+ template<class t> bool UnRegisterFunction();
+
+ namespace Private
+ {
+ template<class T>
+ struct RegisterOnCreate
+ {
+ RegisterOnCreate() { RegisterFunction<T>(); }
+ };
+
+ template<class T>
+ struct UnRegisterOnDelete
+ {
+ ~UnRegisterOnDelete() { UnRegisterFunction<T>(); }
+ };
+
+ template<class T>
+ struct RegisterOnCreateElement
+ {
+ RegisterOnCreate<T> registerObj;
+ };
+
+ template<class T>
+ struct UnRegisterOnDeleteElement
+ {
+ UnRegisterOnDelete<T> unregisterObj;
+ };
+ }
+
+ ////////////////////////////////////////////////////////////////////////////////
+ /// \class RegisterOnCreateSet
+ ///
+ /// \ingroup RegisterGroup
+ /// Implements a generic register class which registers classes of a typelist
+ ///
+ /// \par Usage
+ /// see test/Register
+ ////////////////////////////////////////////////////////////////////////////////
+
+ template<typename ElementList>
+ struct RegisterOnCreateSet
+ : GenScatterHierarchy<ElementList, Private::RegisterOnCreateElement>
+ {};
+
+ ////////////////////////////////////////////////////////////////////////////////
+ /// \class UnRegisterOnDeleteSet
+ ///
+ /// \ingroup RegisterGroup
+ /// Implements a generic register class which unregisters classes of a typelist
+ ///
+ /// \par Usage
+ /// see test/Register
+ ////////////////////////////////////////////////////////////////////////////////
+ template<typename ElementList>
+ struct UnRegisterOnDeleteSet
+ : GenScatterHierarchy<ElementList, Private::UnRegisterOnDeleteElement>
+ {};
+
+
+ ////////////////////////////////////////////////////////////////////////////////
+ /// \def LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST )
+ ///
+ /// \ingroup RegisterGroup
+ /// Check if CLASS is in the typelist LIST.
+ ///
+ /// \par Usage
+ /// see test/Register
+ ////////////////////////////////////////////////////////////////////////////////
+
+
+#define LOKI_CONCATE(a,b,c,d) a ## b ## c ## d
+#define LOKI_CONCAT(a,b,c,d) LOKI_CONCATE(a,b,c,d)
+
+#define LOKI_CHECK_CLASS_IN_LIST( CLASS , LIST ) \
+ \
+ struct LOKI_CONCAT(check_,CLASS,_isInList_,LIST) \
+ { \
+ typedef int LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList_,LIST); \
+ }; \
+ typedef Loki::Select<Loki::TL::IndexOf<LIST, CLASS>::value == -1, \
+ CLASS, \
+ LOKI_CONCAT(check_,CLASS,_isInList_,LIST)> \
+ ::Result LOKI_CONCAT(CLASS,isInList,LIST,result); \
+ typedef LOKI_CONCAT(CLASS,isInList,LIST,result):: \
+ LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList_,LIST) \
+ LOKI_CONCAT(ERROR_class_,CLASS,_isNotInList__,LIST);
+
+
+} // namespace Loki
+
+
+#endif // end file guardian
+
bgstack15