Realm C++ SDK 버전 v2.2.0

link.hpp

1
2//
3//저작권 2024 Realm Inc.
4//
5// Apache 라이선스, 버전 2.0("라이선스")에 따라 라이선스가 부여됩니다.
6// 라이선스를 준수하는 경우를 제외하고는 이 파일을 사용할 수 없습니다.
7// 다음에서 라이선스 사본을 얻을 수 있습니다.
8//
9// http://www.apache.org/licences/LICENSE-2.0
10//
11// 관련 법률에서 요구하거나 문서로 동의하지 않는 한, 소프트웨어
12// 라이선스에 따라 배포되는 것은 '있는 그대로' 배포됩니다,
13// Express 묵시적이든 어떤 종류의 보증이나 조건도 제공하지 않습니다.
14// 권한을 관리하는 특정 언어에 대한 내용은 라이선스를 참조하세요.
15// 라이선스에 따른 제한 사항.
16//
18
19#ifndef CPPREALM_BRIDGE_LINK_HPP
20#define CPPRALM_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 템플릿 <typename, typename>
30 구조체 managed;
31
32 템플릿<typename T>
33 구조체 managed<T*> : managed_base {
34 T* fetch() const {
35 T* v = new T();
36 managed<T> m(m_obj->is_null(m_key) ? *m_obj : m_obj->get_linking_object(m_key), *m_realm);
37 자동 할당 = [&m, &v](자동& 쌍) {
38 (*v).*(std::decay_t<decltype(pair.first)>::ptr) = (m.*(pair.second)).ttach();
39 };
40 auto zipped = internal::zip_tuples(managed<T>:: 스키마.ps, managed<T>::managed_pointers());
41 std:: 적용([&v, &m, &assign](auto && ...pair) {
42 (assign(pair), ...);
43 }, 압축),
44 return v;
45 }
46
47 struct ref_type {
48 명시적 ref_type(managed<T>&& value) : m_managed(std::move(value)) { }
49 const managed<T>* 연산자 ->() const {
50 반환 &m_managed;
51 }
52 managed<T>* 연산자 ->() {
53 반환 &m_managed;
54 }
55
56 const managed<T>& 연산자 *() const {
57 return m_managed;
58 }
59 managed<T>& 연산자 *() {
60 return m_managed;
61 }
62
63 bool 연산자 ==(const managed<T*>& rhs) const {
64 if ( this->m_managed.m_realm != *rhs.m_realm) {
65 반환 false;
66 }
67 return this->m_managed.m_obj.get_key() == rhs.m_obj->get_key();
68 }
69 bool 연산자 ==(const managed<T>& rhs) const {
70 if (This->m_managed.m_realm != rhs.m_realm) {
71 반환 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 연산자 ==(const ref_type& rhs) const {
77 if ( this->m_managed.m_realm != rhs.m_managed.m_realm) {
78 반환 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 managed<T*>& rhs) const {
84 return ! this-> 연산자==(rhs);
85 }
86 bool 연산자 !=(const managed<T>& rhs) const {
87 return ! this-> 연산자==(rhs);
88 }
89 bool 연산자 !=(const ref_type& rhs) const {
90 return ! this-> 연산자==(rhs);
91 }
92 private:
93 managed<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(managed<T>::prepare_for_query(*m_realm, this->m_rbool_query));
99 }
100 return ref_type(managed<T>(m_obj->get_linking_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 반환 false;
107 }
108 managed &operator=(const managed<T>& obj) {
109 m_obj->set(m_key, obj.m_obj.get_key());
110 return *this;
111 }
112 managed &operator=(const managed<T*> &obj) {
113 m_obj->set(m_key, obj.m_obj->get_key());
114 return *this;
115 }
116 managed &operator=(std::nullptr_t) {
117 m_obj->set_null(m_key);
118 return *this;
119 }
120 managed &operator=(T* o) {
121 자동 테이블 = m_realm->table_for_object_type(managed<T>:: 스키마.name);
122 internal::bridge::obj obj;
123 if (!o) {
124 m_obj->set_null(m_key);
125 return *this;
126 } other if constexpr (managed::<T> 스키마.HasPrimaryKeyProperty ) {
127 auto pk = (*o).*(managed<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 } other if (managed::<T> 스키마.is_embedded ()) {
131 obj = m_obj->create_and_set_linking_object(m_key);
132 } 다른 {
133 obj = table.create_object();
134 m_obj->set(m_key, obj.get_key());
135 }
136
137 std:: 적용([&obj, &o, 영역 = *m_realm](auto && ...p) {
138 (접근자<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 }, managed<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 rbool 연산자 ==(const managed<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 반환 false;
157 return m_obj->get_linking_object(m_key).get_key() == rhs.m_obj.get_key();
158 }
159
160 rbool 연산자 ==(const managed<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 반환 false;
166 return m_obj->get_linking_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_linking_object(m_key).is_valid();
174 }
175 rbool 연산자 !=(const managed<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_linking_object(m_key).is_valid();
180 }
181
182 rbool 연산자 !=(const managed<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_linking_object(m_key).is_valid();
187 }
188
189 private:
190 managed<T*>() = 기본값;
191 템플릿<typename, typename>
192 친구 구조체 managed;
193 };
194} //네임스페이스 영역
195#endif //CPPREALM_BRIDGE_LINK_HPP
정의: link.hpp:33
정의: 매크로.hpp:286
정의: obj.hpp:62