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
30//////////////////////////////////////
31// if_c
32//////////////////////////////////////
33template<bool C, typename T1, typename T2>
34struct if_c
35{
36 typedef T1 type;
37};
38
39template<typename T1, typename T2>
40struct if_c<false,T1,T2>
41{
42 typedef T2 type;
43};
44
45//////////////////////////////////////
46// if_
47//////////////////////////////////////
48template<typename T1, typename T2, typename T3>
49struct if_ : if_c<0 != T1::value, T2, T3>
50{};
51
52//////////////////////////////////////
53// enable_if_c
54//////////////////////////////////////
55template <bool B, class T = void>
56struct enable_if_c
57{
58 typedef T type;
59};
60
61template <class T>
62struct enable_if_c<false, T> {};
63
64//////////////////////////////////////
65// enable_if
66//////////////////////////////////////
67template <class Cond, class T = void>
68struct enable_if : enable_if_c<Cond::value, T> {};
69
70//////////////////////////////////////
71// disable_if_c
72//////////////////////////////////////
73template <bool B, class T = void>
74struct disable_if_c
75 : enable_if_c<!B, T>
76{};
77
78//////////////////////////////////////
79// disable_if
80//////////////////////////////////////
81template <class Cond, class T = void>
82struct disable_if : enable_if_c<!Cond::value, T> {};
83
84//////////////////////////////////////
85// integral_constant
86//////////////////////////////////////
87template<class T, T v>
88struct integral_constant
89{
90 static const T value = v;
91 typedef T value_type;
92 typedef integral_constant<T, v> type;
93
94 operator T() const { return value; }
95 T operator()() const { return value; }
96};
97
98typedef integral_constant<bool, true > true_type;
99typedef integral_constant<bool, false > false_type;
100
101
102//////////////////////////////////////
103// is_same
104//////////////////////////////////////
105template<class T, class U>
106struct is_same
107{
108 static const bool value = false;
109};
110
111template<class T>
112struct is_same<T, T>
113{
114 static const bool value = true;
115};
116
117//////////////////////////////////////
118// enable_if_same
119//////////////////////////////////////
120template <class T, class U, class R = void>
121struct enable_if_same : enable_if<is_same<T, U>, R> {};
122
123//////////////////////////////////////
124// disable_if_same
125//////////////////////////////////////
126template <class T, class U, class R = void>
127struct disable_if_same : disable_if<is_same<T, U>, R> {};
128
129} //namespace move_detail {
130} //namespace boost {
131
132#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
133