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// このソースコードの使用は、LICENSEファイルにあるMITライセンスによって管理されています。
3#ifndef FTXUI_UTIL_REF_HPP
4#define FTXUI_UTIL_REF_HPP
5
7#include <memory>
8#include <string>
9#include <variant>
10#include <vector>
11
12namespace ftxui {
13
14/// @brief アダプター。不変オブジェクトを所有または参照します。
15template <typename T>
16class ConstRef {
17 public:
18 ConstRef() = default;
19 ConstRef(T t) : variant_(std::move(t)) {} // NOLINT
20 ConstRef(const T* t) : variant_(t) {} // NOLINT
21 ConstRef& operator=(ConstRef&&) noexcept = default;
22 ConstRef(const ConstRef<T>&) = default;
23 ConstRef(ConstRef<T>&&) noexcept = default;
24 ~ConstRef() = default;
25
26 // 「再設定可能な」参照を作成します。
27 ConstRef<T>& operator=(const ConstRef<T>&) = default;
28
29 // Accessors:
30 const T& operator()() const { return *Address(); }
31 const T& operator*() const { return *Address(); }
32 const T* operator->() const { return Address(); }
33
34 private:
35 std::variant<T, const T*> variant_ = T{};
36
37 const T* Address() const {
38 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
39 : std::get<const T*>(variant_);
40 }
41};
42
43/// @brief アダプター。可変オブジェクトを所有または参照します。
44template <typename T>
45class Ref {
46 public:
47 Ref() = default;
48 Ref(T t) : variant_(std::move(t)) {} // NOLINT
49 Ref(T* t) : variant_(t) {} // NOLINT
50 ~Ref() = default;
51 Ref& operator=(Ref&&) noexcept = default;
52 Ref(const Ref<T>&) = default;
53 Ref(Ref<T>&&) noexcept = default;
54
55 // 「再設定可能な」参照を作成します。
56 Ref<T>& operator=(const Ref<T>&) = default;
57
58 // Accessors:
59 T& operator()() { return *Address(); }
60 T& operator*() { return *Address(); }
61 T* operator->() { return Address(); }
62 const T& operator()() const { return *Address(); }
63 const T& operator*() const { return *Address(); }
64 const T* operator->() const { return Address(); }
65
66 private:
67 std::variant<T, T*> variant_ = T{};
68
69 const T* Address() const {
70 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
71 : std::get<T*>(variant_);
72 }
73 T* Address() {
74 return std::holds_alternative<T>(variant_) ? &std::get<T>(variant_)
75 : std::get<T*>(variant_);
76 }
77};
78
79/// @brief アダプター。定数文字列を所有または参照します。便宜上、このクラスは複数の可変文字列を共有表現に変換します。
80class StringRef : public Ref<std::string> {
81 public:
82 using Ref<std::string>::Ref;
83
84 StringRef(const wchar_t* ref) // NOLINT
85 : StringRef(to_string(std::wstring(ref))) {}
86 StringRef(const char* ref) // NOLINT
87 : StringRef(std::string(ref)) {}
88};
89
90/// @brief アダプター。定数文字列を所有または参照します。便宜上、このクラスは複数の不変文字列を共有表現に変換します。
91class ConstStringRef : public ConstRef<std::string> {
92 public:
93 using ConstRef<std::string>::ConstRef;
94
95 ConstStringRef(const std::wstring* ref) // NOLINT
96 : ConstStringRef(to_string(*ref)) {}
97 ConstStringRef(const std::wstring ref) // NOLINT
98 : ConstStringRef(to_string(ref)) {}
99 ConstStringRef(const wchar_t* ref) // NOLINT
100 : ConstStringRef(to_string(std::wstring(ref))) {}
101 ConstStringRef(const char* ref) // NOLINT
102 : ConstStringRef(std::string(ref)) {}
103};
104
105/// @brief アダプター。文字列のリストを参照します。
106///
107/// サポートされている入力:
108/// - `std::vector<std::string>`
109/// - `std::vector<std::string>*`
110/// - `std::vector<std::wstring>*`
111/// - `Adapter*`
112/// - `std::unique_ptr<Adapter>`
114 public:
115 // 独自のアダプターを使用:
116 class Adapter {
117 public:
118 Adapter() = default;
119 Adapter(const Adapter&) = default;
120 Adapter& operator=(const Adapter&) = default;
121 Adapter(Adapter&&) = default;
122 Adapter& operator=(Adapter&&) = default;
123 virtual ~Adapter() = default;
124 virtual size_t size() const = 0;
125 virtual std::string operator[](size_t i) const = 0;
126 };
127 using Variant = std::variant<const std::vector<std::string>, //
128 const std::vector<std::string>*, //
129 const std::vector<std::wstring>*, //
130 Adapter*, //
131 std::unique_ptr<Adapter> //
132 >;
133
140
141 ConstStringListRef(std::vector<std::string> value) // NOLINT
142 {
143 variant_ = std::make_shared<Variant>(value);
144 }
145 ConstStringListRef(const std::vector<std::string>* value) // NOLINT
146 {
147 variant_ = std::make_shared<Variant>(value);
148 }
149 ConstStringListRef(const std::vector<std::wstring>* value) // NOLINT
150 {
151 variant_ = std::make_shared<Variant>(value);
152 }
153 ConstStringListRef(Adapter* adapter) // NOLINT
154 {
155 variant_ = std::make_shared<Variant>(adapter);
156 }
157 template <typename AdapterType>
158 ConstStringListRef(std::unique_ptr<AdapterType> adapter) // NOLINT
159 {
160 variant_ = std::make_shared<Variant>(
161 static_cast<std::unique_ptr<Adapter>>(std::move(adapter)));
162 }
163
164 size_t size() const {
165 return variant_ ? std::visit(SizeVisitor(), *variant_) : 0;
166 }
167
168 std::string operator[](size_t i) const {
169 return variant_ ? std::visit(IndexedGetter(i), *variant_) : "";
170 }
171
172 private:
173 struct SizeVisitor {
174 size_t operator()(const std::vector<std::string>& v) const {
175 return v.size();
176 }
177 size_t operator()(const std::vector<std::string>* v) const {
178 return v->size();
179 }
180 size_t operator()(const std::vector<std::wstring>* v) const {
181 return v->size();
182 }
183 size_t operator()(const Adapter* v) const { return v->size(); }
184 size_t operator()(const std::unique_ptr<Adapter>& v) const {
185 return v->size();
186 }
187 };
188
189 struct IndexedGetter {
190 IndexedGetter(size_t index) // NOLINT
191 : index_(index) {}
192 size_t index_;
193 std::string operator()(const std::vector<std::string>& v) const {
194 return v[index_];
195 }
196 std::string operator()(const std::vector<std::string>* v) const {
197 return (*v)[index_];
198 }
199 std::string operator()(const std::vector<std::wstring>* v) const {
200 return to_string((*v)[index_]);
201 }
202 std::string operator()(const Adapter* v) const { return (*v)[index_]; }
203 std::string operator()(const std::unique_ptr<Adapter>& v) const {
204 return (*v)[index_];
205 }
206 };
207
208 std::shared_ptr<Variant> variant_;
209};
210
211} // namespace ftxui
212
213#endif /* end of include guard: FTXUI_UTIL_REF_HPP */
アダプター。不変オブジェクトを所有または参照します。
Definition ref.hpp:16
const T & operator*() const
Definition ref.hpp:31
ConstRef()=default
ConstRef(const T *t)
Definition ref.hpp:20
ConstRef(T t)
Definition ref.hpp:19
const T * operator->() const
Definition ref.hpp:32
ConstRef & operator=(ConstRef &&) noexcept=default
Adapter & operator=(Adapter &&)=default
Adapter & operator=(const Adapter &)=default
virtual size_t size() const =0
virtual std::string operator[](size_t i) const =0
Adapter(const Adapter &)=default
アダプター。文字列のリストを参照します。
Definition ref.hpp:113
ConstStringListRef(std::vector< std::string > value)
Definition ref.hpp:141
ConstStringListRef(const std::vector< std::string > *value)
Definition ref.hpp:145
size_t size() const
Definition ref.hpp:164
ConstStringListRef(ConstStringListRef &&)=default
ConstStringListRef & operator=(ConstStringListRef &&)=default
std::variant< const std::vector< std::string >, const std::vector< std::string > *, const std::vector< std::wstring > *, Adapter *, std::unique_ptr< Adapter > > Variant
Definition ref.hpp:127
ConstStringListRef & operator=(const ConstStringListRef &)=default
ConstStringListRef(std::unique_ptr< AdapterType > adapter)
Definition ref.hpp:158
ConstStringListRef(const std::vector< std::wstring > *value)
Definition ref.hpp:149
ConstStringListRef(const ConstStringListRef &)=default
ConstStringListRef(Adapter *adapter)
Definition ref.hpp:153
std::string operator[](size_t i) const
Definition ref.hpp:168
アダプター。定数文字列を所有または参照します。便宜上、このクラスは複数の不変文字列を共有表現に変換します。
Definition ref.hpp:91
ConstStringRef(const char *ref)
Definition ref.hpp:101
ConstStringRef(const std::wstring ref)
Definition ref.hpp:97
ConstStringRef(const std::wstring *ref)
Definition ref.hpp:95
ConstStringRef(const wchar_t *ref)
Definition ref.hpp:99
アダプター。可変オブジェクトを所有または参照します。
Definition ref.hpp:45
const T & operator*() const
Definition ref.hpp:63
~Ref()=default
T & operator*()
Definition ref.hpp:60
T * operator->()
Definition ref.hpp:61
Ref()=default
Ref(T t)
Definition ref.hpp:48
const T * operator->() const
Definition ref.hpp:64
Ref & operator=(Ref &&) noexcept=default
Ref(T *t)
Definition ref.hpp:49
const T & operator()() const
Definition ref.hpp:62
アダプター。定数文字列を所有または参照します。便宜上、このクラスは複数の可変文字列を共有表現に変換します。
Definition ref.hpp:80
StringRef(const char *ref)
Definition ref.hpp:86
StringRef(const wchar_t *ref)
Definition ref.hpp:84
FTXUI ftxui:: 名前空間
Definition animation.hpp:9
std::string to_string(const std::wstring &s)