LeviLamina
Loading...
Searching...
No Matches
DataItem2.h
1#pragma once
2
3#include "mc/_HeaderOutputPredefine.h"
4#include "mc/world/actor/DataItem.h"
5
6template <typename T>
7 requires(DataItem::TypeList::contains<T>)
8class DataItem2 : public DataItem {
9public:
10 ::DataItemType mType;
11 ::DataItem::ID mId;
12 T mValue;
13
14public:
15 [[nodiscard]] ::DataItem::ID getId() const override;
16
17 [[nodiscard]] ::DataItemType getType() const override;
18
19 [[nodiscard]] bool isDataEqual(::DataItem const&) const override;
20
21 [[nodiscard]] ::std::unique_ptr<::DataItem> clone() const override;
22
23public:
24 [[nodiscard]] constexpr T const& value() const { return mValue; }
25
26 [[nodiscard]] constexpr T& value() { return mValue; }
27
28 [[nodiscard]] constexpr explicit operator T const&() const { return mValue; }
29
30 [[nodiscard]] constexpr explicit operator T&() { return mValue; }
31
32 template <class T2>
33 constexpr void setData(T2&& value) {
34 mValue = value;
35 }
36 template <class T2>
37 constexpr DataItem2<T>& operator=(T2&& value) {
38 setData(value);
39 return *this;
40 }
41 template <class... Args>
42 constexpr explicit DataItem2(::DataItem::ID key, Args&&... args)
43 : mType((::DataItemType)DataItem::TypeList::index<T>),
44 mId(key),
45 mValue(std::forward<Args>(args)...) {}
46};
47
48template <typename T>
49 requires(DataItem::TypeList::contains<T>)
50constexpr optional_ref<T const> DataItem::getData() const {
51 if (getType() == (::DataItemType)TypeList::index<T>) return ((DataItem2<T>*)this)->mValue;
52 return nullptr;
53}
54
55template <typename T>
56 requires(DataItem::TypeList::contains<T>)
57constexpr optional_ref<T> DataItem::getData() {
58 if (getType() == (::DataItemType)TypeList::index<T>) return ((DataItem2<T>*)this)->mValue;
59 return nullptr;
60}
61
62template <typename T>
63 requires(DataItem::TypeList::contains<std::remove_cvref_t<T>>)
64constexpr bool DataItem::setData(T&& value) {
65 if (getType() == (::DataItemType)TypeList::index<T>) return false;
66 ((DataItem2<T>*)this)->setData(std::forward<T>(value));
67 return true;
68}
69
70template <typename T>
71 requires(DataItem::TypeList::contains<std::remove_cvref_t<T>>)
72LL_CONSTEXPR23 std::unique_ptr<DataItem> DataItem::create(::DataItem::ID key, T&& value) {
73 return std::make_unique<DataItem2<std::remove_cvref_t<T>>>(key, std::forward<T>(value));
74}
Definition DataItem2.h:8
Definition DataItem.h:14
Definition optional_ref.h:10
STL namespace.