4#ifndef FTXUI_UTIL_REF_HPP
5#define FTXUI_UTIL_REF_HPP
39 const T& operator()()
const {
return *Address(); }
44 std::variant<T, const T*> variant_ = T{};
46 const T* Address()
const {
47 if (
const T* t = std::get_if<T>(&variant_)) {
50 return std::get<const T*>(variant_);
62 : variant_(std::move(t)) {}
74 Ref<T>& operator=(const
Ref<T>&) = default;
77 T& operator()() {
return *Address(); }
85 std::variant<T, T*> variant_ = T{};
87 const T* Address()
const {
88 if (
const T* t = std::get_if<T>(&variant_)) {
91 return std::get<T*>(variant_);
94 if (T* t = std::get_if<T>(&variant_)) {
97 return std::get<T*>(variant_);
102class FTXUI_EXPORT(SCREEN) StringRef :
public Ref<std::string> {
104 using Ref<std::string>::Ref;
107 StringRef(
const wchar_t* ref)
108 : StringRef(to_string(std::wstring(ref))) {}
109 StringRef(
const char* ref)
110 : StringRef(std::string(ref)) {}
111 StringRef(std::string_view ref)
112 : StringRef(std::string(ref)) {}
113 StringRef(std::wstring_view ref)
114 : StringRef(to_string(ref)) {}
118class FTXUI_EXPORT(SCREEN) ConstStringRef :
public ConstRef<std::string> {
120 using ConstRef<std::string>::ConstRef;
123 ConstStringRef(
const std::wstring* ref)
124 : ConstStringRef(to_string(*ref)) {}
127 ConstStringRef(
const std::wstring ref)
128 : ConstStringRef(to_string(ref)) {}
129 ConstStringRef(std::wstring_view ref)
130 : ConstStringRef(to_string(ref)) {}
131 ConstStringRef(
const wchar_t* ref)
132 : ConstStringRef(to_string(std::wstring(ref))) {}
133 ConstStringRef(
const char* ref)
134 : ConstStringRef(std::string(ref)) {}
135 ConstStringRef(std::string_view ref)
136 : ConstStringRef(std::string(ref)) {}
147class FTXUI_EXPORT(SCREEN) ConstStringListRef {
153 Adapter(
const Adapter&) =
default;
154 Adapter& operator=(
const Adapter&) =
default;
155 Adapter(Adapter&&) =
default;
156 Adapter& operator=(Adapter&&) =
default;
157 virtual ~Adapter() =
default;
158 virtual size_t size()
const = 0;
159 virtual std::string_view operator[](
size_t i)
const = 0;
161 using Variant = std::variant<const std::vector<std::string>,
162 const std::vector<std::string>*,
163 const std::vector<std::string_view>,
164 const std::vector<std::string_view>*,
165 const std::vector<std::wstring>*,
167 std::unique_ptr<Adapter>
170 ConstStringListRef() =
default;
171 ~ConstStringListRef() =
default;
172 ConstStringListRef& operator=(
const ConstStringListRef&) =
default;
173 ConstStringListRef& operator=(ConstStringListRef&&) =
default;
174 ConstStringListRef(ConstStringListRef&&) =
default;
175 ConstStringListRef(
const ConstStringListRef&) =
default;
177 ConstStringListRef(std::vector<std::string> value) {
178 variant_ = std::make_shared<Variant>(value);
180 ConstStringListRef(
const std::vector<std::string>* value) {
181 variant_ = std::make_shared<Variant>(value);
183 ConstStringListRef(std::vector<std::string_view> value) {
184 variant_ = std::make_shared<Variant>(value);
186 ConstStringListRef(
const std::vector<std::string_view>* value) {
187 variant_ = std::make_shared<Variant>(value);
189 ConstStringListRef(
const std::vector<std::wstring>* value) {
190 variant_ = std::make_shared<Variant>(value);
192 ConstStringListRef(Adapter* adapter) {
193 variant_ = std::make_shared<Variant>(adapter);
195 template <
typename AdapterType>
196 ConstStringListRef(std::unique_ptr<AdapterType> adapter) {
197 variant_ = std::make_shared<Variant>(
198 static_cast<std::unique_ptr<Adapter>
>(std::move(adapter)));
201 size_t size()
const {
202 return variant_ ? std::visit(SizeVisitor(), *variant_) : 0;
205 std::string_view operator[](
size_t i)
const {
206 return variant_ ? std::visit(IndexedGetter{i}, *variant_) :
"";
210 struct IndexedGetter {
212 std::string_view operator()(
const std::vector<std::string>& v)
const {
215 std::string_view operator()(
const std::vector<std::string>* v)
const {
218 std::string_view operator()(
const std::vector<std::string_view>& v)
const {
221 std::string_view operator()(
const std::vector<std::string_view>* v)
const {
224 std::string_view operator()(
225 [[maybe_unused]]
const std::vector<std::wstring>* v)
const {
229 std::string_view operator()(Adapter* v)
const {
return (*v)[i]; }
230 std::string_view operator()(
const std::unique_ptr<Adapter>& v)
const {
236 size_t operator()(
const std::vector<std::string>& v)
const {
239 size_t operator()(
const std::vector<std::string>* v)
const {
242 size_t operator()(
const std::vector<std::string_view>& v)
const {
245 size_t operator()(
const std::vector<std::string_view>* v)
const {
248 size_t operator()(
const std::vector<std::wstring>* v)
const {
251 size_t operator()(
const Adapter* v)
const {
return v->size(); }
252 size_t operator()(
const std::unique_ptr<Adapter>& v)
const {
257 std::shared_ptr<Variant> variant_;
const T & operator*() const
const T * operator->() const
ConstRef & operator=(ConstRef &&) noexcept=default
const T & operator*() const
const T * operator->() const
Ref & operator=(Ref &&) noexcept=default
const T & operator()() const