1//////////////////////////////////////////////////////////////////////////////
2//
3// (C) Copyright Ion Gaztanaga 2015-2015.
4// Distributed under the Boost Software License, Version 1.0.
5// (See accompanying file LICENSE_1_0.txt or copy at
6// http://www.boost.org/LICENSE_1_0.txt)
7//
8// See http://www.boost.org/libs/move for documentation.
9//
10//////////////////////////////////////////////////////////////////////////////
11
12//! \file
13
14#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
15#define BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
16
17#ifndef BOOST_CONFIG_HPP
18# include <boost/config.hpp>
19#endif
20#
21#if defined(BOOST_HAS_PRAGMA_ONCE)
22# pragma once
23#endif
24
25//Small meta-typetraits to support move
26
27namespace boost {
28namespace move_detail {
29
30template<typename T>
31struct voider { typedef void type; };
32
33//////////////////////////////////////
34// if_c
35//////////////////////////////////////
36template<bool C, typename T1, typename T2>
37struct if_c
38{
39 typedef T1 type;
40};
41
42template<typename T1, typename T2>
43struct if_c<false,T1,T2>
44{
45 typedef T2 type;
46};
47
48//////////////////////////////////////
49// if_
50//////////////////////////////////////
51template<typename T1, typename T2, typename T3>
52struct if_ : if_c<0 != T1::value, T2, T3>
53{};
54
55//////////////////////////////////////
56// enable_if_c
57//////////////////////////////////////
58struct enable_if_nat{};
59
60template <bool B, class T = enable_if_nat>
61struct enable_if_c
62{
63 typedef T type;
64};
65
66template <class T>
67struct enable_if_c<false, T> {};
68
69//////////////////////////////////////
70// enable_if
71//////////////////////////////////////
72template <class Cond, class T = enable_if_nat>
73struct enable_if : enable_if_c<Cond::value, T> {};
74
75//////////////////////////////////////
76// disable_if_c
77//////////////////////////////////////
78template <bool B, class T = enable_if_nat>
79struct disable_if_c
80 : enable_if_c<!B, T>
81{};
82
83//////////////////////////////////////
84// disable_if
85//////////////////////////////////////
86template <class Cond, class T = enable_if_nat>
87struct disable_if : enable_if_c<!Cond::value, T> {};
88
89//////////////////////////////////////
90// integral_constant
91//////////////////////////////////////
92template<class T, T v>
93struct integral_constant
94{
95 static const T value = v;
96 typedef T value_type;
97 typedef integral_constant<T, v> type;
98
99 operator T() const { return value; }
100 T operator()() const { return value; }
101};
102
103typedef integral_constant<bool, true > true_type;
104typedef integral_constant<bool, false > false_type;
105
106
107//////////////////////////////////////
108// is_same
109//////////////////////////////////////
110template<class T, class U>
111struct is_same
112{
113 static const bool value = false;
114};
115
116template<class T>
117struct is_same<T, T>
118{
119 static const bool value = true;
120};
121
122//////////////////////////////////////
123// enable_if_same
124//////////////////////////////////////
125template <class T, class U, class R = enable_if_nat>
126struct enable_if_same : enable_if<is_same<T, U>, R> {};
127
128//////////////////////////////////////
129// disable_if_same
130//////////////////////////////////////
131template <class T, class U, class R = enable_if_nat>
132struct disable_if_same : disable_if<is_same<T, U>, R> {};
133
134} //namespace move_detail {
135} //namespace boost {
136
137#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
138

source code of include/boost/move/detail/meta_utils_core.hpp