133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			133 lines
		
	
	
		
			3.3 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | ////////////////////////////////////////////////////////////////////////////// | ||
|  | // | ||
|  | // (C) Copyright Ion Gaztanaga 2015-2015. | ||
|  | // Distributed under the Boost Software License, Version 1.0. | ||
|  | // (See accompanying file LICENSE_1_0.txt or copy at | ||
|  | // http://www.boost.org/LICENSE_1_0.txt) | ||
|  | // | ||
|  | // See http://www.boost.org/libs/move for documentation. | ||
|  | // | ||
|  | ////////////////////////////////////////////////////////////////////////////// | ||
|  | 
 | ||
|  | //! \file | ||
|  | 
 | ||
|  | #ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP | ||
|  | #define BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP | ||
|  | 
 | ||
|  | #ifndef BOOST_CONFIG_HPP | ||
|  | #  include <boost/config.hpp> | ||
|  | #endif | ||
|  | # | ||
|  | #if defined(BOOST_HAS_PRAGMA_ONCE) | ||
|  | #  pragma once | ||
|  | #endif | ||
|  | 
 | ||
|  | //Small meta-typetraits to support move | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace move_detail { | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //             if_c | ||
|  | ////////////////////////////////////// | ||
|  | template<bool C, typename T1, typename T2> | ||
|  | struct if_c | ||
|  | { | ||
|  |    typedef T1 type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<typename T1, typename T2> | ||
|  | struct if_c<false,T1,T2> | ||
|  | { | ||
|  |    typedef T2 type; | ||
|  | }; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //             if_ | ||
|  | ////////////////////////////////////// | ||
|  | template<typename T1, typename T2, typename T3> | ||
|  | struct if_ : if_c<0 != T1::value, T2, T3> | ||
|  | {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //          enable_if_c | ||
|  | ////////////////////////////////////// | ||
|  | template <bool B, class T = void> | ||
|  | struct enable_if_c | ||
|  | { | ||
|  |    typedef T type; | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T> | ||
|  | struct enable_if_c<false, T> {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //           enable_if | ||
|  | ////////////////////////////////////// | ||
|  | template <class Cond, class T = void> | ||
|  | struct enable_if : enable_if_c<Cond::value, T> {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //          disable_if_c | ||
|  | ////////////////////////////////////// | ||
|  | template <bool B, class T = void> | ||
|  | struct disable_if_c | ||
|  |    : enable_if_c<!B, T> | ||
|  | {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //          disable_if | ||
|  | ////////////////////////////////////// | ||
|  | template <class Cond, class T = void> | ||
|  | struct disable_if : enable_if_c<!Cond::value, T> {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //          integral_constant | ||
|  | ////////////////////////////////////// | ||
|  | template<class T, T v> | ||
|  | struct integral_constant | ||
|  | { | ||
|  |    static const T value = v; | ||
|  |    typedef T value_type; | ||
|  |    typedef integral_constant<T, v> type; | ||
|  | 
 | ||
|  |      operator T() const { return value; } | ||
|  |    T operator()() const { return value; } | ||
|  | }; | ||
|  | 
 | ||
|  | typedef integral_constant<bool, true >  true_type; | ||
|  | typedef integral_constant<bool, false > false_type; | ||
|  | 
 | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //             is_same | ||
|  | ////////////////////////////////////// | ||
|  | template<class T, class U> | ||
|  | struct is_same | ||
|  | { | ||
|  |    static const bool value = false; | ||
|  | }; | ||
|  |   | ||
|  | template<class T> | ||
|  | struct is_same<T, T> | ||
|  | { | ||
|  |    static const bool value = true; | ||
|  | }; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //        enable_if_same | ||
|  | ////////////////////////////////////// | ||
|  | template <class T, class U, class R = void> | ||
|  | struct enable_if_same : enable_if<is_same<T, U>, R> {}; | ||
|  | 
 | ||
|  | ////////////////////////////////////// | ||
|  | //        disable_if_same | ||
|  | ////////////////////////////////////// | ||
|  | template <class T, class U, class R = void> | ||
|  | struct disable_if_same : disable_if<is_same<T, U>, R> {}; | ||
|  | 
 | ||
|  | }  //namespace move_detail { | ||
|  | }  //namespace boost { | ||
|  | 
 | ||
|  | #endif //#ifndef BOOST_MOVE_DETAIL_META_UTILS_CORE_HPP |