219 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			219 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED | ||
|  | #define BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED | ||
|  | 
 | ||
|  | // | ||
|  | //  Copyright 2015 Peter Dimov | ||
|  | // | ||
|  | //  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 | ||
|  | // | ||
|  | 
 | ||
|  | #include <boost/config.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  | 
 | ||
|  | namespace type_traits_detail | ||
|  | { | ||
|  | 
 | ||
|  | template<int I> struct arithmetic_type; | ||
|  | 
 | ||
|  | // Types bool, char, char16_t, char32_t, wchar_t, | ||
|  | // and the signed and unsigned integer types are | ||
|  | // collectively called integral types | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<1> | ||
|  | { | ||
|  |     typedef bool type; | ||
|  |     typedef char (&result_type) [1]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<2> | ||
|  | { | ||
|  |     typedef char type; | ||
|  |     typedef char (&result_type) [2]; | ||
|  | }; | ||
|  | 
 | ||
|  | #ifndef BOOST_NO_INTRINSIC_WCHAR_T | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<3> | ||
|  | { | ||
|  |     typedef wchar_t type; | ||
|  |     typedef char (&result_type) [3]; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | // There are five standard signed integer types: | ||
|  | // “signed char”, “short int”, “int”, “long int”, and “long long int”. | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<4> | ||
|  | { | ||
|  |     typedef signed char type; | ||
|  |     typedef char (&result_type) [4]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<5> | ||
|  | { | ||
|  |     typedef short type; | ||
|  |     typedef char (&result_type) [5]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<6> | ||
|  | { | ||
|  |     typedef int type; | ||
|  |     typedef char (&result_type) [6]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<7> | ||
|  | { | ||
|  |     typedef long type; | ||
|  |     typedef char (&result_type) [7]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<8> | ||
|  | { | ||
|  |     typedef boost::long_long_type type; | ||
|  |     typedef char (&result_type) [8]; | ||
|  | }; | ||
|  | 
 | ||
|  | // For each of the standard signed integer types, there exists a corresponding | ||
|  | // (but different) standard unsigned integer type: “unsigned char”, “unsigned short int”, | ||
|  | // “unsigned int”, “unsigned long int”, and “unsigned long long int” | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<9> | ||
|  | { | ||
|  |     typedef unsigned char type; | ||
|  |     typedef char (&result_type) [9]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<10> | ||
|  | { | ||
|  |     typedef unsigned short type; | ||
|  |     typedef char (&result_type) [10]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<11> | ||
|  | { | ||
|  |     typedef unsigned int type; | ||
|  |     typedef char (&result_type) [11]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<12> | ||
|  | { | ||
|  |     typedef unsigned long type; | ||
|  |     typedef char (&result_type) [12]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<13> | ||
|  | { | ||
|  |     typedef boost::ulong_long_type type; | ||
|  |     typedef char (&result_type) [13]; | ||
|  | }; | ||
|  | 
 | ||
|  | // There are three floating point types: float, double, and long double. | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<14> | ||
|  | { | ||
|  |     typedef float type; | ||
|  |     typedef char (&result_type) [14]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<15> | ||
|  | { | ||
|  |     typedef double type; | ||
|  |     typedef char (&result_type) [15]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<16> | ||
|  | { | ||
|  |     typedef long double type; | ||
|  |     typedef char (&result_type) [16]; | ||
|  | }; | ||
|  | 
 | ||
|  | #if !defined( BOOST_NO_CXX11_CHAR16_T ) | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<17> | ||
|  | { | ||
|  |     typedef char16_t type; | ||
|  |     typedef char (&result_type) [17]; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | #if !defined( BOOST_NO_CXX11_CHAR32_T ) | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<18> | ||
|  | { | ||
|  |     typedef char32_t type; | ||
|  |     typedef char (&result_type) [18]; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined( BOOST_HAS_INT128 ) | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<19> | ||
|  | { | ||
|  |     typedef boost::int128_type type; | ||
|  |     typedef char (&result_type) [19]; | ||
|  | }; | ||
|  | 
 | ||
|  | template<> struct arithmetic_type<20> | ||
|  | { | ||
|  |     typedef boost::uint128_type type; | ||
|  |     typedef char (&result_type) [20]; | ||
|  | }; | ||
|  | 
 | ||
|  | #endif | ||
|  | 
 | ||
|  | template<class T, class U> class common_arithmetic_type | ||
|  | { | ||
|  | private: | ||
|  | 
 | ||
|  |     static arithmetic_type<1>::result_type select( arithmetic_type<1>::type ); | ||
|  |     static arithmetic_type<2>::result_type select( arithmetic_type<2>::type ); | ||
|  | #ifndef BOOST_NO_INTRINSIC_WCHAR_T | ||
|  |     static arithmetic_type<3>::result_type select( arithmetic_type<3>::type ); | ||
|  | #endif | ||
|  |     static arithmetic_type<4>::result_type select( arithmetic_type<4>::type ); | ||
|  |     static arithmetic_type<5>::result_type select( arithmetic_type<5>::type ); | ||
|  |     static arithmetic_type<6>::result_type select( arithmetic_type<6>::type ); | ||
|  |     static arithmetic_type<7>::result_type select( arithmetic_type<7>::type ); | ||
|  |     static arithmetic_type<8>::result_type select( arithmetic_type<8>::type ); | ||
|  |     static arithmetic_type<9>::result_type select( arithmetic_type<9>::type ); | ||
|  |     static arithmetic_type<10>::result_type select( arithmetic_type<10>::type ); | ||
|  |     static arithmetic_type<11>::result_type select( arithmetic_type<11>::type ); | ||
|  |     static arithmetic_type<12>::result_type select( arithmetic_type<12>::type ); | ||
|  |     static arithmetic_type<13>::result_type select( arithmetic_type<13>::type ); | ||
|  |     static arithmetic_type<14>::result_type select( arithmetic_type<14>::type ); | ||
|  |     static arithmetic_type<15>::result_type select( arithmetic_type<15>::type ); | ||
|  |     static arithmetic_type<16>::result_type select( arithmetic_type<16>::type ); | ||
|  | 
 | ||
|  | #if !defined( BOOST_NO_CXX11_CHAR16_T ) | ||
|  |     static arithmetic_type<17>::result_type select( arithmetic_type<17>::type ); | ||
|  | #endif | ||
|  | 
 | ||
|  | #if !defined( BOOST_NO_CXX11_CHAR32_T ) | ||
|  |     static arithmetic_type<18>::result_type select( arithmetic_type<18>::type ); | ||
|  | #endif | ||
|  | 
 | ||
|  | #if defined( BOOST_HAS_INT128 ) | ||
|  |     static arithmetic_type<19>::result_type select( arithmetic_type<19>::type ); | ||
|  |     static arithmetic_type<20>::result_type select( arithmetic_type<20>::type ); | ||
|  | #endif | ||
|  | 
 | ||
|  |     static bool cond(); | ||
|  | 
 | ||
|  | public: | ||
|  | 
 | ||
|  |     typedef typename arithmetic_type< sizeof(select( cond()? T(): U() )) >::type type; | ||
|  | }; | ||
|  | 
 | ||
|  | } // namespace type_traits_detail | ||
|  | 
 | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #endif // #ifndef BOOST_TYPE_TRAITS_DETAIL_COMMON_ARITHMETIC_TYPE_HPP_INCLUDED |