SimpleWindow
载入中...
搜索中...
未找到
IList.h
1#pragma once
2
3#include "Variant.h"
4
5namespace sw
6{
10 class IList
11 {
12 public:
16 virtual ~IList() = default;
17
18 public:
23 virtual std::type_index GetElementType() const noexcept = 0;
24
30
38
47
54 virtual void SetVariantAt(int index, const Variant &value) = 0;
55
62 virtual void MoveVariantAt(int index, Variant &value) = 0;
63 };
64
71 {
72 public:
76 virtual ~IListT() = default;
77
82 virtual std::type_index GetElementType() const noexcept override final
83 {
84 return typeid(T);
85 }
86
93 virtual Variant GetVariantAt(int index) override final
94 {
95 return Variant::MakeRef(GetAt(index));
96 }
97
105 virtual Variant GetVariantAt(int index) const override final
106 {
107 return GetVariantValueAtImpl(index);
108 }
109
119 virtual void SetVariantAt(int index, const Variant &value) override final
120 {
121 SetVariantAtImpl(index, value);
122 }
123
133 virtual void MoveVariantAt(int index, Variant &value) override final
134 {
135 MoveVariantAtImpl(index, value);
136 }
137
138 private:
145 template <typename U = T>
146 auto GetVariantValueAtImpl(int index) const
147 -> typename std::enable_if<std::is_copy_constructible<U>::value, Variant>::type
148 {
149 return Variant{GetAt(index)};
150 }
151
156 template <typename U = T>
157 auto GetVariantValueAtImpl(int) const
158 -> typename std::enable_if<!std::is_copy_constructible<U>::value, Variant>::type
159 {
160 throw std::logic_error(
161 "Type T must be copy constructible to get Variant by value in IListT.");
162 }
163
170 template <typename U = T>
171 auto SetVariantAtImpl(int index, const Variant &value)
172 -> typename std::enable_if<std::is_same<U, Variant>::value>::type
173 {
174 SetAt(index, value);
175 }
176
185 template <typename U = T>
186 auto SetVariantAtImpl(int index, const Variant &value)
187 -> typename std::enable_if<!std::is_same<U, Variant>::value>::type
188 {
189 if (value.IsNull()) {
190 throw std::invalid_argument(
191 "Cannot set a null Variant to a non-Variant IListT.");
192 }
193 SetAt(index, value.DynamicCast<T>());
194 }
195
202 template <typename U = T>
203 auto MoveVariantAtImpl(int index, Variant &value)
204 -> typename std::enable_if<std::is_same<U, Variant>::value>::type
205 {
206 SetAt(index, std::move(value));
207 }
208
217 template <typename U = T>
218 auto MoveVariantAtImpl(int index, Variant &value)
219 -> typename std::enable_if<!std::is_same<U, Variant>::value>::type
220 {
221 if (value.IsNull()) {
222 throw std::invalid_argument(
223 "Cannot set a null Variant to a non-Variant IListT.");
224 }
225 SetAt(index, std::move(value.DynamicCast<T>()));
226 }
227
228 public:
233 virtual int Count() const noexcept = 0;
234
241 virtual T &GetAt(int index) = 0;
242
249 virtual const T &GetAt(int index) const = 0;
250
258 virtual void SetAt(int index, const T &value) = 0;
259
267 virtual void SetAt(int index, T &&value) = 0;
268 };
269}
类型安全的列表接口,继承IList并提供类型化的元素访问
Definition IList.h:71
virtual int Count() const noexcept=0
返回列表中的元素数量
virtual Variant GetVariantAt(int index) override final
获取指定索引处元素的Variant引用
Definition IList.h:93
virtual std::type_index GetElementType() const noexcept override final
获取列表元素的类型信息
Definition IList.h:82
virtual void SetVariantAt(int index, const Variant &value) override final
设置指定索引处的元素值
Definition IList.h:119
virtual void MoveVariantAt(int index, Variant &value) override final
设置指定索引处的元素值(移动语义)
Definition IList.h:133
virtual ~IListT()=default
虚析构函数
virtual Variant GetVariantAt(int index) const override final
获取指定索引处元素的Variant副本
Definition IList.h:105
非模板列表接口,提供基于Variant的元素访问
Definition IList.h:11
virtual void MoveVariantAt(int index, Variant &value)=0
设置指定索引处的元素值(移动语义)
virtual void SetVariantAt(int index, const Variant &value)=0
设置指定索引处的元素值
virtual ~IList()=default
虚析构函数
virtual Variant GetVariantAt(int index)=0
获取指定索引处元素的Variant引用
virtual int Count() const noexcept=0
返回列表中的元素数量
virtual std::type_index GetElementType() const noexcept=0
获取列表元素的类型信息
值转换器接口
Definition IValueConverter.h:14
通用变体类型容器,类型擦除地持有任意类型对象
Definition Variant.h:36
static Variant MakeRef(Variant &v)
创建一个对另一Variant内部对象的引用Variant(Variant转发重载)
Definition Variant.h:536
SimpleWindow框架的顶级命名空间,所有公共类型、控件、枚举和工具函数均定义于此。
Definition Alignment.h:4