11 #include <type_traits>
16 template<
typename Iterator>
17 [[nodiscard]] constexpr Iterator
safe_next(Iterator first, Iterator last,
size_t n, std::input_iterator_tag)
19 while (n-- && (first != last)) ++first;
23 template<
typename Iterator>
24 [[nodiscard]] constexpr Iterator
safe_next(Iterator first, Iterator last,
size_t n, std::random_access_iterator_tag)
26 return first + std::min<size_t>(n, last - first);
29 template<
typename Iterator>
30 [[nodiscard]] constexpr Iterator
safe_prev(Iterator first, Iterator last,
size_t n, std::bidirectional_iterator_tag)
32 while (n-- && (first != last)) --last;
36 template<
typename Iterator>
37 [[nodiscard]] constexpr Iterator
safe_prev(Iterator first, Iterator last,
size_t n, std::random_access_iterator_tag)
39 return last - std::min<size_t>(n, last - first);
43 template<
typename Range>
47 constexpr
Drop(Range&& range_,
size_t n_)
48 : range(std::forward<Range>(range_))
53 [[nodiscard]] constexpr
auto begin()
const {
56 typename std::iterator_traits<Iterator>::iterator_category());
59 [[nodiscard]] constexpr
auto end()
const {
69 template<
typename Range>
74 : range(std::forward<Range>(range_))
79 [[nodiscard]] constexpr
auto begin()
const {
83 [[nodiscard]] constexpr
auto end()
const {
86 typename std::iterator_traits<Iterator>::iterator_category());
95 template<
typename Range>
99 constexpr
explicit Reverse(Range&& range_)
100 : range(std::forward<Range>(range_))
104 [[nodiscard]] constexpr
auto begin()
const {
return range.rbegin(); }
105 [[nodiscard]] constexpr
auto begin() {
return range.rbegin(); }
106 [[nodiscard]] constexpr
auto end()
const {
return range.rend(); }
107 [[nodiscard]] constexpr
auto end() {
return range.rend(); }
108 [[nodiscard]] constexpr
auto rbegin()
const {
return range.begin(); }
109 [[nodiscard]] constexpr
auto rbegin() {
return range.begin(); }
110 [[nodiscard]] constexpr
auto rend()
const {
return range.end(); }
111 [[nodiscard]] constexpr
auto rend() {
return range.end(); }
121 using return_type = std::invoke_result_t<UnaryOp, decltype(*std::declval<Iterator>())>;
251 [[no_unique_address]] UO op;
254 template<
typename Range,
typename UnaryOp>
class Transform
258 : range(std::forward<Range>(range_)), op(op_)
262 [[nodiscard]] constexpr
auto begin()
const
266 [[nodiscard]] constexpr
auto end()
const
270 [[nodiscard]] constexpr
auto rbegin()
const
274 [[nodiscard]] constexpr
auto rend()
const
279 [[nodiscard]] constexpr
auto size()
const {
return range.size(); }
280 [[nodiscard]] constexpr
auto empty()
const {
return range.empty(); }
282 [[nodiscard]] constexpr
auto front()
const {
return op(range.front()); }
283 [[nodiscard]] constexpr
auto back()
const {
return op(range.back()); }
286 return std::invoke(op, range[idx]);
291 [[no_unique_address]] UnaryOp op;
295 template<
typename Iterator,
typename Sentinel,
typename Predicate>
299 using value_type =
typename std::iterator_traits<Iterator>::value_type;
300 using reference =
typename std::iterator_traits<Iterator>::reference;
301 using pointer =
typename std::iterator_traits<Iterator>::pointer;
306 : it(it_), last(last_), pred(pred_)
308 while (isFiltered()) ++it;
327 }
while (isFiltered());
338 [[nodiscard]] constexpr
bool isFiltered()
340 return (it != last) && !std::invoke(pred, *it);
346 [[no_unique_address]] Predicate pred;
349 template<
typename Range,
typename Predicate>
357 constexpr
Filter(Range&& range_, Predicate pred_)
358 : range(std::forward<Range>(range_)), pred(pred_)
375 [[no_unique_address]] Predicate pred;
380 template<
typename Range>
381 [[nodiscard]] constexpr
auto drop(Range&& range,
size_t n)
386 template<
typename Range>
387 [[nodiscard]] constexpr
auto drop_back(Range&& range,
size_t n)
392 template<
typename Range>
393 [[nodiscard]] constexpr
auto reverse(Range&& range)
398 template<
typename Range,
typename UnaryOp>
399 [[nodiscard]] constexpr
auto transform(Range&& range, UnaryOp op)
404 template<
typename Map> [[nodiscard]] constexpr
auto keys(Map&& map)
407 [](
const auto&
t) ->
auto& {
return std::get<0>(
t); });
410 template<
typename Map> [[nodiscard]] constexpr
auto values(Map&& map)
413 [](
const auto&
t) ->
auto& {
return std::get<1>(
t); });
416 template<
typename ForwardRange,
typename Predicate>
417 [[nodiscard]]
auto filter(ForwardRange&& range, Predicate pred)
constexpr DropBack(Range &&range_, size_t n_)
constexpr auto begin() const
constexpr auto end() const
constexpr Drop(Range &&range_, size_t n_)
constexpr auto begin() const
constexpr auto end() const
constexpr F_Iterator end() const
decltype(std::end(std::declval< Range >())) Sentinel
constexpr Filter(Range &&range_, Predicate pred_)
constexpr F_Iterator begin() const
decltype(std::begin(std::declval< Range >())) Iterator
constexpr pointer operator->() const
typename std::iterator_traits< Iterator >::value_type value_type
constexpr friend bool operator!=(const FilteredIterator &x, const FilteredIterator &y)
typename std::iterator_traits< Iterator >::difference_type difference_type
constexpr reference operator*() const
constexpr FilteredIterator & operator++()
constexpr FilteredIterator operator++(int)
typename std::iterator_traits< Iterator >::pointer pointer
typename std::iterator_traits< Iterator >::reference reference
constexpr friend bool operator==(const FilteredIterator &x, const FilteredIterator &y)
constexpr FilteredIterator(Iterator it_, Sentinel last_, Predicate pred_)
std::forward_iterator_tag iterator_category
constexpr auto rend() const
constexpr auto end() const
constexpr auto begin() const
constexpr auto rbegin() const
constexpr Reverse(Range &&range_)
constexpr KeyMatrixPosition x
Keyboard bindings.
auto copy(InputRange &&range, OutputIter out)
constexpr Iterator safe_next(Iterator first, Iterator last, size_t n, std::input_iterator_tag)
constexpr Iterator safe_prev(Iterator first, Iterator last, size_t n, std::bidirectional_iterator_tag)
auto filter(ForwardRange &&range, Predicate pred)
constexpr auto transform(Range &&range, UnaryOp op)
constexpr auto reverse(Range &&range)
constexpr auto drop(Range &&range, size_t n)
constexpr auto drop_back(Range &&range, size_t n)
constexpr auto keys(Map &&map)
constexpr auto values(Map &&map)
std::conditional_t< std::is_default_constructible_v< T > &&std::is_copy_assignable_v< T >, T, sreg_impl::semiregular< T > > semiregular_t
constexpr auto begin(const zstring_view &x)
constexpr auto end(const zstring_view &x)