// 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 #include #include #include #include namespace boost { namespace range_detail { template class has_member_size_impl { private: template class check { }; template static boost::uint8_t f(check*); template static boost::uint16_t f(...); public: static const bool value = (sizeof(f(0)) == sizeof(boost::uint8_t)); typedef typename mpl::if_c< (sizeof(f(0)) == sizeof(boost::uint8_t)), mpl::true_, mpl::false_ >::type type; }; template struct has_member_size { typedef typename mpl::and_< typename is_class::type, typename has_member_size_impl::type >::type type; static const bool value = is_class::value && has_member_size_impl::value; }; } // namespace range_detail }// namespace boost #endif // include guard