]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/boost/range/detail/has_member_size.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / 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