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//enable_if_
53template <bool B, class T = void>
54struct enable_if_c
55{
56 typedef T type;
57};
58
59//////////////////////////////////////
60// enable_if_c
61//////////////////////////////////////
62template <class T>
63struct enable_if_c<false, T> {};
64
65//////////////////////////////////////
66// enable_if
67//////////////////////////////////////
68template <class Cond, class T = void>
69struct enable_if : enable_if_c<Cond::value, T> {};
70
71//////////////////////////////////////
72// disable_if
73//////////////////////////////////////
74template <class Cond, class T = void>
75struct disable_if : enable_if_c<!Cond::value, T> {};
76
77//////////////////////////////////////
78// integral_constant
79//////////////////////////////////////
80template<class T, T v>
81struct integral_constant
82{
83 static const T value = v;
84 typedef T value_type;
85 typedef integral_constant<T, v> type;
86};
87
88typedef integral_constant<bool, true > true_type;
89typedef integral_constant<bool, false > false_type;
90
91//////////////////////////////////////
92// identity
93//////////////////////////////////////
94template <class T>
95struct identity
96{
97 typedef T type;
98};
99
100//////////////////////////////////////
101// is_same
102//////////////////////////////////////
103template<class T, class U>
104struct is_same
105{
106 static const bool value = false;
107};
108
109template<class T>
110struct is_same<T, T>
111{
112 static const bool value = true;
113};
114
115} //namespace move_detail {
116} //namespace boost {
117
118#endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP
119