19#ifndef CPPREALM_RESULTS_HPP
20#define CPPREALM_RESULTS_HPP
22#include <cpprealm/internal/bridge/mixed.hpp>
23#include <cpprealm/internal/bridge/query.hpp>
24#include <cpprealm/internal/bridge/results.hpp>
25#include <cprealm/internal/bridge/table.hpp>
26#include <cprealm/macros.hpp>
27#include <cprealm/notifications.hpp>
28#include <cprealm/schema.hpp>
29#include <cprealm/rbool.hpp>
32 struct mutable_sync_subscription_set;
37 usando sort_descriptor = internal::bridge::sort_descriptor;
40 estrutura de resultados;
41 template<
typename T,
typename Derivado,
typename ShouldEnable= null >
43 template<
typename T,
typename Derivado>
46 template<
typename T,
typename Derivado>
53 std::vector<uint64_t> exclusões;
54 std::vector<uint64_t> inserções;
55 std::vector<uint64_t> modificações;
60 bool collection_root_was_deleted =
false;
62 [[nodiscard]]
bool empty()
const noexceto {
63 return deleteries.empty() && inserts.empty() && modified.empty() &&
64 !collection_root_was_deleted;
69 return m_parent.size();
73 Derivado de onde(
const std::string &query,
const std::vector<realm::mixed>& argumentos) {
74 std::vector<internal::bridge::mixed> mixed_args;
75 para(
auto& a : argumentos)
76 mixed_args.push_back(serialize(a));
78 m_parent.get_table().query(query, std::move(mixed_args))));
81 Derivado de onde(std::function<rbool(managed<T>&)>&& fn) {
82 estático_assert(
sizeof(managed<T>),
"Deve declarar esquema para T");
83 auto realm = m_parent.get_realm();
84 auto schema = realm.schema().find(managed<T>::schema.name);
85 auto group = Realm.read_group();
86 auto table_ref = group.get_table(schema.table_key());
87 rbool query = rbool(internal::bridge::query(table_ref));
88 auto query_object = managed<T>::prepare_for_query(realm, &query);
89 auto full_query = fn(query_object).q;
90 return Derived(internal::bridge::results(m_parent.get_realm(), full_query));
96 bool ignore_initial_notification =
true)
97 : m_handler(std::move(fn)),
99 m_ignore_changes_in_initial_notification(ignore_initial_notification) {}
104 se (m_ignore_changes_in_initial_notification) {
105 m_ignore_changes_in_initial_notification =
false;
106 m_handler({collection, {}, {} , {}});
107 }
mais se (changes.empty()) {
108 m_handler({collection, {}, {} , {}});
109 }
mais se (!changes.collection_root_was_deleted() || !changes.deletions().empty() {
112 to_vector(changes.deletions()),
113 to_vector(changes.insertions()),
114 to_vector(changes.modifications()),
123 bool m_ignore_changes_in_initial_notification;
125 auto vector = std::vector<uint64_t>();
126 para ( índice
automático : index_set.as_indexes()) {
127 vector.push_back(index);
134 auto r = std::make_shared<internal::bridge::results>(m_parent.get_realm(), m_parent.get_realm().table_for_object_type(
managed<T>::schema.name));
135 Realm::notification_token token = r->add_notification_callback(std::make_shared<results_callback_wrapper>(std::move(handler),
static_cast<Derived*
>(
this)));
136 token.m_realm = r->get_realm();
141 Congelamento derivado () {
142 auto ice_realm = m_parent.get_realm().freeze();
146 Descongelamento derivado() {
147 auto tailed_realm = m_parent.get_realm().thaw();
148 return Derived(internal::bridge::results(thubed_realm, thawed_realm.table_for_object_type(managed<T>::schema.name)));
152 return m_parent.get_realm().is_frozen();
155 Classificação derivada(
const std::string& key_path,
bool ascendente) {
156 return Derivado(m_parent.sort({{key_path, ascendente}}));
159 Classificação derivada(
const std::vector<sort_descriptor>& sort_descriptors) {
160 return Derivado(m_parent.sort(sort_descriptors));
164 internal::bridge::results m_parent;
165 <auto>
modelo estrutura de amigo linking_objects;
169 usando results_is_primitive = std::enable_if_t<!managed<T>::is_object && !std::is_enum_v<T> && !internal::type_info::is_variant_t<T>::value>;
171 usando results_is_enum = std::enable_if_t<!managed<T>::is_object && std::is_enum_v<T> && !internal::type_info::is_variant_t<T>::value>;
173 usando results_is_mixed = std::enable_if_t<!managed<T>::is_object && !std::is_enum_v<T> && internal::type_info::is_variant_t<T>::value>;
175 template<
typename T,
typename Derivado>
181 Operador T[](índice
size_t ) {
182 se (index >= this->m_parent.size())
183 lance std::out_of_range(
"Índice fora do intervalo.");
184 return internal::bridge::get<T>(This->m_parent, index);
189 usando change_type = tamanho_t;
190 usando value_type = T;
191 usando iterator_category = std::input_iterator_tag;
193 operador de
bool !=(
const iterador e outros)
const {
194 return !(*
isto == outro);
197 operador
bool ==( iterador
const e outros)
const {
198 return (m_parent == other.m_parent) && (m_idx == outro.m_idx);
201 operador value_type*()
noexceto {
202 return m_parent->operator[](m_idx);
205 iterador e operador++() {
210 operador do iterador++(
int i) {
215 iterador
explícito (
size_t idx, derivado *principal)
216 : m_idx(idx), m_parent(parent) {
220 Derivado de *m_parent;
224 return iterador(0,
estático_cast<Derivado*
>(
isto));
228 return iterador(isto->m_parent.size(),
estático_cast <Derivado *
>(
isto));
232 template<
typename T,
typename Derivado>
238 Operador T[](índice
size_t ) {
239 se (index >= this->m_parent.size())
240 lance std::out_of_range(
"Índice fora do intervalo.");
241 return deserialize<T>(internal::bridge::get<internal::bridge::mixed>(This->m_parent, index));
252 usando change_type = tamanho_t;
253 usando value_type = T;
254 usando iterator_category = std::input_iterator_tag;
256 operador de
bool !=(
const iterador e outros)
const {
257 return !(*
isto == outro);
260 operador
bool ==( iterador
const e outros)
const {
261 return (m_parent == other.m_parent) && (m_idx == outro.m_idx);
264 operador value_type*()
noexceto {
265 return m_parent->operator[](m_idx);
268 iterador e operador++() {
273 operador do iterador++(
int i) {
278 iterador
explícito (
size_t idx, derivado *principal)
279 : m_idx(idx), m_parent(parent) {
283 Derivado de *m_parent;
287 return iterador(0,
estático_cast<Derivado*
>(
isto));
291 return iterador(isto->m_parent.size(),
estático_cast <Derivado *
>(
isto));
295 template<
typename T,
typename Derivado>
301 Operador T[](índice
size_t ) {
302 se (index >= this->m_parent.size())
303 lance std::out_of_range(
"Índice fora do intervalo.");
304 Método estático_cast<T
>(internal::bridge::get<int64_t>(This->m_parent, index));
309 usando change_type = tamanho_t;
310 usando value_type = T;
311 usando iterator_category = std::input_iterator_tag;
313 operador de
bool !=(
const iterador e outros)
const {
314 return !(*
isto == outro);
317 operador
bool ==( iterador
const e outros)
const {
318 return (m_parent == other.m_parent) && (m_idx == outro.m_idx);
321 operador value_type*()
noexceto {
322 return m_parent->operator[](m_idx);
325 iterador e operador++() {
330 operador do iterador++(
int i) {
335 iterador
explícito (
size_t idx, derivado *principal)
336 : m_idx(idx), m_parent(parent) {
340 Derivado de *m_parent;
344 return iterador(0,
estático_cast<Derivado*
>(
isto));
348 return iterador(isto->m_parent.size(),
estático_cast <Derivado *
>(
isto));
352 template<
typename T,
typename Derivado>
359 se (index >= this->m_parent.size())
360 lance std::out_of_range(
"Índice fora do intervalo.");
361 Método managed<T, null>(internal::bridge::get<internal::bridge::obj>(This->m_parent, index), this->m_parent.get_realm());
366 usando change_type = tamanho_t;
368 usando iterator_category = std::input_iterator_tag;
370 operador de
bool !=(
const iterador e outros)
const {
371 return !(*
isto == outro);
374 operador
bool ==( iterador
const e outros)
const {
375 return (m_parent == other.m_parent) && (m_idx == outro.m_idx);
380 Método managed<T, null>(std::move(obj), this->m_parent->m_parent.get_realm());
383 iterador e operador++() {
388 operador do iterador++(
int i) {
393 iterador
explícito (
size_t idx, derivado *principal)
394 : m_idx(idx), m_parent(parent) {
398 Derivado de *m_parent;
402 return iterador(0,
estático_cast<Derivado*
>(
isto));
406 return iterador(isto->m_parent.size(),
estático_cast <Derivado *
>(
isto));
412 usando value_type = T;
420 estático in-line auto Ptr = ptr;
435 return iterador(0, get_results());
439 auto r = get_results();
440 return iterador(r.size(), r);
443 tamanho_t tamanho() {
444 return get_results().size();
447 return get_results()[idx];
452 auto table = m_obj->get_table();
453 se (!table.is_valid(m_obj->get_key())) {
454 lance std::logical_error(
"O objeto foi excluído ou invalidado.");
459 auto linking_property = schema.property_for_name(
managed<Class>::schema.
template name_for_property<ptr>());
460 se (!linking_property.column_key()) {
461 lance std::logical_error(
"Chave de coluna inválida para propriedade de origem.");
465 return ::realm::results<Class>(std::move(
results));
Definição: object.hpp:148
Definição: object.hpp:126
Definição: results.hpp:46
Definição: results.hpp:419
Definição: macros.hpp:286
Definição: notificações.hpp:38
Definição: results.hpp:42
Definição: results.hpp:93
Definição: results.hpp:51
Definição: results.hpp:47
Definição: results.hpp:411