Imported Upstream version 1.57.0
[platform/upstream/boost.git] / boost / range / detail / has_member_size.hpp
1 // Boost.Range library
2 //
3 // Copyright Neil Groves 2014.
4 //
5 // Use, modification and distribution are subject to the Boost Software License,
6 // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
7 // http://www.boost.org/LICENSE_1_0.txt).
8 //
9 // For more information, see http://www.boost.org/libs/range/
10 //
11 #ifndef BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP
12 #define BOOST_RANGE_DETAIL_HAS_MEMBER_SIZE_HPP
13
14 #include <boost/type_traits/is_class.hpp>
15 #include <boost/type_traits/is_member_function_pointer.hpp>
16 #include <boost/mpl/and.hpp>
17 #include <boost/mpl/bool.hpp>
18 #include <boost/cstdint.hpp>
19
20 namespace boost
21 {
22     namespace range_detail
23     {
24
25 template<class T>
26 class has_member_size_impl
27 {
28 private:
29     template<class U, U>
30     class check
31     {
32     };
33
34     template<class C>
35     static boost::uint8_t f(check<std::size_t(C::*)(void) const, &C::size>*);
36
37     template<class C>
38     static boost::uint16_t f(...);
39
40 public:
41     static const bool value =
42         (sizeof(f<T>(0)) == sizeof(boost::uint8_t));
43
44     typedef typename mpl::if_c<
45         (sizeof(f<T>(0)) == sizeof(boost::uint8_t)),
46         mpl::true_,
47         mpl::false_
48     >::type type;
49 };
50
51 template<class T>
52 struct has_member_size
53 {
54     typedef typename mpl::and_<
55         typename is_class<T>::type,
56         typename has_member_size_impl<const T>::type
57     >::type type;
58
59     static const bool value =
60         is_class<T>::value && has_member_size_impl<const T>::value;
61 };
62
63     } // namespace range_detail
64 }// namespace boost
65  
66 #endif // include guard