summaryrefslogtreecommitdiff
path: root/shared/loki/Register.h
blob: 2b549381b25152bc69f93e66e9db8b7ca4281b8f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
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