Horizon
concepts.hpp
Go to the documentation of this file.
1 // Range v3 library
3 //
4 // Copyright Eric Niebler 2013-present
5 //
6 // Use, modification and distribution is subject to the
7 // Boost Software License, Version 1.0. (See accompanying
8 // file LICENSE_1_0.txt or copy at
9 // http://www.boost.org/LICENSE_1_0.txt)
10 //
11 // Project home: https://github.com/ericniebler/range-v3
12 //
13 
14 #ifndef RANGES_V3_ACTION_CONCEPTS_HPP
15 #define RANGES_V3_ACTION_CONCEPTS_HPP
16 
17 #include <utility>
18 
19 #include <meta/meta.hpp>
20 
21 #include <range/v3/range_fwd.hpp>
22 
25 
26 #include <range/v3/detail/prologue.hpp>
27 
28 namespace ranges
29 {
31  namespace detail
32  {
33  template<typename T>
34  struct movable_input_iterator
35  {
36  using iterator_category = std::input_iterator_tag;
37  using value_type = T;
38  using difference_type = std::ptrdiff_t;
39  using pointer = T *;
40  using reference = T &&;
41 
42  movable_input_iterator() = default;
43  movable_input_iterator & operator++();
44  movable_input_iterator operator++(int);
45  bool operator==(movable_input_iterator const &) const;
46  bool operator!=(movable_input_iterator const &) const;
47  T && operator*() const;
48  };
49  } // namespace detail
51 
54 
55  // clang-format off
59  template<typename T>
60  CPP_concept semi_container =
61  forward_range<T> && default_constructible<uncvref_t<T>> &&
62  movable<uncvref_t<T>> &&
63  !view_<T>;
64 
68  template(typename T)(
69  concept (container_)(T),
70  constructible_from<
71  uncvref_t<T>,
72  detail::movable_input_iterator<range_value_t<T>>,
73  detail::movable_input_iterator<range_value_t<T>>>
74  );
75 
78  template<typename T>
79  CPP_concept container =
80  semi_container<T> &&
81  CPP_concept_ref(ranges::container_, T);
82 
85  template<typename C>
86  CPP_requires(reservable_,
87  requires(C & c, C const & cc) //
88  (
89  c.reserve(ranges::size(c)),
90  cc.capacity(),
91  cc.max_size(),
92  concepts::requires_<same_as<decltype(cc.capacity()),
93  decltype(ranges::size(c))>>,
94  concepts::requires_<same_as<decltype(cc.max_size()),
95  decltype(ranges::size(c))>>
96  ));
97 
100  template<typename C>
101  CPP_concept reservable =
102  container<C> && sized_range<C> && CPP_requires_ref(ranges::reservable_, C);
103 
106  template<typename C, typename I>
107  CPP_requires(reservable_with_assign_,
108  requires(C & c, I i) //
109  (
110  c.assign(i, i)
111  ));
114  template<typename C, typename I>
116  reservable<C> && //
117  input_iterator<I> && //
118  CPP_requires_ref(ranges::reservable_with_assign_, C, I);
119 
122  template<typename C>
124  reservable<C> && random_access_range<C>;
125  // clang-format on
126 
128  namespace detail
129  {
130  template(typename T)(
131  requires container<T>)
132  std::true_type is_lvalue_container_like(T &) noexcept
133  {
134  return {};
135  }
136 
137  template(typename T)(
138  requires container<T>)
140  is_lvalue_container_like(reference_wrapper<T>) noexcept
141  {
142  return {};
143  }
144 
145  template(typename T)(
146  requires container<T>)
147  std::true_type is_lvalue_container_like(std::reference_wrapper<T>) noexcept
148  {
149  return {};
150  }
151 
152  template(typename T)(
153  requires container<T>)
154  std::true_type is_lvalue_container_like(ref_view<T>) noexcept
155  {
156  return {};
157  }
158 
159  template<typename T>
160  using is_lvalue_container_like_t =
161  decltype(detail::is_lvalue_container_like(std::declval<T>()));
162 
163  } // namespace detail
165 
166  // clang-format off
169  template(typename T)(
170  concept (lvalue_container_like_)(T),
171  implicitly_convertible_to<detail::is_lvalue_container_like_t<T>, std::true_type>
172  );
175  template<typename T>
176  CPP_concept lvalue_container_like =
177  forward_range<T> &&
178  CPP_concept_ref(ranges::lvalue_container_like_, T);
179  // clang-format on
181 } // namespace ranges
182 
183 #include <range/v3/detail/epilogue.hpp>
184 
185 #endif
CPP_requires(sized_range_, requires(T &t)(ranges::size(t)))
\concept sized_range_
CPP_concept random_access_reservable
\concept random_access_reservable
Definition: concepts.hpp:123
CPP_concept semi_container
\concept semi_container
Definition: concepts.hpp:60
CPP_concept reservable
\concept reservable
Definition: concepts.hpp:101
CPP_concept lvalue_container_like
\concept lvalue_container_like
Definition: concepts.hpp:176
CPP_concept container
\concept container
Definition: concepts.hpp:79
CPP_concept reservable_with_assign
\concept reservable_with_assign
Definition: concepts.hpp:115
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
not_c< B::type::value > not_
Logically negate the integral constant-wrapped Boolean parameter.
Definition: meta.hpp:1357
Tiny meta-programming library.
Point operator*(double s, const Point &a)
Multiply point by scalar.
Definition: shapes.h:250
Definition: ref.hpp:41
Definition: reference_wrapper.hpp:76