HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
gstring.hpp
1// Copyright 2019, 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/Text/Grapheme.hpp"
7#include "TTauri/Foundation/strings.hpp"
8#include <vector>
9
10namespace tt {
11
12struct gstring {
13 std::vector<Grapheme> graphemes;
14
15 using const_iterator = std::vector<Grapheme>::const_iterator;
16 using value_type = Grapheme;
17
18 ssize_t size() const noexcept {
19 return ssize(graphemes);
20 }
21
22 Grapheme const &at(ssize_t i) const {
23 return graphemes.at(i);
24 }
25
26 Grapheme &at(ssize_t i) {
27 return graphemes.at(i);
28 }
29
30 decltype(auto) begin() noexcept { return graphemes.begin(); }
31 decltype(auto) begin() const noexcept { return graphemes.begin(); }
32 decltype(auto) cbegin() const noexcept { return graphemes.cbegin(); }
33 decltype(auto) end() noexcept { return graphemes.end(); }
34 decltype(auto) end() const noexcept { return graphemes.end(); }
35 decltype(auto) cend() const noexcept { return graphemes.cend(); }
36
37 decltype(auto) front() noexcept { return graphemes.front(); }
38 decltype(auto) front() const noexcept { return graphemes.front(); }
39 decltype(auto) back() noexcept { return graphemes.back(); }
40 decltype(auto) back() const noexcept { return graphemes.back(); }
41
42 gstring &operator+=(gstring const &rhs) noexcept {
43 for (ttlet &rhs_grapheme: rhs.graphemes) {
44 graphemes.push_back(rhs_grapheme);
45 }
46 return *this;
47 }
48
49 gstring &operator+=(Grapheme const &grapheme) noexcept {
50 graphemes.push_back(grapheme);
51 return *this;
52 }
53
54 [[nodiscard]] friend std::u32string to_u32string(gstring const &rhs) noexcept {
56 r.reserve(ssize(rhs));
57 for (ttlet &c : rhs) {
58 r += c.NFC();
59 }
60 return r;
61 }
62
63 [[nodiscard]] friend std::string to_string(gstring const &rhs) noexcept {
64 return tt::to_string(to_u32string(rhs));
65 }
66
67
68 friend std::ostream &operator<<(std::ostream &lhs, gstring const &rhs) {
69 return lhs << to_string(rhs);
70 }
71};
72
73[[nodiscard]] gstring to_gstring(std::u32string_view rhs) noexcept;
74
75[[nodiscard]] inline gstring to_gstring(std::string_view rhs) noexcept {
76 return to_gstring(tt::to_u32string(rhs));
77}
78
79
80
81}
Definition Grapheme.hpp:20
Definition gstring.hpp:12
T at(T... args)
T back(T... args)
T begin(T... args)
T end(T... args)
T front(T... args)
T push_back(T... args)
T reserve(T... args)