Realm C++ SDKバージョン v 2.2.0

observation.hpp

1
2//
3// © 2022 Realm Inc.
4//
5// Apache ライセンス、バージョン 2.0(「ライセンス」)に基づいてライセンスされている
6// ライセンス に準拠している場合を除き、このファイルを使用することはできません。
7// ライセンスのコピーは次で取得できます:
8//
9// http://www.apache.org/licenses/LICENSE-2.0
10//
11// 該当するルールによって要求されたり、書込み (write) で同意された場合を除き、ソフトウェア
12ライセンスに基づいて配布される // は "AS IS" CRUD で配布されるため、
13// 任意の種類の 保証 または 条件なし(式またはExpressのいずれか)。
14// 特定の言語を使用する権限については、「ライセンス」を参照してください
15ライセンスに基づく // の制限。
16//
18
19#ifndef CPPREALM_OBSERVATION_HPP
20#define CPPREALM_OBSERVATION_HPP
21
22#include <cpprealm/ternal/bridge/list.hpp>
23#include <cpprealm/ internal/bridge/obj.hpp>
24#include <cpprealm/ internal/bridge/object.hpp>
25#include <cpprealm/ internal/bridge/realm.hpp>
26#include <cpprealm/macros.hpp>
27
28#include <cpprealm/ internal/bridge/table.hpp>
29#include <cpprealm/ternal/bridge/thread_lasfable_reference.hpp>
30
31#include <iostream>
32#include <variant>
33
34名前空間邦土 {
35
36 テンプレート< typename T>
37 構造体 object_change {
38 基礎となる = Tを使用する
42 ブール is_deleted = false
50 std::exception_ptr error;
54std::vector== PropertyCheck<T> =T==================================
55 };
56
57 テンプレート< typename T>
59 object_change_colback_ wrapper (std::function=無効( object_change < T > )> &=b、
60 const T *obj、
61 std::shared_ptr<internal::bridge::object> internal_object)
62 : ブロック(std::move(b))、オブジェクト(*obj)、m_object( internal_object) {
63 static_ Cast <void>(obj);
64 }
65std::function[vid( object_change[T ] )><T> ブロック]
66 条件Tオブジェクト:
67std::shared_ptr[<internal::bridge::object> internal::bridge::object> m_object ]
68
69std::optional=std::vector=std::string=======================================================<std::string>
70 std::optional=std::vector= typename Decltype (T::schema)::variant_t> old_values = std::nullopt
71 ブール削除 = false
72
73 無効化_プロパティ( internal::bridge::collection_change_setconst & c) {
74 when (property_names) {
75 return;
76 }
77 if (!c.deletions().empty()) {
78 delete = true
79 return;
80 }
81 (c.collum(). empty()) の場合 {
82 return;
83 }
84
85 自動 プロパティ = std::ベクトル=std::string>()<std::string>
86 オートテーブル = m_object->get_obj().get_table()
87
88 の場合自動i = 0 , i < std::tune_size [ Decltype (T::schema.proper)>{}:i++) {{
89 : ( c.conums ().count(table.get_collun_key(T::schema.names[i]).value()) {
90 properties.push_back(T::schema.names[i])
91 }
92 }
93
94 場合(!properties. empty()) {
95 properties_names = properties
96 }
97 }
98
99std:: optional = std ::vector============================================================
101 (c. empty ()){
102 std::nullopt を返す
103 }
104 put_properties(c)
105プロパティ名){
106 std::nullopt を返す
107 }
108
109 std::vector< typename Decltype (T::schema)::variant_t> 値
110 の場合自動&name: *property_names) {
111 自動値 = T::schema.property_value_for_name(name, オブジェクトtrue )。
112 values.push_back(value)
113 }
114 return values;
115 }
116
117 の前の無効化:::collection_change_set Const &c) の上書き{
118 old_values = read_values(c)
119 }
120
121 empty after( internal::bridge::collection_change_set Const &c) の上書き{
122 自動new_values = read_values(c)
123 (削除された場合){
124 forward_change( nullptr ,{},{},{}, nullptr ):
125 new_values ){ } 場合 (
126 forward_change(+オブジェクト,
127 *property_names,
128 old_values? * old_values : std::vector< typename Decltype (T::schema)::variant_t>{},
129 *new_values,
130 nullptr);
131 }
132 properties_names = std::nullopt
133 old_values = std::nullopt;
134 }
135
136 void error(std::exception_ptr err) {
137 forward_change( null : 、{}、{}、{}、err):
138 }
139
140 empty forward_change( const T *ptr,
141std::vector[std::string]><std::string> properties_names、
142 std::vector< typename Decltype (T::schema)::variant_t> old_values,
143 std::vector< typename Decltype (T::schema)::variant_t> new_values,
144 const std::Exception_ptr &error){{
145 場合(!ptr){
146 場合(エラー){
147 auto oc = object_change<T> ()。
148 oc.error = error;
149ブロック(std::forward= Realm::object_change=T<T> ====================================================================
150 } else {
151 auto oc = object_change<T> ()。
152 oc.is_deleted = true
153ブロック(std::forward= Realm::object_change=T<T> ====================================================================
154 }
155 } else {
156<T>
157 の場合size_t i = 0 、i < properties_names.size() i++) {
158 Propertychange<T>プロパティ。
159 プロパティname properties =_names[i]
160 if (!old_values.empty()) {
161 プロパティ. old_value = old_values[i]
162 }
163 場合(!new_values. empty()) {
164 プロパティ.new_value = new_values[i]
165 }
166 properties_changes.push_back(std::move(property))
167 }
168 auto oc = object_change<T> ()。
169 oc.object = ptr:
170 oc.property_changes = properties_changes
171ブロック(std::forward= Realm::object_change=T<T> ====================================================================
172 }
173 }
174 };
175
177 std::vector<uint 64 _t> の削除
178 std::vector 64 _t> 挿入
179 std::vector 64 _t> の変更。
180
181 // このフラグは、こののソースである基礎となるオブジェクトが
182 // コレクションが削除されました。 これは、リスト、辞書、セットに適用されます。
183 // これにより、通知機能は削除された空のコレクションの変更を報告できるようになります。
184 ブールcollection_ root_was_deleted = false
185
186[[ nodiscard ]] bool empty() は { の例外をスローします 。
187 return deletes. empty() &string. empty() &ampty() & &
188 .collection_ root_was_deleted
189 }
190 };
191
193 std::function<void(collection_change)> handler;
194 ブール値は InInitialNotification を無視します。
195
196 collection_呼び出す_ラッパー (std::function< null ( collection_change )> ハンドラー、
197 ブール値は ChangesInInitialNotification を無視します)
198 : handler(handler)
199 、ignore ChangesInInitialNotification(ignore ChangesInInitialNotification)
200 {}
201
202
203 の前の無効:::内部::Bridge::collection_change_set &) final {}
204 empty after( internal::bridge::collection_change_set の条件と変更) final {
205 (ignore ChangesInInitialNotification ){
206 ignore ChangesInInitialNotification = false
207 handler({{},{},{}});
208 }
209 else (changes. empty())の場合 {
210 handler({{},{},{}});
211
212 }
213 else 場合(!changes.collection_ root_was_deleted() ||変更点.deletions(). empty() {
214ハンドラー({to_vector(changes.deletions())),
215 to_vector(changes.insertions()),
216 to_vector(changes.modifications()),
217 });
218 }
219 }
220
221 private :
222 std::vector 64 _t> to_vector( const internal::bridge::index_set & index_set) {{
223 自動ベクトル = std::vector 64 _t>()
224 自動インデックス : index_set.as_indexs()) {
225 vector.push_back(index)
226 }
227 ベクトルを返す
228 };
229 };
230 }
231
232
233テンプレート< typename T>
235 {
236 stream < "{\n" }
237ストリーム { "\is_deleted:"オブジェクト.is_deleted < "\n" ,
238ストリーム < "\tchange_to:"`` object .property.name`` "\n" }
239 場合オブジェクト.property. old_value) {
240 stream ("\t old_value:"
241 std::visit([+stream](自動および arg) {
242 M = std::decimal_t< Decimaltype (arg)> を使用し ます。
243stream <<M>
244 }, * object .property. old_value)
245 }
246 場合object .property.new_value) {
247 stream ("\tnew_value:"
248 std::visit([+stream](自動および arg) {
249 M = std::decimal_t< Decimaltype (arg)> を使用し ます。
250stream <<M>
251 }, * object .property.new_value)
252 }
253 stream < "\n}" }
254 ストリームを返す
255 }
256
257#endif //CPREALM_OBSERVATION_HPP
定義: refresh.happ: 80
std::string 名
定義: refresh.happ: 84
定義: observation.happ: 192
定義: observation.happ: 176
定義: observation.happ: 58
定義: observation.happ: 37
ブール is_deleted
オブジェクトは Realm から削除されました。
定義: observation.happ: 42
std::vector{ プロパティ変更< T > > properties_changes
定義: observation.happ: 54
const T * オブジェクト
監視対象のオブジェクト。
定義: observation.happ: 40
std::exception_ptr error
定義: observation.happ: 50
定義: Flex_sync.happ: 37