15#ifndef RAPIDJSON_INTERNAL_META_H_
16#define RAPIDJSON_INTERNAL_META_H_
22RAPIDJSON_DIAG_OFF(effc++)
25#if defined(_MSC_VER) && !defined(__clang__)
27RAPIDJSON_DIAG_OFF(6334)
30#if RAPIDJSON_HAS_CXX11_TYPETRAITS
39template <
typename T>
struct Void {
typedef void Type; };
44template <
bool Cond>
struct BoolType {
45 static const bool Value = Cond;
46 typedef BoolType
Type;
48typedef BoolType<true> TrueType;
49typedef BoolType<false> FalseType;
56template <
bool C>
struct SelectIfImpl {
template <
typename T1,
typename T2>
struct Apply {
typedef T1
Type; }; };
57template <>
struct SelectIfImpl<false> {
template <
typename T1,
typename T2>
struct Apply {
typedef T2
Type; }; };
58template <
bool C,
typename T1,
typename T2>
struct SelectIfCond : SelectIfImpl<C>
::template Apply<T1,T2> {};
59template <
typename C,
typename T1,
typename T2>
struct SelectIf : SelectIfCond<C::Value, T1, T2> {};
61template <
bool Cond1,
bool Cond2>
struct AndExprCond : FalseType {};
62template <>
struct AndExprCond<true, true> : TrueType {};
63template <
bool Cond1,
bool Cond2>
struct OrExprCond : TrueType {};
64template <>
struct OrExprCond<false, false> : FalseType {};
66template <
typename C>
struct BoolExpr : SelectIf<C,TrueType,FalseType>
::Type {};
67template <
typename C>
struct NotExpr : SelectIf<C,FalseType,TrueType>
::Type {};
68template <
typename C1,
typename C2>
struct AndExpr : AndExprCond<C1::Value, C2::Value>
::Type {};
69template <
typename C1,
typename C2>
struct OrExpr : OrExprCond<C1::Value, C2::Value>
::Type {};
74template <
typename T>
struct AddConst {
typedef const T Type; };
75template <
bool Constify,
typename T>
struct MaybeAddConst : SelectIfCond<Constify, const T, T> {};
76template <
typename T>
struct RemoveConst {
typedef T Type; };
77template <
typename T>
struct RemoveConst<const
T> {
typedef T Type; };
83template <
typename T,
typename U>
struct IsSame : FalseType {};
84template <
typename T>
struct IsSame<
T,
T> : TrueType {};
86template <
typename T>
struct IsConst : FalseType {};
87template <
typename T>
struct IsConst<const
T> : TrueType {};
89template <
typename CT,
typename T>
91 : AndExpr<IsSame<typename RemoveConst<CT>::Type, typename RemoveConst<T>::Type>,
92 BoolType<IsConst<CT>::Value >= IsConst<T>::Value> >
::Type {};
94template <
typename T>
struct IsPointer : FalseType {};
95template <
typename T>
struct IsPointer<
T*> : TrueType {};
100#if RAPIDJSON_HAS_CXX11_TYPETRAITS
102template <
typename B,
typename D>
struct IsBaseOf
103 : BoolType< ::std::is_base_of<B,D>::value> {};
107template<
typename B,
typename D>
struct IsBaseOfImpl {
111 typedef char (&Yes)[1];
112 typedef char (&No) [2];
114 template <
typename T>
115 static Yes Check(
const D*,
T);
116 static No Check(
const B*,
int);
119 operator const B*()
const;
123 enum {
Value = (
sizeof(Check(Host(), 0)) ==
sizeof(Yes)) };
126template <
typename B,
typename D>
struct IsBaseOf
127 : OrExpr<IsSame<B, D>, BoolExpr<IsBaseOfImpl<B, D> > >
::Type {};
135template <
bool Condition,
typename T =
void>
struct EnableIfCond {
typedef T Type; };
136template <
typename T>
struct EnableIfCond<false,
T> { };
138template <
bool Condition,
typename T =
void>
struct DisableIfCond {
typedef T Type; };
139template <
typename T>
struct DisableIfCond<true,
T> { };
141template <
typename Condition,
typename T =
void>
142struct EnableIf : EnableIfCond<Condition::Value, T> {};
144template <
typename Condition,
typename T =
void>
145struct DisableIf : DisableIfCond<Condition::Value, T> {};
149template <
typename T>
struct RemoveSfinaeTag;
150template <
typename T>
struct RemoveSfinaeTag<SfinaeTag&(*)(
T)> {
typedef T Type; };
152#define RAPIDJSON_REMOVEFPTR_(type) \
153 typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \
154 < ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type
156#define RAPIDJSON_ENABLEIF(cond) \
157 typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \
158 <RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL
160#define RAPIDJSON_DISABLEIF(cond) \
161 typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \
162 <RAPIDJSON_REMOVEFPTR_(cond)>::Type * = NULL
164#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \
165 typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \
166 <RAPIDJSON_REMOVEFPTR_(cond), \
167 RAPIDJSON_REMOVEFPTR_(returntype)>::Type
169#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \
170 typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \
171 <RAPIDJSON_REMOVEFPTR_(cond), \
172 RAPIDJSON_REMOVEFPTR_(returntype)>::Type
178#if defined(_MSC_VER) && !defined(__clang__)
#define D(var, file, col, who, lev,...)
#define RAPIDJSON_NAMESPACE_BEGIN
provide custom rapidjson namespace (opening expression)
#define RAPIDJSON_NAMESPACE_END
provide custom rapidjson namespace (closing expression)
#define T(meth, val, expected)
common definitions and configuration
#define RAPIDJSON_STATIC_ASSERT(x)
(Internal) macro to check for conditions at compile-time
yubihsm_pkcs11_object_template template