NexusForce 1.0.0
A Modern C++ Library with extended functionality, web components, and utility libraries
载入中...
搜索中...
未找到
utility/any.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_UTILITY_ANY_HPP__
2#define NEFORCE_CORE_UTILITY_ANY_HPP__
3
10
11#include <initializer_list>
12#include <typeinfo>
15NEFORCE_BEGIN_NAMESPACE__
16
17class NEFORCE_API any;
18
20
21NEFORCE_BEGIN_INNER__
22
23struct any_cast_true_tag {};
24struct any_cast_false_tag {};
25
33template <typename T, typename U>
34const T* __any_cast_aux_dispatch_impl(const _NEFORCE any* value, any_cast_true_tag) noexcept;
35
36NEFORCE_END_INNER__
38
44
49struct anycast_exception final : typecast_exception {
50 explicit anycast_exception(const char* info = "Cast From any Type Failed.", const char* type = static_type,
51 const int code = 0) noexcept :
52 typecast_exception(info, type, code) {}
53
54 explicit anycast_exception(const exception& e) :
55 typecast_exception(e) {}
56
57 ~anycast_exception() override = default;
58
59 static constexpr auto static_type = "anycast_exception";
60};
61 // Exceptions
63
69
77class NEFORCE_API any {
84 union storage_internal {
85 storage_internal() = default;
86 storage_internal(const storage_internal&) = delete;
87 storage_internal& operator=(const storage_internal&) = delete;
88
89 void* ptr_ = nullptr;
90 aligned_storage_t<sizeof(ptr_), alignof(void*)> buffer_;
91 };
92
99 enum any_operation {
100 ACCESS,
101 GET_TYPE_INFO,
102 COPY,
103 DESTROY,
104 SWAP
105 };
106
113 union ArgT {
114 void* obj_ptr_;
115 const std::type_info* type_ptr_;
116 any* any_ptr_;
117 };
118
126 template <typename T>
127 struct internal_manage {
134 static void manage(any_operation op, const any* value, ArgT* arg);
135
142 template <typename... Args>
143 static void create(storage_internal& storage, Args&&... args) {
144 void* ptr = &storage.buffer_;
145 new (ptr) T(_NEFORCE forward<Args>(args)...);
146 }
147
153 static T* access(const storage_internal& storage) {
154 const void* ptr = &storage.buffer_;
155 return static_cast<T*>(const_cast<void*>(ptr));
156 }
157 };
158
166 template <typename T>
167 struct external_manage {
174 static void manage(any_operation op, const any* value, ArgT* arg);
175
182 template <typename... Args>
183 static void create(storage_internal& storage, Args&&... args) {
184 storage.ptr_ = new T(_NEFORCE forward<Args>(args)...);
185 }
186
192 static T* access(const storage_internal& storage) { return static_cast<T*>(storage.ptr_); }
193 };
194
201 template <typename T>
202 using manage_t = conditional_t<is_nothrow_move_constructible_v<T> && sizeof(T) <= sizeof(storage_internal) &&
203 alignof(T) <= alignof(storage_internal),
204 internal_manage<T>, external_manage<T>>;
205
206 using manage_func = void (*)(any_operation, const any*, ArgT*);
207
208 manage_func manage_ = nullptr;
209 storage_internal storage_{};
210
211 template <typename T, typename U>
212 friend const T* inner::__any_cast_aux_dispatch_impl(const any* value, inner::any_cast_true_tag) noexcept;
213
221 template <typename T, typename... Args, typename Manager = manage_t<T>>
222 void try_emplace(Args&&... args) {
223 any::reset();
224 Manager::create(storage_, _NEFORCE forward<Args>(args)...);
225 manage_ = &Manager::manage;
226 }
227
237 template <typename T, typename U, typename... Args, typename Manager = manage_t<T>>
238 void try_emplace(std::initializer_list<U> ilist, Args&&... args) {
239 any::reset();
240 Manager::create(storage_, ilist, _NEFORCE forward<Args>(args)...);
241 manage_ = &Manager::manage;
242 }
243
244public:
248 any() noexcept {}
249
254 any(const any& other);
255
262 any& operator=(const any& other) {
263 *this = any(other);
264 return *this;
265 }
266
271 any(any&& other) noexcept;
272
278 any& operator=(any&& other) noexcept;
279
285 template <typename T, typename VT = decay_t<T>, typename Manager = manage_t<VT>,
286 enable_if_t<is_copy_constructible_v<VT> && !is_same_v<inplace_construct_tag, VT> && !is_same_v<VT, any>,
287 int> = 0>
288 explicit any(T&& value) :
289 manage_(&Manager::manage) {
290 Manager::create(storage_, _NEFORCE forward<T>(value));
291 }
292
299 template <typename T, typename VT = decay_t<T>,
300 enable_if_t<!is_same_v<VT, any> && is_copy_constructible_v<VT>, int> = 0>
301 any& operator=(T&& value) {
302 *this = any(_NEFORCE forward<T>(value));
303 return *this;
304 }
305
312 template <typename T, typename... Args, typename VT = decay_t<T>, typename Manager = manage_t<VT>,
314 explicit any(inplace_construct_tag, Args&&... args) :
315 manage_(&Manager::manage) {
316 Manager::create(storage_, _NEFORCE forward<Args>(args)...);
317 }
318
327 template <typename T, typename U, typename... Args, typename VT = decay_t<T>, typename Manager = manage_t<VT>,
330 int> = 0>
331 explicit any(inplace_construct_tag, std::initializer_list<U> ilist, Args&&... args) :
332 manage_(&Manager::manage) {
333 Manager::create(storage_, ilist, _NEFORCE forward<Args>(args)...);
334 }
335
339 ~any() { reset(); }
340
348 template <typename T, typename... Args, typename DT = decay_t<T>,
350 DT& emplace(Args&&... args) {
351 any::try_emplace<DT>(_NEFORCE forward<Args>(args)...);
352 return *manage_t<DT>::access(storage_);
353 }
354
364 template <typename T, typename U, typename... Args, typename DT = decay_t<T>,
367 int> = 0>
368 DT& emplace(std::initializer_list<U> ilist, Args&&... args) {
369 any::try_emplace<DT, U>(ilist, _NEFORCE forward<Args>(args)...);
370 return *manage_t<DT>::access(storage_);
371 }
372
376 void reset() noexcept {
377 if (has_value()) {
378 manage_(DESTROY, this, nullptr);
379 manage_ = nullptr;
380 }
381 }
382
387 NEFORCE_NODISCARD bool has_value() const noexcept { return manage_ != nullptr; }
388
393 NEFORCE_NODISCARD const std::type_info& type() const noexcept;
394
399 void swap(any& rhs) noexcept;
400};
401
409template <typename T, typename... Args, enable_if_t<is_constructible_v<any, inplace_construct_tag, Args...>, int> = 0>
410any make_any(Args&&... args) {
411 return any(inplace_construct_tag{}, _NEFORCE forward<Args>(args)...);
412}
413
423template <typename T, typename U, typename... Args,
425any make_any(std::initializer_list<U> ilist, Args&&... args) {
426 return any(inplace_construct_tag{}, ilist, _NEFORCE forward<Args>(args)...);
427}
428
430NEFORCE_BEGIN_INNER__
431
432template <typename T, typename U>
433const T* __any_cast_aux_dispatch_impl(const any* value, any_cast_true_tag) noexcept {
434 if (value->manage_ == &any::manage_t<U>::manage) {
435 return static_cast<const T*>(any::manage_t<U>::access(value->storage_));
436 }
437 return nullptr;
438}
439
440template <typename T, typename U>
441const T* __any_cast_aux_dispatch_impl(const any*, any_cast_false_tag) noexcept {
442 return nullptr;
443}
444
445template <typename T, typename U>
446const T* __any_cast_aux_dispatch(const any* value) noexcept {
447 using tag = conditional_t<(is_same_v<decay_t<U>, U> || is_copy_constructible_v<U>), any_cast_true_tag,
448 any_cast_false_tag>;
449 return inner::__any_cast_aux_dispatch_impl<T, U>(value, tag{});
450}
451
452template <typename T, enable_if_t<is_object_v<T>, int> = 0>
453const T* __any_cast_aux(const any* value) noexcept {
454 if (value) {
455 return __any_cast_aux_dispatch<T, remove_cv_t<T>>(value);
456 }
457 return nullptr;
458}
459
460template <typename T, enable_if_t<!is_object_v<T>, int> = 0>
461const T* __any_cast_aux(const any*) noexcept {
462 return nullptr;
463}
464
465NEFORCE_END_INNER__
467
474template <typename T>
475const T* any_cast(const any* value) noexcept {
476 return inner::__any_cast_aux<T>(value);
477}
478
485template <typename T>
486T* any_cast(any* value) noexcept {
487 return const_cast<T*>(any_cast<T>(const_cast<const any*>(value)));
488}
489
497template <typename T>
498T any_cast(const any& value) {
499 using U = remove_cvref_t<T>;
501 "type T must be valid to cast from any.");
502
503 auto ptr = any_cast<U>(&value);
504 if (ptr) {
505 return static_cast<T>(*ptr);
506 }
507 NEFORCE_THROW_EXCEPTION(anycast_exception());
508 unreachable();
509}
510
511
513
514template <typename T>
515void any::internal_manage<T>::manage(const any_operation op, const any* value, ArgT* arg) {
516 auto ptr = reinterpret_cast<const T*>(&value->storage_.buffer_);
517 switch (op) {
518 case ACCESS: {
519 arg->obj_ptr_ = const_cast<T*>(ptr);
520 break;
521 }
522 case GET_TYPE_INFO: {
523 arg->type_ptr_ = &typeid(T);
524 break;
525 }
526 case COPY: {
527 ::new (&arg->any_ptr_->storage_.buffer_) T(*ptr);
528 arg->any_ptr_->manage_ = value->manage_;
529 break;
530 }
531 case DESTROY: {
532 ptr->~T();
533 break;
534 }
535 case SWAP: {
536 ::new (&arg->any_ptr_->storage_.buffer_) T(_NEFORCE move(*const_cast<T*>(ptr)));
537 ptr->~T();
538 arg->any_ptr_->manage_ = value->manage_;
539 const_cast<any*>(value)->manage_ = nullptr;
540 break;
541 }
542 default: {
543 unreachable();
544 }
545 }
546}
547
548template <typename T>
549void any::external_manage<T>::manage(const any_operation op, const any* value, ArgT* arg) {
550 auto ptr = static_cast<const T*>(value->storage_.ptr_);
551 switch (op) {
552 case ACCESS: {
553 arg->obj_ptr_ = const_cast<T*>(ptr);
554 break;
555 }
556 case GET_TYPE_INFO: {
557 arg->type_ptr_ = &typeid(T);
558 break;
559 }
560 case COPY: {
561 arg->any_ptr_->storage_.ptr_ = ::new T(*ptr);
562 arg->any_ptr_->manage_ = value->manage_;
563 break;
564 }
565 case DESTROY: {
566 delete ptr;
567 break;
568 }
569 case SWAP: {
570 arg->any_ptr_->storage_.ptr_ = value->storage_.ptr_;
571 arg->any_ptr_->manage_ = value->manage_;
572 const_cast<any*>(value)->manage_ = nullptr;
573 break;
574 }
575 default: {
576 unreachable();
577 }
578 }
579}
580
582 // Any
584
585NEFORCE_END_NAMESPACE__
586#endif // NEFORCE_CORE_UTILITY_ANY_HPP__
调试断点和断言工具
任意类型容器
NEFORCE_NODISCARD bool has_value() const noexcept
检查是否包含值
DT & emplace(Args &&... args)
就地构造值
~any()
析构函数
any(const any &other)
复制构造函数
any(T &&value)
从值构造
any & operator=(any &&other) noexcept
移动赋值运算符
NEFORCE_NODISCARD const std::type_info & type() const noexcept
获取存储值的类型信息
any(inplace_construct_tag, std::initializer_list< U > ilist, Args &&... args)
使用初始化列表就地构造
any & operator=(const any &other)
复制赋值运算符
void reset() noexcept
重置any对象为空
void swap(any &rhs) noexcept
交换两个any对象
any(any &&other) noexcept
移动构造函数
any & operator=(T &&value)
从值赋值
any() noexcept
默认构造函数
any(inplace_construct_tag, Args &&... args)
就地构造
DT & emplace(std::initializer_list< U > ilist, Args &&... args)
使用初始化列表就地构造
异常处理框架
typename aligned_storage< Len, Align >::type aligned_storage_t
aligned_storage的便捷别名
const T * any_cast(const any *value) noexcept
从any对象转换常量值
any make_any(Args &&... args)
创建any对象
NEFORCE_NODISCARD constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
NEFORCE_NORETURN NEFORCE_ALWAYS_INLINE_INLINE void unreachable() noexcept
标记不可达代码路径
typename remove_cvref< T >::type remove_cvref_t
remove_cvref的便捷别名
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
typename decay< T >::type decay_t
decay的便捷别名
NEFORCE_INLINE17 constexpr bool is_copy_constructible_v
is_copy_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_constructible_v
is_constructible的便捷变量模板
NEFORCE_INLINE17 constexpr bool disjunction_v
disjunction的便捷变量模板
NEFORCE_INLINE17 constexpr bool is_same_v
is_same的便捷变量模板
typename conditional< Test, T1, T2 >::type conditional_t
conditional的便捷别名
typename enable_if< Test, T >::type enable_if_t
enable_if的便捷别名
exception(const char *info=static_type, const char *type=static_type, const int code=0)
构造函数
NEFORCE_NODISCARD int code() const noexcept
获取异常码
NEFORCE_NODISCARD const char * type() const noexcept
获取异常类型
原位构造标签
判断类型是否可以使用指定参数构造
判断类型是否可复制构造