Library of Assembled Shared Sources
bool.h
Go to the documentation of this file.
1
/** @file
2
* @author Bram de Greve (bram@cocamware.com)
3
* @author Tom De Muer (tom@cocamware.com)
4
*
5
* *** BEGIN LICENSE INFORMATION ***
6
*
7
* The contents of this file are subject to the Common Public Attribution License
8
* Version 1.0 (the "License"); you may not use this file except in compliance with
9
* the License. You may obtain a copy of the License at
10
* http://lass.sourceforge.net/cpal-license. The License is based on the
11
* Mozilla Public License Version 1.1 but Sections 14 and 15 have been added to cover
12
* use of software over a computer network and provide for limited attribution for
13
* the Original Developer. In addition, Exhibit A has been modified to be consistent
14
* with Exhibit B.
15
*
16
* Software distributed under the License is distributed on an "AS IS" basis, WITHOUT
17
* WARRANTY OF ANY KIND, either express or implied. See the License for the specific
18
* language governing rights and limitations under the License.
19
*
20
* The Original Code is LASS - Library of Assembled Shared Sources.
21
*
22
* The Initial Developer of the Original Code is Bram de Greve and Tom De Muer.
23
* The Original Developer is the Initial Developer.
24
*
25
* All portions of the code written by the Initial Developer are:
26
* Copyright (C) 2004-2011 the Initial Developer.
27
* All Rights Reserved.
28
*
29
* Contributor(s):
30
*
31
* Alternatively, the contents of this file may be used under the terms of the
32
* GNU General Public License Version 2 or later (the GPL), in which case the
33
* provisions of GPL are applicable instead of those above. If you wish to allow use
34
* of your version of this file only under the terms of the GPL and not to allow
35
* others to use your version of this file under the CPAL, indicate your decision by
36
* deleting the provisions above and replace them with the notice and other
37
* provisions required by the GPL License. If you do not delete the provisions above,
38
* a recipient may use your version of this file under either the CPAL or the GPL.
39
*
40
* *** END LICENSE INFORMATION ***
41
*/
42
43
44
45
/** @class lass::meta::Bool
46
* @brief meta boolean type
47
* @author Bram de Greve [BdG]
48
*
49
* The meta boolean type consists of two types True and False.
50
* Bool<flag> converts an C @c bool @a flag to a @e meta bools True or False
51
*
52
* @code
53
* Bool<true>::Type; // resolves to True
54
* @endcode
55
*/
56
57
#ifndef LASS_GUARDIAN_OF_INCLUSION_META_BOOL_H
58
#define LASS_GUARDIAN_OF_INCLUSION_META_BOOL_H
59
60
#include "
meta_common.h
"
61
62
// experimental,
63
// Clang's -Wunused-private-field will warn that dummy_ and biggerThanTrue_ are not used.
64
// Simply using LASS_UNUSED won't work since GCC will then again warn that __attribute__((unused)) is ignored.
65
// Sigh, so, only do LASS_UNUSED if we're Clang.
66
// If this properly works, and we have more insight in this situation, we might move this to some more permanent location ...
67
#if LASS_COMPILER_TYPE == LASS_COMPILER_TYPE_CLANG
68
# define LASS_EXPERIMENTAL_UNUSED_PRIVATE(x) LASS_UNUSED(x)
69
#else
70
# define LASS_EXPERIMENTAL_UNUSED_PRIVATE(x) x
71
#endif
72
73
namespace
lass
74
{
75
namespace
meta
76
{
77
78
/** meta true
79
* @relates Bool
80
*/
81
class
True
82
{
83
public
:
84
typedef
True
Type;
85
enum
{ value =
true
};
86
private
:
87
char
LASS_EXPERIMENTAL_UNUSED_PRIVATE(dummy_);
88
};
89
90
/** meta false
91
* @relates Bool
92
*/
93
struct
False
94
{
95
public
:
96
typedef
False
Type;
97
enum
{ value =
false
};
98
private
:
99
True
LASS_EXPERIMENTAL_UNUSED_PRIVATE(biggerThanTrue_[2]);
100
};
101
102
103
104
template
<
bool
flag>
105
struct
Bool
:
106
public
True
107
{
108
};
109
110
template
<>
111
struct
Bool
<false>:
112
public
False
113
{
114
};
115
116
// --- logic operators -----------------------------------------------------------------------------
117
118
/** meta NOT
119
* @relates Bool
120
*/
121
template
<
typename
Operand>
struct
Not
:
122
public
Not
<typename Operand::Type>
123
{
124
};
125
template
<>
struct
Not
<
False
>:
public
True
{};
126
template
<>
struct
Not<True>:
public
False {};
127
128
129
130
/** meta AND
131
* @relates Bool
132
*/
133
template
<
typename
Operand1,
typename
Operand2>
struct
And
:
134
public
And
<typename Operand1::Type, typename Operand2::Type>
135
{
136
};
137
template
<>
struct
And
<
False
,
False
>:
public
False
{};
138
template
<>
struct
And<False, True>:
public
False {};
139
template
<>
struct
And<True, False>:
public
False {};
140
template
<>
struct
And
<
True
,
True
>:
public
True
{};
141
142
143
144
/** meta OR
145
* @relates Bool
146
*/
147
template
<
typename
Operand1,
typename
Operand2>
struct
Or
:
148
public
Or
<typename Operand1::Type, typename Operand2::Type>
149
{
150
};
151
template
<>
struct
Or
<
False
,
False
>:
public
False
{};
152
template
<>
struct
Or<False, True>:
public
True {};
153
template
<>
struct
Or<True, False>:
public
True {};
154
template
<>
struct
Or
<
True
,
True
>:
public
True
{};
155
156
157
158
/** meta XOR
159
* @relates Bool
160
*/
161
template
<
typename
Operand1,
typename
Operand2>
struct
Xor
:
162
public
Xor
<typename Operand1::Type, typename Operand2::Type>
163
{
164
};
165
template
<>
struct
Xor
<
False
,
False
>:
public
False
{};
166
template
<>
struct
Xor<False, True>:
public
True {};
167
template
<>
struct
Xor<True, False>:
public
True {};
168
template
<>
struct
Xor
<
True
,
True
>:
public
False
{};
169
170
171
}
172
173
}
174
175
#endif
176
177
// EOF
lass::meta::True
meta true
Definition
bool.h:82
meta_common.h
lass::meta
library for template meta programming
Definition
bool.h:76
lass
Library for Assembled Shared Sources.
Definition
config.h:53
lass::meta::And
meta AND
Definition
bool.h:135
lass::meta::Bool
meta boolean type
Definition
bool.h:107
lass::meta::False
meta false
Definition
bool.h:94
lass::meta::Not
meta NOT
Definition
bool.h:123
lass::meta::Or
meta OR
Definition
bool.h:149
lass::meta::Xor
meta XOR
Definition
bool.h:163
lass
meta
bool.h
Generated by
1.13.2