NexusForce 1.0.0
A rigorously engineered full-stack C++ backend library.
载入中...
搜索中...
未找到
property.hpp
浏览该文件的文档.
1#ifndef NEFORCE_CORE_REFLECT_PROPERTY_HPP__
2#define NEFORCE_CORE_REFLECT_PROPERTY_HPP__
3
12
16NEFORCE_BEGIN_NAMESPACE__
17NEFORCE_BEGIN_REFLECT__
18
24
33 PROP_TRANSIENT = 1 << 0,
34 PROP_REQUIRED = 1 << 1,
35 PROP_READ_ONLY = 1 << 2,
36 PROP_OPTIONAL = 1 << 3,
37 PROP_VERSIONED = 1 << 4,
38
40 PROP_AUTO_INC = 1 << 6,
41 PROP_UNIQUE = 1 << 7,
42 PROP_INDEX = 1 << 8,
44};
45
52NEFORCE_NODISCARD constexpr bool prop_has_attr(const uint16_t attrs, const property_attr flag) noexcept {
53 return (attrs & static_cast<uint16_t>(flag)) != 0;
54}
55
63public:
64 using getter = function<meta_any(const void*)>;
65 using setter = function<void(void*, const meta_any&)>;
66
67private:
68 string_view name_;
69 reflect::type_id type_id_;
70 getter getter_;
71 setter setter_;
72 uint16_t attrs_ = PROP_NONE;
73 uint32_t version_ = 0;
74 string notify_signal_name_;
75
76public:
86 const uint16_t attrs = PROP_NONE) :
87 name_(name),
88 type_id_(type_id),
89 getter_(move(getter)),
90 setter_(move(setter)),
91 attrs_(attrs) {}
92
97 NEFORCE_NODISCARD string_view name() const noexcept { return name_; }
98
103 NEFORCE_NODISCARD reflect::type_id type_id() const noexcept { return type_id_; }
104
109 NEFORCE_NODISCARD uint16_t attributes() const noexcept { return attrs_; }
110
115 void set_attributes(const uint16_t attrs) noexcept { attrs_ = attrs; }
116
120 NEFORCE_NODISCARD bool is_transient() const noexcept { return prop_has_attr(attrs_, PROP_TRANSIENT); }
121
125 NEFORCE_NODISCARD bool is_required() const noexcept { return prop_has_attr(attrs_, PROP_REQUIRED); }
126
130 NEFORCE_NODISCARD bool is_readonly() const noexcept { return prop_has_attr(attrs_, PROP_READ_ONLY); }
131
135 NEFORCE_NODISCARD bool is_optional() const noexcept { return prop_has_attr(attrs_, PROP_OPTIONAL); }
136
140 NEFORCE_NODISCARD bool is_versioned() const noexcept { return prop_has_attr(attrs_, PROP_VERSIONED); }
141
145 NEFORCE_NODISCARD bool is_primary_key() const noexcept { return prop_has_attr(attrs_, PROP_PRIMARY_KEY); }
146
150 NEFORCE_NODISCARD bool is_auto_increment() const noexcept { return prop_has_attr(attrs_, PROP_AUTO_INC); }
151
155 NEFORCE_NODISCARD bool is_unique() const noexcept { return prop_has_attr(attrs_, PROP_UNIQUE); }
156
160 NEFORCE_NODISCARD bool is_index() const noexcept { return prop_has_attr(attrs_, PROP_INDEX); }
161
165 NEFORCE_NODISCARD bool is_foreign_key() const noexcept { return prop_has_attr(attrs_, PROP_FOREIGN_KEY); }
166
171 void set_notify_signal(string_view signal_name) { notify_signal_name_ = signal_name; }
172
176 NEFORCE_NODISCARD string_view notify_signal() const noexcept { return notify_signal_name_.view(); }
177
181 NEFORCE_NODISCARD bool has_notify_signal() const noexcept { return !notify_signal_name_.empty(); }
182
186 NEFORCE_NODISCARD uint32_t version() const noexcept { return version_; }
187
192 void set_version(const uint32_t ver) noexcept { version_ = ver; }
193
199 NEFORCE_NODISCARD meta_any get(const void* obj) const {
200 if (obj == nullptr || !getter_) {
201 return meta_any{};
202 }
203 return getter_(obj);
204 }
205
212 bool set(void* obj, const meta_any& value) const {
213 if (obj == nullptr || !setter_) {
214 return false;
215 }
216 try {
217 setter_(obj, value);
218 return true;
219 } catch (...) {
220 return false;
221 }
222 }
223
231 template <typename T, enable_if_t<!is_same_v<meta_any, decay_t<T>>, int> = 0>
232 bool set(void* obj, T&& value) const {
233 return this->set(obj, meta_any{_NEFORCE forward<T>(value)});
234 }
235};
236 // Reflection
238
239NEFORCE_END_REFLECT__
240NEFORCE_END_NAMESPACE__
241#endif // NEFORCE_CORE_REFLECT_PROPERTY_HPP__
constexpr basic_string_view view(const size_type off, const size_type count=npos) const
获取子视图
函数包装器主模板声明
bool is_readonly() const noexcept
是否为只读属性
bool is_primary_key() const noexcept
是否为主键列
void set_version(const uint32_t ver) noexcept
设置版本号
string_view notify_signal() const noexcept
获取变更通知信号名称
bool is_versioned() const noexcept
是否启用版本追踪
bool is_transient() const noexcept
是否为暂态属性(不参与序列化)
bool set(void *obj, T &&value) const
设置属性值(直接值版本)
bool set(void *obj, const meta_any &value) const
设置属性值
meta_property(string_view name, reflect::type_id type_id, getter getter, setter setter, const uint16_t attrs=PROP_NONE)
构造函数
bool is_auto_increment() const noexcept
是否为自增列
bool is_optional() const noexcept
是否为可选属性
function< void(void *, const meta_any &)> setter
属性写入器类型
void set_attributes(const uint16_t attrs) noexcept
设置属性注解
string_view name() const noexcept
获取属性名称
bool is_index() const noexcept
是否有索引
bool is_foreign_key() const noexcept
是否为外键列
uint32_t version() const noexcept
获取版本号
meta_any get(const void *obj) const
获取属性值
bool has_notify_signal() const noexcept
是否有变更通知信号
void set_notify_signal(string_view signal_name)
设置变更通知信号名称
uint16_t attributes() const noexcept
获取属性注解
bool is_required() const noexcept
是否为必填属性(反序列化时必须存在)
function< meta_any(const void *)> getter
属性读取器类型
reflect::type_id type_id() const noexcept
获取属性类型ID
bool is_unique() const noexcept
是否有唯一约束
通用函数包装器
constexpr T && forward(remove_reference_t< T > &x) noexcept
完美转发左值
unsigned int uint32_t
32位无符号整数类型
unsigned short uint16_t
16位无符号整数类型
size_t type_id
类型标识符
constexpr bool prop_has_attr(const uint16_t attrs, const property_attr flag) noexcept
检查属性注解是否包含指定标志
property_attr
属性注解标志
@ PROP_INDEX
数据库普通索引
@ PROP_OPTIONAL
反序列化时可缺失
@ PROP_READ_ONLY
仅 getter,无 setter
@ PROP_VERSIONED
启用版本追踪
@ PROP_AUTO_INC
数据库自增列
@ PROP_FOREIGN_KEY
数据库外键列
@ PROP_REQUIRED
反序列化时必须存在
@ PROP_PRIMARY_KEY
数据库主键列
@ PROP_UNIQUE
数据库唯一约束
@ PROP_TRANSIENT
序列化时跳过此属性
constexpr Iterator2 move(Iterator1 first, Iterator1 last, Iterator2 result) noexcept(noexcept(inner::__move_aux(first, last, result)))
移动范围元素
basic_string_view< char > string_view
字符字符串视图
类型擦除容器
字符串类型别名和实用函数