Horizon
Loading...
Searching...
No Matches
concepts.hpp
Go to the documentation of this file.
1
2// 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
22
25
26#include <range/v3/detail/prologue.hpp>
27
28namespace 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>
115 CPP_concept reservable_with_assign =
116 reservable<C> && //
117 input_iterator<I> && //
118 CPP_requires_ref(ranges::reservable_with_assign_, C, I);
119
122 template<typename C>
123 CPP_concept random_access_reservable =
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
The container_ concept std::vector is a container, std::array is not.
The lvalue_container_like_ concept.
The reservable_ concept.
The reservable_with_assign_ concept.
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