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)
58 : variant_(std::move(t)) {} // NOLINT
59 //
60 // Referencing constructors:
61 Ref(T* t)
62 : variant_(t) {} // NOLINT
63 //
64 ~Ref() = default;
65 Ref& operator=(Ref&&) noexcept = default;
66 Ref(const Ref<T>&) = default;
67 Ref(Ref<T>&&) noexcept = default;
68
69 // Make a "reseatable" reference.
70 Ref<T>& operator=(const Ref<T>&) = default;
71
72 // Accessors:
73 T& operator()() { return *Address(); }
74 T& operator*() { return *Address(); }
75 T* operator->() { return Address(); }
76 const T& operator()() const { return *Address(); }
77 const T& operator*() const { return *Address(); }
78 const T* operator->() const { return Address(); }
79
80 private:
81 std::variant<T, T*> variant_ = T{};
82
83 const T* Address() const {
84 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
85 : std::get<T*>(variant_);
86 }
87 T* Address() {
88 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
89 : std::get<T*>(variant_);
90 }
91};
92
93/// @brief An adapter. Own or reference a constant string. For convenience, this
94/// class convert multiple mutable string toward a shared representation.
95class StringRef : public Ref<std::string> {
96 public:
97 using Ref<std::string>::Ref;
98
99 // Owning constructors:
100 StringRef(const wchar_t* ref) // NOLINT
101 : StringRef(to_string(std::wstring(ref))) {}
102 StringRef(const char* ref) // NOLINT
103 : StringRef(std::string(ref)) {}
104 StringRef(std::string_view ref) // NOLINT
105 : StringRef(std::string(ref)) {}
106 StringRef(std::wstring_view ref) // NOLINT
107 : StringRef(to_string(ref)) {}
108};
109
110/// @brief An adapter. Own or reference a constant string. For convenience, this
111/// class convert multiple immutable string toward a shared representation.
112class ConstStringRef : public ConstRef<std::string> {
113 public:
114 using ConstRef<std::string>::ConstRef;
115
116 // Referencing constructors:
117 ConstStringRef(const std::wstring* ref) // NOLINT
118 : ConstStringRef(to_string(*ref)) {}
119
120 // Owning constructors:
121 ConstStringRef(const std::wstring ref) // NOLINT
122 : ConstStringRef(to_string(ref)) {}
123 ConstStringRef(std::wstring_view ref) // NOLINT
124 : ConstStringRef(to_string(ref)) {}
125 ConstStringRef(const wchar_t* ref) // NOLINT
126 : ConstStringRef(to_string(std::wstring(ref))) {}
127 ConstStringRef(const char* ref) // NOLINT
128 : ConstStringRef(std::string(ref)) {}
129 ConstStringRef(std::string_view ref) // NOLINT
130 : ConstStringRef(std::string(ref)) {}
131};
132
133/// @brief An adapter. Reference a list of strings.
134///
135/// Supported input:
136/// - `std::vector<std::string>`
137/// - `std::vector<std::string>*`
138/// - `std::vector<std::wstring>*`
139/// - `Adapter*`
140/// - `std::unique_ptr<Adapter>`
142 public:
143 // Bring your own adapter:
144 class Adapter {
145 public:
146 Adapter() = default;
147 Adapter(const Adapter&) = default;
148 Adapter& operator=(const Adapter&) = default;
149 Adapter(Adapter&&) = default;
150 Adapter& operator=(Adapter&&) = default;
151 virtual ~Adapter() = default;
152 virtual size_t size() const = 0;
153 virtual std::string_view operator[](size_t i) const = 0;
154 };
155 using Variant = std::variant<const std::vector<std::string>, //
156 const std::vector<std::string>*, //
157 const std::vector<std::string_view>, //
158 const std::vector<std::string_view>*, //
159 const std::vector<std::wstring>*, //
160 Adapter*, //
161 std::unique_ptr<Adapter> //
162 >;
163
170
171 ConstStringListRef(std::vector<std::string> value) { // NOLINT
172 variant_ = std::make_shared<Variant>(value);
173 }
174 ConstStringListRef(const std::vector<std::string>* value) { // NOLINT
175 variant_ = std::make_shared<Variant>(value);
176 }
177 ConstStringListRef(std::vector<std::string_view> value) { // NOLINT
178 variant_ = std::make_shared<Variant>(value);
179 }
180 ConstStringListRef(const std::vector<std::string_view>* value) { // NOLINT
181 variant_ = std::make_shared<Variant>(value);
182 }
183 ConstStringListRef(const std::vector<std::wstring>* value) { // NOLINT
184 variant_ = std::make_shared<Variant>(value);
185 }
186 ConstStringListRef(Adapter* adapter) { // NOLINT
187 variant_ = std::make_shared<Variant>(adapter);
188 }
189 template <typename AdapterType>
190 ConstStringListRef(std::unique_ptr<AdapterType> adapter) { // NOLINT
191 variant_ = std::make_shared<Variant>(
192 static_cast<std::unique_ptr<Adapter>>(std::move(adapter)));
193 }
194
195 size_t size() const {
196 return variant_ ? std::visit(SizeVisitor(), *variant_) : 0;
197 }
198
199 std::string_view operator[](size_t i) const {
200 return variant_ ? std::visit(IndexedGetter{i}, *variant_) : "";
201 }
202
203 private:
204 struct IndexedGetter {
205 size_t i;
206 std::string_view operator()(const std::vector<std::string>& v) const {
207 return v[i];
208 }
209 std::string_view operator()(const std::vector<std::string>* v) const {
210 return (*v)[i];
211 }
212 std::string_view operator()(const std::vector<std::string_view>& v) const {
213 return v[i];
214 }
215 std::string_view operator()(const std::vector<std::string_view>* v) const {
216 return (*v)[i];
217 }
218 std::string_view operator()(const std::vector<std::wstring>* v) const {
219 return ""; // Temporary fix: Cannot return a view to a temporary
220 // conversion.
221 }
222 std::string_view operator()(Adapter* v) const { return (*v)[i]; }
223 std::string_view operator()(const std::unique_ptr<Adapter>& v) const {
224 return (*v)[i];
225 }
226 };
227
228 struct SizeVisitor {
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>* 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::string_view>* v) const {
239 return v->size();
240 }
241 size_t operator()(const std::vector<std::wstring>* v) const {
242 return v->size();
243 }
244 size_t operator()(const Adapter* v) const { return v->size(); }
245 size_t operator()(const std::unique_ptr<Adapter>& v) const {
246 return v->size();
247 }
248 };
249
250 std::shared_ptr<Variant> variant_;
251};
252
253} // namespace ftxui
254
255#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:141
ConstStringListRef(const std::vector< std::string_view > *value)
Definition ref.hpp:180
ConstStringListRef(std::vector< std::string > value)
Definition ref.hpp:171
ConstStringListRef(const std::vector< std::string > *value)
Definition ref.hpp:174
size_t size() const
Definition ref.hpp:195
ConstStringListRef(ConstStringListRef &&)=default
ConstStringListRef & operator=(ConstStringListRef &&)=default
ConstStringListRef & operator=(const ConstStringListRef &)=default
ConstStringListRef(std::vector< std::string_view > value)
Definition ref.hpp:177
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:155
ConstStringListRef(std::unique_ptr< AdapterType > adapter)
Definition ref.hpp:190
ConstStringListRef(const std::vector< std::wstring > *value)
Definition ref.hpp:183
ConstStringListRef(const ConstStringListRef &)=default
ConstStringListRef(Adapter *adapter)
Definition ref.hpp:186
std::string_view operator[](size_t i) const
Definition ref.hpp:199
An adapter. Own or reference a constant string. For convenience, this class convert multiple immutabl...
Definition ref.hpp:112
ConstStringRef(const char *ref)
Definition ref.hpp:127
ConstStringRef(const std::wstring ref)
Definition ref.hpp:121
ConstStringRef(const std::wstring *ref)
Definition ref.hpp:117
ConstStringRef(std::wstring_view ref)
Definition ref.hpp:123
ConstStringRef(std::string_view ref)
Definition ref.hpp:129
ConstStringRef(const wchar_t *ref)
Definition ref.hpp:125
An adapter. Own or reference an mutable object.
Definition ref.hpp:52
const T & operator*() const
Definition ref.hpp:77
~Ref()=default
T & operator*()
Definition ref.hpp:74
T * operator->()
Definition ref.hpp:75
Ref()=default
Ref(T t)
Definition ref.hpp:57
const T * operator->() const
Definition ref.hpp:78
Ref & operator=(Ref &&) noexcept=default
Ref(T *t)
Definition ref.hpp:61
const T & operator()() const
Definition ref.hpp:76
An adapter. Own or reference a constant string. For convenience, this class convert multiple mutable ...
Definition ref.hpp:95
StringRef(const char *ref)
Definition ref.hpp:102
StringRef(std::string_view ref)
Definition ref.hpp:104
StringRef(const wchar_t *ref)
Definition ref.hpp:100
StringRef(std::wstring_view ref)
Definition ref.hpp:106
The FTXUI ftxui:: namespace.
Definition animation.hpp:10