19#ifndef CPPREALM_OBSERVATION_HPP
20#define CPPREALM_OBSERVATION_HPP
22#include <cpprealm/internal/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>
28#include <cpprealm/internal/bridge/table.hpp>
29#include <cpprealm/internal/bridge/thread_safe_reference.hpp>
61 std::shared_ptr<internal::bridge::object> internal_object)
62 : block(std::move(b)),
object(*obj), m_object(internal_object) {
63 static_cast<void>(obj);
67 std::shared_ptr<internal::bridge::object> m_object;
69 std::optional<std::vector<std::string>> property_names = std::nullopt;
70 std::optional<std::vector<
typename decltype(T::schema)::variant_t>> old_values = std::nullopt;
77 if (!c.deletions().empty()) {
81 if (c.columns().empty()) {
87 auto properties = std::vector<std::string>();
88 auto table = m_object->get_obj().get_table();
90 for (
auto i = 0; i < std::tuple_size<
decltype(T::schema.properties)>{}; i++) {
91 if (c.columns().count(table.get_column_key(T::schema.names[i]).value())) {
92 properties.push_back(T::schema.names[i]);
96 if (!properties.empty()) {
97 property_names = properties;
101 std::optional<std::vector<
typename decltype(T::schema)::variant_t>>
106 populateProperties(c);
107 if (!property_names) {
111 std::vector<
typename decltype(T::schema)::variant_t> values;
112 for (
auto &name: *property_names) {
113 auto value = T::schema.property_value_for_name(name,
object,
true);
114 values.push_back(value);
120 old_values = readValues(c);
124 auto new_values = readValues(c);
126 forward_change(
nullptr, {}, {}, {},
nullptr);
127 }
else if (new_values) {
128 forward_change(&
object,
130 old_values ? *old_values : std::vector<
typename decltype(T::schema)::variant_t>{},
134 property_names = std::nullopt;
135 old_values = std::nullopt;
138 void error(std::exception_ptr err) {
139 forward_change(
nullptr, {}, {}, {}, err);
142 void forward_change(
const T *ptr,
143 std::vector<std::string> property_names,
144 std::vector<
typename decltype(T::schema)::variant_t> old_values,
145 std::vector<
typename decltype(T::schema)::variant_t> new_values,
146 const std::exception_ptr &error) {
154 oc.is_deleted =
true;
158 std::vector<PropertyChange<T>> property_changes;
159 for (
size_t i = 0; i < property_names.size(); i++) {
161 property.
name = property_names[i];
162 if (!old_values.empty()) {
163 property.old_value = old_values[i];
165 if (!new_values.empty()) {
166 property.new_value = new_values[i];
168 property_changes.push_back(std::move(property));
172 oc.property_changes = property_changes;
179 std::vector<uint64_t> deletions;
180 std::vector<uint64_t> insertions;
181 std::vector<uint64_t> modifications;
186 bool collection_root_was_deleted =
false;
188 [[nodiscard]]
bool empty()
const noexcept {
189 return deletions.empty() && insertions.empty() && modifications.empty() &&
190 !collection_root_was_deleted;
196 bool ignoreChangesInInitialNotification;
199 bool ignoreChangesInInitialNotification)
201 , ignoreChangesInInitialNotification(ignoreChangesInInitialNotification)
207 if (ignoreChangesInInitialNotification) {
208 ignoreChangesInInitialNotification =
false;
211 else if (changes.empty()) {
215 else if (!changes.collection_root_was_deleted() || !changes.deletions().empty()) {
216 handler({to_vector(changes.deletions()),
217 to_vector(changes.insertions()),
218 to_vector(changes.modifications()),
225 auto vector = std::vector<uint64_t>();
226 for (
auto index : index_set.as_indexes()) {
227 vector.push_back(index);
239 stream <<
"\tis_deleted: " <<
object.is_deleted <<
"\n";
240 stream <<
"\tchange_to: " <<
object.property.name <<
"\n";
241 if (
object.property.old_value) {
242 stream <<
"\told_value: ";
243 std::visit([&stream](
auto&& arg) {
244 using M = std::decay_t<
decltype(arg)>;
245 stream << static_cast<M>(arg);
246 }, *
object.property.old_value);
248 if (
object.property.new_value) {
249 stream <<
"\tnew_value: ";
250 std::visit([&stream](
auto&& arg) {
251 using M = std::decay_t<
decltype(arg)>;
252 stream << static_cast<M>(arg);
253 }, *
object.property.new_value);
Definition: observation.hpp:58
Definition: notifications.hpp:80
std::string name
Definition: notifications.hpp:84
Definition: observation.hpp:194
Definition: observation.hpp:178
Definition: object.hpp:148
Definition: object.hpp:126
Definition: object.hpp:63
Definition: observation.hpp:37
bool is_deleted
The object has been deleted from the Realm.
Definition: observation.hpp:42
std::vector< PropertyChange< T > > property_changes
Definition: observation.hpp:54
const T * object
The object being observed.
Definition: observation.hpp:40
std::exception_ptr error
Definition: observation.hpp:50
Definition: flex_sync.hpp:37