67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			67 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
|   | // Boost.Range library | ||
|  | // | ||
|  | // Copyright Neil Groves 2014. | ||
|  | // | ||
|  | // Use, modification and distribution are subject to 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). | ||
|  | // | ||
|  | // For more information, see http://www.boost.org/libs/range/ | ||
|  | // | ||
|  | #ifndef BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP | ||
|  | #define BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP | ||
|  | 
 | ||
|  | #include <boost/type_traits/is_class.hpp> | ||
|  | #include <boost/type_traits/is_member_function_pointer.hpp> | ||
|  | #include <boost/mpl/and.hpp> | ||
|  | #include <boost/mpl/bool.hpp> | ||
|  | #include <boost/cstdint.hpp> | ||
|  | 
 | ||
|  | namespace boost | ||
|  | { | ||
|  |     namespace range_detail | ||
|  |     { | ||
|  | 
 | ||
|  | template<class T> | ||
|  | class has_member_size_impl | ||
|  | { | ||
|  | private: | ||
|  |     template<class U, U> | ||
|  |     class check | ||
|  |     { | ||
|  |     }; | ||
|  | 
 | ||
|  |     template<class C> | ||
|  |     static boost::uint8_t f(check<std::size_t(C::*)(void) const, &C::size>*); | ||
|  | 
 | ||
|  |     template<class C> | ||
|  |     static boost::uint16_t f(...); | ||
|  | 
 | ||
|  | public: | ||
|  |     static const bool value = | ||
|  |         (sizeof(f<T>(0)) == sizeof(boost::uint8_t)); | ||
|  | 
 | ||
|  |     typedef typename mpl::if_c< | ||
|  |         (sizeof(f<T>(0)) == sizeof(boost::uint8_t)), | ||
|  |         mpl::true_, | ||
|  |         mpl::false_ | ||
|  |     >::type type; | ||
|  | }; | ||
|  | 
 | ||
|  | template<class T> | ||
|  | struct has_member_size | ||
|  | { | ||
|  |     typedef typename mpl::and_< | ||
|  |         typename is_class<T>::type, | ||
|  |         typename has_member_size_impl<const T>::type | ||
|  |     >::type type; | ||
|  | 
 | ||
|  |     static const bool value = | ||
|  |         is_class<T>::value && has_member_size_impl<const T>::value; | ||
|  | }; | ||
|  | 
 | ||
|  |     } // namespace range_detail | ||
|  | }// namespace boost | ||
|  |   | ||
|  | #endif // include guard |