HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
ranges.hpp
1// Copyright Take Vos 2020-2021.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "coroutine.hpp"
8#include "type_traits.hpp"
9#include <ranges>
10#include <algorithm>
11#include <concepts>
12#include <string>
13#include <string_view>
14#include <type_traits>
15#include <vector>
16
17namespace tt::ranges::views {
18
24template<
25 std::ranges::range Haystack,
26 std::ranges::range Needle,
27 typename SubHaystack = std::conditional_t<
28 is_character_v<std::ranges::range_value_t<Haystack>>,
29 make_string_view_t<std::ranges::range_value_t<Haystack>>,
30 std::ranges::subrange<std::ranges::iterator_t<Haystack>, std::ranges::iterator_t<Haystack>>>>
31[[nodiscard]] generator<SubHaystack> split(Haystack &haystack, Needle needle) noexcept
32{
33 auto it = std::begin(haystack);
34 auto last = std::end(haystack);
35
36 auto needle_first = std::ranges::begin(needle);
37 auto needle_last = std::ranges::end(needle);
38 auto needle_length = std::distance(needle_first, needle_last);
39
40 while (it != last) {
41 auto sep_start = std::search(it, last, needle_first, needle_last);
42 if (sep_start != last) {
43 co_yield SubHaystack{it, sep_start};
44 it = sep_start + needle_length;
45 } else {
46 it = sep_start;
47 }
48 }
49}
50
57[[nodiscard]] inline generator<std::string_view> split(std::string_view haystack, char const *needle = " ") noexcept
58{
59 return split(haystack, std::string{needle});
60}
61
62[[nodiscard]] inline generator<std::string_view> split(std::string &haystack, char const *needle = " ") noexcept
63{
64 return split(haystack, std::string{needle});
65}
66
67[[nodiscard]] inline generator<std::wstring_view> split(std::wstring_view haystack, wchar_t const *needle = L" ") noexcept
68{
69 return split(haystack, std::wstring{needle});
70}
71
72[[nodiscard]] inline generator<std::wstring_view> split(std::wstring &haystack, wchar_t const *needle = L" ") noexcept
73{
74 return split(haystack, std::wstring{needle});
75}
76
77[[nodiscard]] inline generator<std::u8string_view> split(std::u8string_view haystack, char8_t const *needle = u8" ") noexcept
78{
79 return split(haystack, std::u8string{needle});
80}
81
82[[nodiscard]] inline generator<std::u8string_view> split(std::u8string &haystack, char8_t const *needle = u8" ") noexcept
83{
84 return split(haystack, std::u8string{needle});
85}
86
87[[nodiscard]] inline generator<std::u16string_view> split(std::u16string_view haystack, char16_t const *needle = u" ") noexcept
88{
89 return split(haystack, std::u16string{needle});
90}
91
92[[nodiscard]] inline generator<std::u16string_view> split(std::u16string &haystack, char16_t const *needle = u" ") noexcept
93{
94 return split(haystack, std::u16string{needle});
95}
96
97[[nodiscard]] inline generator<std::u32string_view> split(std::u32string_view haystack, char32_t const *needle = U" ") noexcept
98{
99 return split(haystack, std::u32string{needle});
100}
101
102[[nodiscard]] inline generator<std::u32string_view> split(std::u32string &haystack, char32_t const *needle = U" ") noexcept
103{
104 return split(haystack, std::u32string{needle});
105}
107
108} // namespace tt::ranges::views
109
110namespace tt {
111namespace views = tt::ranges::views;
112
116template<typename View>
117[[nodiscard]] std::vector<typename View::value_type> make_vector(View const &view)
118{
120 auto first = std::begin(view);
121 auto last = std::end(view);
122 r.reserve(std::distance(first, last));
123 std::copy(first, last, std::back_inserter(r));
124 return r;
125}
126
130template<typename View>
131[[nodiscard]] std::vector<typename View::value_type> make_vector(View &&view)
132{
134 auto first = std::begin(view);
135 auto last = std::end(view);
136 r.reserve(std::distance(first, last));
137 std::move(first, last, std::back_inserter(r));
138 return r;
139}
140
141} // namespace tt
T back_inserter(T... args)
T begin(T... args)
T copy(T... args)
T distance(T... args)
T end(T... args)
T move(T... args)
T search(T... args)