You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.5 KiB
67 lines
1.5 KiB
// 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
|