/srv/osrm/osrm-backend/third_party/rapidjson/include/rapidjson/internal
Edit: /srv/osrm/osrm-backend/third_party/rapidjson/include/rapidjson/internal/meta.h (6572B)
// Tencent is pleased to support the open source community by making RapidJSON available.
//
// Copyright (C) 2015 THL A29 Limited, a Tencent company, and Milo Yip. All rights reserved.
//
// Licensed under the MIT License (the "License"); you may not use this file except
// in compliance with the License. You may obtain a copy of the License at
//
// http://opensource.org/licenses/MIT
//
// 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 RAPIDJSON_INTERNAL_META_H_
#define RAPIDJSON_INTERNAL_META_H_
#include "../rapidjson.h"
#ifdef __GNUC__
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(effc++)
#endif
#if defined(_MSC_VER)
RAPIDJSON_DIAG_PUSH
RAPIDJSON_DIAG_OFF(6334)
#endif
#if RAPIDJSON_HAS_CXX11_TYPETRAITS
#include
#endif
//@cond RAPIDJSON_INTERNAL
RAPIDJSON_NAMESPACE_BEGIN
namespace internal {
// Helper to wrap/convert arbitrary types to void, useful for arbitrary type matching
template struct Void { typedef void Type; };
///////////////////////////////////////////////////////////////////////////////
// BoolType, TrueType, FalseType
//
template struct BoolType {
static const bool Value = Cond;
typedef BoolType Type;
};
typedef BoolType TrueType;
typedef BoolType FalseType;
///////////////////////////////////////////////////////////////////////////////
// SelectIf, BoolExpr, NotExpr, AndExpr, OrExpr
//
template struct SelectIfImpl { template struct Apply { typedef T1 Type; }; };
template <> struct SelectIfImpl { template struct Apply { typedef T2 Type; }; };
template struct SelectIfCond : SelectIfImpl::template Apply {};
template struct SelectIf : SelectIfCond {};
template struct AndExprCond : FalseType {};
template <> struct AndExprCond : TrueType {};
template struct OrExprCond : TrueType {};
template <> struct OrExprCond : FalseType {};
template struct BoolExpr : SelectIf::Type {};
template struct NotExpr : SelectIf::Type {};
template struct AndExpr : AndExprCond::Type {};
template struct OrExpr : OrExprCond::Type {};
///////////////////////////////////////////////////////////////////////////////
// AddConst, MaybeAddConst, RemoveConst
template struct AddConst { typedef const T Type; };
template struct MaybeAddConst : SelectIfCond {};
template struct RemoveConst { typedef T Type; };
template struct RemoveConst { typedef T Type; };
///////////////////////////////////////////////////////////////////////////////
// IsSame, IsConst, IsMoreConst, IsPointer
//
template struct IsSame : FalseType {};
template struct IsSame : TrueType {};
template struct IsConst : FalseType {};
template struct IsConst : TrueType {};
template
struct IsMoreConst
: AndExpr::Type, typename RemoveConst::Type>,
BoolType::Value >= IsConst::Value> >::Type {};
template struct IsPointer : FalseType {};
template struct IsPointer : TrueType {};
///////////////////////////////////////////////////////////////////////////////
// IsBaseOf
//
#if RAPIDJSON_HAS_CXX11_TYPETRAITS
template struct IsBaseOf
: BoolType< ::std::is_base_of::value> {};
#else // simplified version adopted from Boost
template struct IsBaseOfImpl {
RAPIDJSON_STATIC_ASSERT(sizeof(B) != 0);
RAPIDJSON_STATIC_ASSERT(sizeof(D) != 0);
typedef char (&Yes)[1];
typedef char (&No) [2];
template
static Yes Check(const D*, T);
static No Check(const B*, int);
struct Host {
operator const B*() const;
operator const D*();
};
enum { Value = (sizeof(Check(Host(), 0)) == sizeof(Yes)) };
};
template struct IsBaseOf
: OrExpr, BoolExpr > >::Type {};
#endif // RAPIDJSON_HAS_CXX11_TYPETRAITS
//////////////////////////////////////////////////////////////////////////
// EnableIf / DisableIf
//
template struct EnableIfCond { typedef T Type; };
template struct EnableIfCond { /* empty */ };
template struct DisableIfCond { typedef T Type; };
template struct DisableIfCond { /* empty */ };
template
struct EnableIf : EnableIfCond {};
template
struct DisableIf : DisableIfCond {};
// SFINAE helpers
struct SfinaeTag {};
template struct RemoveSfinaeTag;
template struct RemoveSfinaeTag { typedef T Type; };
#define RAPIDJSON_REMOVEFPTR_(type) \
typename ::RAPIDJSON_NAMESPACE::internal::RemoveSfinaeTag \
< ::RAPIDJSON_NAMESPACE::internal::SfinaeTag&(*) type>::Type
#define RAPIDJSON_ENABLEIF(cond) \
typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \
::Type * = NULL
#define RAPIDJSON_DISABLEIF(cond) \
typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \
::Type * = NULL
#define RAPIDJSON_ENABLEIF_RETURN(cond,returntype) \
typename ::RAPIDJSON_NAMESPACE::internal::EnableIf \
::Type
#define RAPIDJSON_DISABLEIF_RETURN(cond,returntype) \
typename ::RAPIDJSON_NAMESPACE::internal::DisableIf \
::Type
} // namespace internal
RAPIDJSON_NAMESPACE_END
//@endcond
#if defined(__GNUC__) || defined(_MSC_VER)
RAPIDJSON_DIAG_POP
#endif
#endif // RAPIDJSON_INTERNAL_META_H_