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 <concepts>
11#include <string>
12#include <string_view>
13#include <type_traits>
14#include <vector>
15
16namespace tt::ranges::views {
17
23template<
24 std::ranges::range Haystack,
25 std::ranges::range Needle,
26 typename SubHaystack = std::conditional_t<
27 is_character_v<std::ranges::range_value_t<Haystack>>,
28 make_string_view_t<std::ranges::range_value_t<Haystack>>,
29 std::ranges::subrange<std::ranges::iterator_t<Haystack>, std::ranges::iterator_t<Haystack>>>>
30[[nodiscard]] generator<SubHaystack> split(Haystack &haystack, Needle needle) noexcept
31{
32 auto it = std::begin(haystack);
33 auto last = std::end(haystack);
34
35 auto needle_first = std::ranges::begin(needle);
36 auto needle_last = std::ranges::end(needle);
37 auto needle_length = std::distance(needle_first, needle_last);
38
39 while (it != last) {
40 auto sep_start = std::search(it, last, needle_first, needle_last);
41 if (sep_start != last) {
42 co_yield SubHaystack{it, sep_start};
43 it = sep_start + needle_length;
44 } else {
45 it = sep_start;
46 }
47 }
48}
49
56[[nodiscard]] inline generator<std::string_view> split(std::string_view haystack, char const *needle = " ") noexcept
57{
58 return split(haystack, std::string{needle});
59}
60
61[[nodiscard]] inline generator<std::string_view> split(std::string &haystack, char const *needle = " ") noexcept
62{
63 return split(haystack, std::string{needle});
64}
65
66[[nodiscard]] inline generator<std::wstring_view> split(std::wstring_view haystack, wchar_t const *needle = L" ") noexcept
67{
68 return split(haystack, std::wstring{needle});
69}
70
71[[nodiscard]] inline generator<std::wstring_view> split(std::wstring &haystack, wchar_t const *needle = L" ") noexcept
72{
73 return split(haystack, std::wstring{needle});
74}
75
76[[nodiscard]] inline generator<std::u8string_view> split(std::u8string_view haystack, char8_t const *needle = u8" ") noexcept
77{
78 return split(haystack, std::u8string{needle});
79}
80
81[[nodiscard]] inline generator<std::u8string_view> split(std::u8string &haystack, char8_t const *needle = u8" ") noexcept
82{
83 return split(haystack, std::u8string{needle});
84}
85
86[[nodiscard]] inline generator<std::u16string_view> split(std::u16string_view haystack, char16_t const *needle = u" ") noexcept
87{
88 return split(haystack, std::u16string{needle});
89}
90
91[[nodiscard]] inline generator<std::u16string_view> split(std::u16string &haystack, char16_t const *needle = u" ") noexcept
92{
93 return split(haystack, std::u16string{needle});
94}
95
96[[nodiscard]] inline generator<std::u32string_view> split(std::u32string_view haystack, char32_t const *needle = U" ") noexcept
97{
98 return split(haystack, std::u32string{needle});
99}
100
101[[nodiscard]] inline generator<std::u32string_view> split(std::u32string &haystack, char32_t const *needle = U" ") noexcept
102{
103 return split(haystack, std::u32string{needle});
104}
106
107} // namespace tt::ranges::views
108
109namespace tt {
110namespace views = tt::ranges::views;
111
115template<typename View>
116[[nodiscard]] std::vector<typename View::value_type> make_vector(View &view)
117{
120 return r;
121}
122
126template<typename View>
127[[nodiscard]] std::vector<typename View::value_type> make_vector(View &&view)
128{
131 return r;
132}
133
134} // 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)