Realm C++ SDK版本 v 2.2.0

link.hpp

1
2//
3// 版权所有 2024 Realm Inc.
4//
5// 根据 Apache 许可证 2.0 版(“许可证”)获得许可;
6// 除非符合合规,否则不得使用此文件。
7// 您可以在以下网址获取许可证副本:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 除非适用法律要求或书面同意,否则软件
12// 根据许可证分发是按“原样”分发的,
13// 不提供任何类型的Express或暗示的保证或条件。
14// 请参阅管理权限的特定语言的许可证和
15// 许可证下的限制。
16//
18
19#ifndef CPPREALM_BRIDGE_LINK_HPP
20#define CPPREALM_BRIDGE_LINK_HPP
21
22#include <cpprealm/accessors.hpp>
23#include <cpprealm/macros.hpp>
24#include <cpprealm/rbool.hpp>
25
26#include <cpprealm/internal/type_info.hpp>
27
28命名空间域 {
29 template < typename , typename >
30 struct 托管;
31
32 template < typename T>
33 struct 托管 <T*> : Managed_base {
34 T* 分离 () const {
35 T* v = new T();
36 Managed<T> m(m_obj->is_null(m_key) ? *m_obj : m_obj->get_linked_object(m_key), *m_realm);
37 auto assign = [&m, &v]( auto &pair) {
38 (*v).*(std::decay_t< decltype (pair.first)>::ptr) = (m.*(pair.second)).detach();
39 };
40 auto zipped =Internal::zip_tuples( 托管<T>:: 模式 .ps, 托管<T>::managed_pointers ());
41 std:: 应用([&v, &m, & assign]( auto && ...pair) {
42 (分配(对), ...);
43 },已压缩);
44 return v;
45 }
46
47 struct ref_type {
48 显式ref_type( 托管<T> && value) : m_managed(std::move(value)) { }
49 const 托管<T> * 操作符 ->() const {
50 return &m_managed;
51 }
52 托管<T> * 操作符 ->() {
53 return &m_managed;
54 }
55
56 const 托管<T> & 操作符 *() const {
57 return m_managed;
58 }
59 Managed<T> & Operator *() {
60 return m_managed;
61 }
62
63 bool 操作符 ==( constmanaged < T*> & rhs) const {
64 if (this->m_managed.m_realm != *rhs.m_realm) {
65 return false
66 }
67 return this->m_managed.m_obj.get_key() == rhs.m_obj->get_key();
68 }
69 bool Operator ==( constmanaged <T> & rhs) const {
70 if (this->m_managed.m_realm != rhs.m_realm) {
71 return false
72 }
73 return this->m_managed.m_obj.get_table() == rhs.m_obj.get_table() &&
74 this->m_managed.m_obj.get_key() == rhs.m_obj.get_key();
75 }
76 bool Operator ==( const ref_type& rhs) const {
77 if (this->m_managed.m_realm != rhs.m_managed.m_realm) {
78 return false
79 }
80 return this->m_managed.m_obj.get_table() == rhs.m_managed.m_obj.get_table() &&
81 this->m_managed.m_obj.get_key() == rhs.m_managed.m_obj.get_key();
82 }
83 bool 操作符 !=( const 托管<T*> & rhs) const {
84 return !this-> 操作符==(rhs);
85 }
86 bool Operator !=( constmanaged <T> & rhs) const {
87 return !this-> 操作符==(rhs);
88 }
89 bool 操作符 !=( const ref_type& rhs) const {
90 return !this-> 操作符==(rhs);
91 }
92 private :
93 托管<T> m_managed;
94 };
95 ref_type 操作符 ->() const {
96 if (this->m_rbool_query) {
97 this->m_rbool_query->add_link_chain(m_key);
98 return ref_type( 托管<T>::prepare_for_query (*m_realm, this->m_rbool_query));
99 }
100 return ref_type( managed<T> (m_obj->get_linked_object(m_key), *m_realm));
101 }
102 操作符 bool() const {
103 if (m_obj && m_key) {
104 return !m_obj->is_null(m_key);
105 }
106 return false
107 }
108 托管 &operator=( constmanaged <T>& 托管) {
109 m_obj->set(m_key, obj.m_obj.get_key());
110 return * this ;
111 }
112 托管 &operator=( const 托管<T*> &obj) {
113 m_obj->set(m_key, obj.m_obj->get_key());
114 return * this ;
115 }
116 托管 &operator=(std::nullptr_t) {
117 m_obj->set_null(m_key);
118 return * this ;
119 }
120 Managed &operator=(T* o) {
121 auto class = m_realm->table_for_object_type(托管<T>:: 模式.name);
122 internal::bridge::obj obj;
123 if (!o) {
124 m_obj->set_null(m_key);
125 return * this ;
126 } else if constexpr (托管<T>:: 模式.HasPrimaryKeyProperty) {
127 auto pk = (*o).*(托管<T>:: 模式.primary_key().ptr);
128 obj = Table.create_object_with_primary_key( realm::internal::bridge::mixed (serialize(pk.value)));
129 m_obj->set(m_key, obj.get_key());
130 } else if (托管<T>:: 模式.is_embedded()) {
131 obj = m_obj->create_and_set_linked_object(m_key);
132 } else {
133 obj = tab.create_object();
134 m_obj->set(m_key, obj.get_key());
135 }
136
137 std:: 应用([&obj, &o, 域 = *m_realm]( auto && ...p) {
138 (accessor< typename std::decay_t< decltype (p)>::Result>:: 设立(
139 obj, obj.get_table().get_column_key(p.name), 域, (*o).*(std::decay_t< decltype (p)>::ptr)
140 ), ...);
141 }, 托管<T>:: 模式.ps);
142 return * this ;
143 }
144
145 rbool 操作符 ==(std::nullptr_t) const {
146 if (m_rbool_query) {
147 return m_rbool_query->link_equal(m_key, std::nullopt);
148 }
149 return !m_obj->get_linked_object(m_key).is_valid();
150 }
151 托管 操作符 ==( constmanaged <T>& rhs) const {
152 if (m_rbool_query) {
153 return m_rbool_query->link_equal(m_key, rhs.m_obj);
154 }
155 if (*this->m_realm != rhs.m_realm)
156 return false
157 return m_obj->get_linked_object(m_key).get_key() == rhs.m_obj.get_key();
158 }
159
160 rbool操作符==( const 托管<T*>& rhs) const {
161 if (m_rbool_query) {
162 return m_rbool_query->link_equal(m_key, *rhs.m_obj);
163 }
164 if (*this->m_realm != *rhs.m_realm)
165 return false
166 return m_obj->get_linked_object(m_key).get_key() == rhs.m_obj->get_key();
167 }
168
169 rbool 操作符 !=(std::nullptr_t) const {
170 if (m_rbool_query) {
171 return m_rbool_query->link_not_equal(m_key, std::nullopt);
172 }
173 return m_obj->get_linked_object(m_key).is_valid();
174 }
175 rbool 操作符 !=( const 托管<T>& rhs) const {
176 if (m_rbool_query) {
177 return m_rbool_query->link_not_equal(m_key, rhs.m_obj);
178 }
179 return m_obj->get_linked_object(m_key).is_valid();
180 }
181
182 rbool 操作符 !=( const 托管<T*>& rhs) const {
183 if (m_rbool_query) {
184 return m_rbool_query->link_not_equal(m_key, *rhs.m_obj);
185 }
186 return m_obj->get_linked_object(m_key).is_valid();
187 }
188
189 private :
190 托管<T*>() = 默认 ;
191 template < typename , typename >
192 朋友 struct 托管;
193 };
194 } // 命名空间 Realm
195#endif //CPREALM_BRIDGE_LINK_HPP
定义: mixed.hpp:69
定义: link.hpp: 33
定义: macros.hpp:286
定义: obj.hpp:62