Horizon
satisfy_boost_range.hpp
1 // Range v3 library
2 //
3 // Copyright Eric Niebler 2014-present
4 //
5 // Use, modification and distribution is subject to the
6 // Boost Software License, Version 1.0. (See accompanying
7 // file LICENSE_1_0.txt or copy at
8 // http://www.boost.org/LICENSE_1_0.txt)
9 //
10 // Project home: https://github.com/ericniebler/range-v3
11 //
12 
13 #ifndef RANGES_V3_DETAIL_SATISFY_BOOST_RANGE_HPP
14 #define RANGES_V3_DETAIL_SATISFY_BOOST_RANGE_HPP
15 
16 #include <meta/meta.hpp>
17 
18 #include <range/v3/range_fwd.hpp>
19 
22 
23 #ifndef RANGES_DOXYGEN_INVOKED
24 namespace boost
25 {
28  template<typename T, typename U>
30 
33  template<typename T, typename U>
35 
38  template<typename T>
39  struct range_value;
40 
43  template<typename T>
44  struct range_size;
45 } // namespace boost
46 
48 #define RANGES_SATISFY_BOOST_RANGE(view_name) \
49  namespace boost \
50  { \
51  template<typename... Ts> \
52  struct range_mutable_iterator< \
53  view_name<Ts...>, \
54  ::meta::if_c<(bool)::ranges::common_range<view_name<Ts...>>>> \
55  { \
56  using type = ::ranges::iterator_t<view_name<Ts...>>; \
57  }; \
58  template<typename... Ts> \
59  struct range_const_iterator< \
60  view_name<Ts...>, \
61  ::meta::if_c<(bool)::ranges::common_range<view_name<Ts...> const>>> \
62  { \
63  using type = ::ranges::iterator_t<view_name<Ts...> const>; \
64  }; \
65  template<typename... Ts> \
66  struct range_value<view_name<Ts...>> \
67  { \
68  using type = ::ranges::range_value_t<view_name<Ts...>>; \
69  }; \
70  template<typename... Ts> \
71  struct range_size<view_name<Ts...>> \
72  : ::meta::if_c<(bool)::ranges::common_range<view_name<Ts...>>, \
73  ::meta::defer<::ranges::range_size_t, view_name<Ts...>>, \
74  ::meta::nil_> \
75  {}; \
76  template<typename... Ts> \
77  struct range_size<view_name<Ts...> const> \
78  : ::meta::if_c<(bool)::ranges::common_range<view_name<Ts...> const>, \
79  ::meta::defer<::ranges::range_size_t, view_name<Ts...> const>, \
80  ::meta::nil_> \
81  {}; \
82  }
83 #else
84 #define RANGES_SATISFY_BOOST_RANGE(view_name)
85 #endif
86 
87 #endif
Tiny meta-programming library.
Boost Range specialisation point, for making Boost ranges out of range-v3 views.
Definition: satisfy_boost_range.hpp:34
Boost Range specialisation point, for making Boost ranges out of range-v3 views.
Definition: satisfy_boost_range.hpp:29
Boost Range specialisation point, for making Boost ranges out of range-v3 views.
Definition: satisfy_boost_range.hpp:44
Boost Range specialisation point, for making Boost ranges out of range-v3 views.
Definition: satisfy_boost_range.hpp:39