FTXUI 6.1.9
C++ functional terminal UI.
Loading...
Searching...
No Matches
ref.hpp
Go to the documentation of this file.
1// Copyright 2020 Arthur Sonzogni. All rights reserved.
2// Use of this source code is governed by the MIT license that can be found in
3// the LICENSE file.
4#ifndef FTXUI_UTIL_REF_HPP
5#define FTXUI_UTIL_REF_HPP
6
8#include <memory>
9#include <string>
10#include <string_view>
11#include <variant>
12#include <vector>
13
14namespace ftxui {
15
16/// @brief An adapter. Own or reference an immutable object.
17template <typename T>
18class ConstRef {
19 public:
20 ConstRef() = default;
21
22 // Owning constructors:
23 ConstRef(T t) : variant_(std::move(t)) {} // NOLINT
24
25 // Referencing constructors:
26 ConstRef(const T* t) : variant_(t) {} // NOLINT
27
28 ConstRef& operator=(ConstRef&&) noexcept = default;
29 ConstRef(const ConstRef<T>&) = default;
30 ConstRef(ConstRef<T>&&) noexcept = default;
31 ~ConstRef() = default;
32
33 // Make a "reseatable" reference
34 ConstRef<T>& operator=(const ConstRef<T>&) = default;
35
36 // Accessors:
37 const T& operator()() const { return *Address(); }
38 const T& operator*() const { return *Address(); }
39 const T* operator->() const { return Address(); }
40
41 private:
42 std::variant<T, const T*> variant_ = T{};
43
44 const T* Address() const {
45 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
46 : std::get<const T*>(variant_);
47 }
48};
49
50/// @brief An adapter. Own or reference an mutable object.
51template <typename T>
52class Ref {
53 public:
54 Ref() = default;
55
56 // Owning constructors:
57 Ref(T t) : variant_(std::move(t)) {} // NOLINT
58 //
59 // Referencing constructors:
60 Ref(T* t) : variant_(t) {} // NOLINT
61 //
62 ~Ref() = default;
63 Ref& operator=(Ref&&) noexcept = default;
64 Ref(const Ref<T>&) = default;
65 Ref(Ref<T>&&) noexcept = default;
66
67 // Make a "reseatable" reference.
68 Ref<T>& operator=(const Ref<T>&) = default;
69
70 // Accessors:
71 T& operator()() { return *Address(); }
72 T& operator*() { return *Address(); }
73 T* operator->() { return Address(); }
74 const T& operator()() const { return *Address(); }
75 const T& operator*() const { return *Address(); }
76 const T* operator->() const { return Address(); }
77
78 private:
79 std::variant<T, T*> variant_ = T{};
80
81 const T* Address() const {
82 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
83 : std::get<T*>(variant_);
84 }
85 T* Address() {
86 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
87 : std::get<T*>(variant_);
88 }
89};
90
91/// @brief An adapter. Own or reference a constant string. For convenience, this
92/// class convert multiple mutable string toward a shared representation.
93class StringRef : public Ref<std::string> {
94 public:
95 using Ref<std::string>::Ref;
96
97 // Owning constructors:
98 StringRef(const wchar_t* ref) // NOLINT
99 : StringRef(to_string(std::wstring(ref))) {}
100 StringRef(const char* ref) // NOLINT
101 : StringRef(std::string(ref)) {}
102 StringRef(std::string_view ref) // NOLINT
103 : StringRef(std::string(ref)) {}
104 StringRef(std::wstring_view ref) // NOLINT
105 : StringRef(to_string(ref)) {}
106};
107
108/// @brief An adapter. Own or reference a constant string. For convenience, this
109/// class convert multiple immutable string toward a shared representation.
110class ConstStringRef : public ConstRef<std::string> {
111 public:
112 using ConstRef<std::string>::ConstRef;
113
114 // Referencing constructors:
115 ConstStringRef(const std::wstring* ref) // NOLINT
116 : ConstStringRef(to_string(*ref)) {}
117
118 // Owning constructors:
119 ConstStringRef(const std::wstring ref) // NOLINT
120 : ConstStringRef(to_string(ref)) {}
121 ConstStringRef(std::wstring_view ref) // NOLINT
122 : ConstStringRef(to_string(ref)) {}
123 ConstStringRef(const wchar_t* ref) // NOLINT
124 : ConstStringRef(to_string(std::wstring(ref))) {}
125 ConstStringRef(const char* ref) // NOLINT
126 : ConstStringRef(std::string(ref)) {}
127 ConstStringRef(std::string_view ref) // NOLINT
128 : ConstStringRef(std::string(ref)) {}
129};
130
131/// @brief An adapter. Reference a list of strings.
132///
133/// Supported input:
134/// - `std::vector<std::string>`
135/// - `std::vector<std::string>*`
136/// - `std::vector<std::wstring>*`
137/// - `Adapter*`
138/// - `std::unique_ptr<Adapter>`
140 public:
141 // Bring your own adapter:
142 class Adapter {
143 public:
144 Adapter() = default;
145 Adapter(const Adapter&) = default;
146 Adapter& operator=(const Adapter&) = default;
147 Adapter(Adapter&&) = default;
148 Adapter& operator=(Adapter&&) = default;
149 virtual ~Adapter() = default;
150 virtual size_t size() const = 0;
151 virtual std::string_view operator[](size_t i) const = 0;
152 };
153 using Variant = std::variant<const std::vector<std::string>, //
154 const std::vector<std::string>*, //
155 const std::vector<std::string_view>, //
156 const std::vector<std::string_view>*, //
157 const std::vector<std::wstring>*, //
158 Adapter*, //
159 std::unique_ptr<Adapter> //
160 >;
161
168
169 ConstStringListRef(std::vector<std::string> value) { // NOLINT
170 variant_ = std::make_shared<Variant>(value);
171 }
172 ConstStringListRef(const std::vector<std::string>* value) {// NOLINT
173 variant_ = std::make_shared<Variant>(value);
174 }
175 ConstStringListRef(std::vector<std::string_view> value) { // NOLINT
176 variant_ = std::make_shared<Variant>(value);
177 }
178 ConstStringListRef(const std::vector<std::string_view>* value) { // NOLINT
179 variant_ = std::make_shared<Variant>(value);
180 }
181 ConstStringListRef(const std::vector<std::wstring>* value) { // NOLINT
182 variant_ = std::make_shared<Variant>(value);
183 }
184 ConstStringListRef(Adapter* adapter) { // NOLINT
185 variant_ = std::make_shared<Variant>(adapter);
186 }
187 template <typename AdapterType>
188 ConstStringListRef(std::unique_ptr<AdapterType> adapter) { // NOLINT
189 variant_ = std::make_shared<Variant>(
190 static_cast<std::unique_ptr<Adapter>>(std::move(adapter)));
191 }
192
193 size_t size() const {
194 return variant_ ? std::visit(SizeVisitor(), *variant_) : 0;
195 }
196
197 std::string_view operator[](size_t i) const {
198 return variant_ ? std::visit(IndexedGetter{i}, *variant_) : "";
199 }
200
201 private:
202 struct IndexedGetter {
203 size_t i;
204 std::string_view operator()(const std::vector<std::string>& v) const {
205 return v[i];
206 }
207 std::string_view operator()(const std::vector<std::string>* v) const {
208 return (*v)[i];
209 }
210 std::string_view operator()(const std::vector<std::string_view>& v) const {
211 return std::string(v[i]);
212 }
213 std::string_view operator()(const std::vector<std::string_view>* v) const {
214 return std::string((*v)[i]);
215 }
216 std::string_view operator()(const std::vector<std::wstring>* v) const {
217 return to_string((*v)[i]);
218 }
219 std::string_view operator()(Adapter* v) const { return std::string((*v)[i]); }
220 std::string_view operator()(const std::unique_ptr<Adapter>& v) const {
221 return (*v)[i];
222 }
223 };
224
225 struct SizeVisitor {
226 size_t operator()(const std::vector<std::string>& v) const {
227 return v.size();
228 }
229 size_t operator()(const std::vector<std::string>* v) const {
230 return v->size();
231 }
232 size_t operator()(const std::vector<std::string_view>& v) const {
233 return v.size();
234 }
235 size_t operator()(const std::vector<std::string_view>* v) const {
236 return v->size();
237 }
238 size_t operator()(const std::vector<std::wstring>* v) const {
239 return v->size();
240 }
241 size_t operator()(const Adapter* v) const { return v->size(); }
242 size_t operator()(const std::unique_ptr<Adapter>& v) const {
243 return v->size();
244 }
245 };
246
247 std::shared_ptr<Variant> variant_;
248};
249
250} // namespace ftxui
251
252#endif /* end of include guard: FTXUI_UTIL_REF_HPP */
An adapter. Own or reference an immutable object.
Definition ref.hpp:18
const T & operator*() const
Definition ref.hpp:38
ConstRef()=default
ConstRef(const T *t)
Definition ref.hpp:26
ConstRef(T t)
Definition ref.hpp:23
const T * operator->() const
Definition ref.hpp:39
ConstRef & operator=(ConstRef &&) noexcept=default
Adapter & operator=(Adapter &&)=default
virtual std::string_view operator[](size_t i) const =0
Adapter & operator=(const Adapter &)=default
virtual size_t size() const =0
Adapter(const Adapter &)=default
An adapter. Reference a list of strings.
Definition ref.hpp:139
ConstStringListRef(const std::vector< std::string_view > *value)
Definition ref.hpp:178
ConstStringListRef(std::vector< std::string > value)
Definition ref.hpp:169
ConstStringListRef(const std::vector< std::string > *value)
Definition ref.hpp:172
size_t size() const
Definition ref.hpp:193
ConstStringListRef(ConstStringListRef &&)=default
ConstStringListRef & operator=(ConstStringListRef &&)=default
ConstStringListRef & operator=(const ConstStringListRef &)=default
ConstStringListRef(std::vector< std::string_view > value)
Definition ref.hpp:175
std::variant< const std::vector< std::string >, const std::vector< std::string > *, const std::vector< std::string_view >, const std::vector< std::string_view > *, const std::vector< std::wstring > *, Adapter *, std::unique_ptr< Adapter > > Variant
Definition ref.hpp:153
ConstStringListRef(std::unique_ptr< AdapterType > adapter)
Definition ref.hpp:188
ConstStringListRef(const std::vector< std::wstring > *value)
Definition ref.hpp:181
ConstStringListRef(const ConstStringListRef &)=default
ConstStringListRef(Adapter *adapter)
Definition ref.hpp:184
std::string_view operator[](size_t i) const
Definition ref.hpp:197
An adapter. Own or reference a constant string. For convenience, this class convert multiple immutabl...
Definition ref.hpp:110
ConstStringRef(const char *ref)
Definition ref.hpp:125
ConstStringRef(const std::wstring ref)
Definition ref.hpp:119
ConstStringRef(const std::wstring *ref)
Definition ref.hpp:115
ConstStringRef(std::wstring_view ref)
Definition ref.hpp:121
ConstStringRef(std::string_view ref)
Definition ref.hpp:127
ConstStringRef(const wchar_t *ref)
Definition ref.hpp:123
An adapter. Own or reference an mutable object.
Definition ref.hpp:52
const T & operator*() const
Definition ref.hpp:75
~Ref()=default
T & operator*()
Definition ref.hpp:72
T * operator->()
Definition ref.hpp:73
Ref()=default
Ref(T t)
Definition ref.hpp:57
const T * operator->() const
Definition ref.hpp:76
Ref & operator=(Ref &&) noexcept=default
Ref(T *t)
Definition ref.hpp:60
const T & operator()() const
Definition ref.hpp:74
An adapter. Own or reference a constant string. For convenience, this class convert multiple mutable ...
Definition ref.hpp:93
StringRef(const char *ref)
Definition ref.hpp:100
StringRef(std::string_view ref)
Definition ref.hpp:102
StringRef(const wchar_t *ref)
Definition ref.hpp:98
StringRef(std::wstring_view ref)
Definition ref.hpp:104
The FTXUI ftxui:: namespace.
Definition animation.hpp:10
std::string to_string(std::wstring_view s)
Convert a std::wstring into a UTF8 std::string.
Definition string.cpp:1565