/usr/include/ITK-4.12/itkMetaProgrammingLibrary.h is in libinsighttoolkit4-dev 4.12.2-dfsg1-1ubuntu1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
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 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 | /*=========================================================================
*
* Copyright Insight Software Consortium
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0.txt
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*=========================================================================*/
#ifndef itkMetaProgrammingLibrary_h
#define itkMetaProgrammingLibrary_h
#include "itkMacro.h"
namespace itk {
/// \cond HIDE_META_PROGRAMMING
namespace mpl {
/**\defgroup MetaProgrammingLibrary Meta Programming Library
* This module contains definitions aimed at metaprogramming.
* They are mainly codes borrowed or inspired from C++11 or indirectly boost,
* with ITK UpperCamelCase naming policy.
*/
/** borrowed from `<type_traits>`.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
struct TrueType
{
typedef bool ValueType;
typedef TrueType Type;
itkStaticConstMacro(Value, ValueType, true);
operator ValueType() { return Value; }
};
/** borrowed from `<type_traits>`.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
struct FalseType
{
typedef bool ValueType;
typedef FalseType Type;
itkStaticConstMacro(Value, ValueType, false);
operator ValueType() { return Value; }
};
/** MPL \c if control-statement.
* \tparam VP Boolean predicate
* \tparam T1 Type returned if the predicate is true
* \tparam T2 Type returned if the predicate is false
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template <bool VP, typename T1, typename T2> struct If;
/// \cond SPECIALIZATION_IMPLEMENTATION
template <typename T1, typename T2> struct If<true , T1, T2>{ typedef T1 Type; };
template <typename T1, typename T2> struct If<false, T1, T2>{ typedef T2 Type; };
/// \endcond
/** MPL \c OR operator on constants.
* \tparam VF1 First boolean expression
* \tparam VF2 Second boolean expression
* \tparam VF3 Third (optional) boolean expression
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < bool VF1, bool VF2, bool VF3=false> struct OrC : TrueType { };
/// \cond SPECIALIZATION_IMPLEMENTATION
template <> struct OrC<false, false,false> : FalseType {};
/// \endcond
/** MPL \c OR operator on types.
* \tparam TF1 First boolean type
* \tparam TF2 Second boolean type
* \tparam VF3 Third (optional) boolean type
*
* This \em overload automatically fetches \c TF1, \c TF2 and \c TF3 values.
* However, beware, it won't work with standard C++ traits or boost traits.
* Indeed, this overload expects the \em value to follow UpperCamelCase ITK
* naming policy instead of the standard snake_case policy.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < typename TF1, typename TF2, typename TF3=FalseType> struct Or : OrC<TF1::Value, TF2::Value, TF3::Value>
{ typedef typename OrC<TF1::Value, TF2::Value, TF3::Value>::Type Type; };
/** MPL \c AND operator on constants.
* \tparam VF1 First boolean expression
* \tparam VF2 Second boolean expression
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < bool VF1, bool VF2> struct AndC : FalseType { };
/// \cond SPECIALIZATION_IMPLEMENTATION
template <> struct AndC<true, true> : TrueType {};
/// \endcond
/** MPL \c AND operator on types.
* \tparam TF1 First boolean type
* \tparam TF2 Second boolean type
*
* This \em overload automatically fetches \c TF1 and \c TF2 values.
* However, beware, it won't work with standard C++ traits or boost traits.
* Indeed, this overload expects the \em value to follow UpperCamelCase ITK
* naming policy instead of the standard snake_case policy.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < typename TF1, typename TF2> struct And : AndC<TF1::Value, TF2::Value>
{ typedef typename AndC<TF1::Value, TF2::Value>::Type Type; };
/** MPL \c XOR operator on constants.
* \tparam VF1 First boolean expression
* \tparam VF2 Second boolean expression
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < bool VF1, bool VF2> struct XorC : FalseType { };
/// \cond SPECIALIZATION_IMPLEMENTATION
template <> struct XorC<true, false> : TrueType {};
template <> struct XorC<false, true> : TrueType {};
/// \endcond
/** MPL \c XOR operator on types.
* \tparam TF1 First boolean type
* \tparam TF2 Second boolean type
*
* This \em overload automatically fetches \c TF1 and \c TF2 values.
* However, beware, it won't work with standard C++ traits or boost traits.
* Indeed, this overload expects the \em value to follow UpperCamelCase ITK
* naming policy instead of the standard snake_case policy.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < typename TF1, typename TF2> struct Xor : XorC<TF1::Value, TF2::Value>
{ typedef typename XorC<TF1::Value, TF2::Value>::Type Type; };
/** MPL \c NOT operator on constants.
* \tparam VF boolean expression to negate
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < bool VF > struct NotC : FalseType { };
/// \cond SPECIALIZATION_IMPLEMENTATION
template <> struct NotC<false> : TrueType {};
template <> struct NotC<true> : FalseType {};
/// \endcond
/** MPL \c NOT operator on types.
* \tparam TF Second boolean type
*
* This \em overload automatically fetches \c TF value.
* However, beware, it won't work with standard C++ traits or boost traits.
* Indeed, this overload expects the \em value to follow UpperCamelCase ITK
* naming policy instead of the standard snake_case policy.
* \ingroup MetaProgrammingLibrary
* \ingroup ITKCommon
*/
template < typename TF> struct Not : NotC<TF::Value>
{ typedef typename NotC<TF::Value>::Type Type; };
} // mpl namespace
// TrueType and FalseType have moved to itk::mpl.
// Expect itk::TrueType and itk::False type to be deprecated.
using mpl::TrueType;
using mpl::FalseType;
/// \endcond
} // itk namespace
#endif // itkMetaProgrammingLibrary_h
|