19#ifndef CPPRALM_MANAGED_DICTIONARY_HPP
20#define CPPRALM_MANAGED_DICTIONARY_HPP
22#include <cpprealm/accessors.hpp>
23#include <cpprealm/macros.hpp>
24#include <cpprealm/notifications.hpp>
25#include <cpprealm/observation.hpp>
26#include <cpprealm/rbool.hpp>
30 템플릿<
typename mapping_type>
33 const std::string &key,
35 : m_backing_map(std::move(backing_map)), m_key(key), m_realm(r) {}
39 const std::string &key,
42 m_col_key = column_key;
47 Box_base &operator=(
const mapping_type &o) {
51 Box_base &operator=(mapped_type &&o) {
54 만약 constexpr (o->is_managed) {
55 m_backing_map.insert(m_key, o->m_managed.m_obj.get_key());
60 m_obj = m_backing_map.create_and_insert_linking_object(m_key, pk.value);
62 m_obj = m_backing_map.create_and_insert_linking_object(m_key);
65 std:: 적용([&m_obj, &o](
auto && ...p) {
66 (
접근자 <
typename std::decay_t<
decltype(p)>::Result>::set(
67 m_obj, m_obj.get_table().get_column_key(p.name),
68 (*o->unmanaged).*(std::decay_t<
decltype(p)>::ptr)), ...);
75 만약 constexpr (internal::type_info::is_primitive<mapped_type>::value) {
76 m_backing_map.insert(m_key, serialize(std::move(o)));
79 m_backing_map.insert(m_key, o. managed.m_obj.get_key());
84 m_obj = m_backing_map.create_and_insert_linking_object(m_key, pk.value);
86 m_obj = m_backing_map.create_and_insert_linking_object(m_key);
89 std:: 적용([&m_obj, &o](
auto && ...p) {
90 (
접근자 <
typename std::decay_t<
decltype(p)>::Result>::set(
91 m_obj, m_obj.get_table().get_column_key(p.name),
92 o.unmanaged.*(std::decay_t<
decltype(p)>::ptr)), ...);
100 rbool 연산자==(
const mapping_type &rhs)
const {
101 만약 constexpr (영역::internal::type_info::MixedPersistableConcept<mapped_type>::value) {
102 if (This->m_rbool_query) {
103 return this->m_rbool_query->dictionary_has_value_for_key_equals(This->m_col_key, m_key, serialize(rhs, m_realm));
105 return m_backing_map.get(m_key) == serialize(rhs, m_realm);
107 if (This->m_rbool_query) {
108 return this->m_rbool_query->dictionary_has_value_for_key_equals(This->m_col_key, m_key,
internal::bridge::mixed(serialize(rhs)));
114 rbool 연산자!=(
const mapping_type &rhs)
const {
115 if (This->m_rbool_query) {
116 return this->m_rbool_query->dictionary_has_value_for_key_not_equals( this->m_col_key, m_key,
internal::bridge::mixed(serialize(rhs, m_realm)));
126 rbool* m_rbool_query =
nullptr;
128 템플릿<
typename V,
typename =
oid>
135 return m_backing_map.get(m_key). 연산자 int64_t();
138 rbool 연산자>(int64_t rhs)
const {
139 if (This->m_rbool_query) {
140 return this->m_rbool_query->dictionary_has_value_for_key_greater_than(This->m_col_key, m_key, rhs);
145 rbool 연산자>=(int64_t rhs)
const {
146 if (This->m_rbool_query) {
147 return this->m_rbool_query->dictionary_has_value_for_key_greater_than_equals(This->m_col_key, m_key, rhs);
152 rbool 연산자<(int64_t rhs)
const {
153 if (This->m_rbool_query) {
154 return this->m_rbool_query->dictionary_has_value_for_key_less_than(This->m_col_key, m_key, rhs);
159 rbool 연산자<=(int64_t rhs)
const {
160 if (This->m_rbool_query) {
161 return this->m_rbool_query->dictionary_has_value_for_key_less_than_equals(This->m_col_key, m_key, rhs);
171 return m_backing_map.get(m_key). 연산자 double();
174 rbool 연산자>(
double rhs)
const {
175 if (This->m_rbool_query) {
176 return this->m_rbool_query->dictionary_has_value_for_key_greater_than(This->m_col_key, m_key, rhs);
181 rbool 연산자>=(
double rhs)
const {
182 if (This->m_rbool_query) {
183 return this->m_rbool_query->dictionary_has_value_for_key_greater_than_equals(This->m_col_key, m_key, rhs);
188 rbool 연산자<(
double rhs)
const {
189 if (This->m_rbool_query) {
190 return this->m_rbool_query->dictionary_has_value_for_key_less_than(This->m_col_key, m_key, rhs);
195 rbool 연산자<=(
double rhs)
const {
196 if (This->m_rbool_query) {
197 return this->m_rbool_query->dictionary_has_value_for_key_less_than_equals(This->m_col_key, m_key, rhs);
207 return m_backing_map.get(m_key). 연산자 bool();
211 구조체 box<V, std::enable_if_t<std::is_enum_v<V>>> :
public box_base<V> {
215 return this->m_backing_map.get(This->m_key). 연산자 int64_t();
228 구조체 상자<Mixed, std::enable_if_t<internal::type_info:: MixedPersistableConcept::value>><Mixed>:
publicbox_base< <Mixed> Mixed> {
232 rbool 연산자>(혼합 rhs)
const {
233 if (This->m_rbool_query) {
234 return this->m_rbool_query->dictionary_has_value_for_key_greater_than(This->m_col_key, this->m_key, serialize(rhs, this->m_realm));
236 return this->m_backing_map.get(This->m_key) > serialize(rhs, this->m_realm);
239 rbool 연산자>=(혼합 rhs)
const {
240 if (This->m_rbool_query) {
241 return this->m_rbool_query->dictionary_has_value_for_key_greater_than_equals(This->m_col_key, this->m_key, serialize(rhs, this->m_realm));
243 return this->m_backing_map.get(This->m_key) >= serialize(rhs, this->m_realm);
246 rbool 연산자<(혼합 rhs)
const {
247 if (This->m_rbool_query) {
248 return this->m_rbool_query->dictionary_has_value_for_key_less_than(This->m_col_key, this->m_key, serialize(rhs, this->m_realm));
250 return this->m_backing_map.get(This->m_key) < serialize(rhs, this->m_realm);
253 rbool 연산자<=(혼합 rhs)
const {
254 if (This->m_rbool_query) {
255 return this->m_rbool_query->dictionary_has_value_for_key_less_than_equals(This->m_col_key, this->m_key, serialize(rhs, this->m_realm));
257 return this->m_backing_map.get(This->m_key) <= serialize(rhs, this->m_realm);
277 if (This->m_rbool_query) {
278 return this->m_rbool_query->dictionary_has_value_for_key_greater_than(This->m_col_key, m_key, serialize(rhs));
284 if (This->m_rbool_query) {
285 return this->m_rbool_query->dictionary_has_value_for_key_greater_than_equals(This->m_col_key, m_key, serialize(rhs));
291 if (This->m_rbool_query) {
292 return this->m_rbool_query->dictionary_has_value_for_key_less_than(This->m_col_key, m_key, serialize(rhs));
298 if (This->m_rbool_query) {
299 return this->m_rbool_query->dictionary_has_value_for_key_less_than_equals(This->m_col_key, m_key, serialize(rhs));
305 구조체 <std::chrono::system_clock>
상자<std::chrono::system_clock><std::chrono::time_point >: publicbox_base < std::chrono::time_point > {
306 사용 box_base<std::chrono::time_point<std::chrono::system_clock>>::box_base;
307 사용 box_base<std::chrono::time_point<std::chrono::system_clock>>::operator=;
308 std::chrono::time_point<std::chrono::system_clock> 연산자*() {
309 return this->m_backing_map.get(This->m_key).operator
internal::bridge::timestamp().operator std::chrono::time_point<std::chrono::system_clock>();
312 rbool 연산자>(std::chrono::time_point<std::chrono::system_clock> rhs)
const {
313 if (This->m_rbool_query) {
314 return this->m_rbool_query->dictionary_has_value_for_key_greater_than(This->m_col_key, m_key, serialize(rhs));
319 rbool 연산자>=(std::chrono::time_point<std::chrono::system_clock> rhs)
const {
320 if (This->m_rbool_query) {
321 return this->m_rbool_query->dictionary_has_value_for_key_greater_than_equals(This->m_col_key, m_key, serialize(rhs));
326 rbool 연산자<(std::chrono::time_point<std::chrono::system_clock> rhs)
const {
327 if (This->m_rbool_query) {
328 return this->m_rbool_query->dictionary_has_value_for_key_less_than(This->m_col_key, m_key, serialize(rhs));
333 rbool 연산자<=(std::chrono::time_point<std::chrono::system_clock> rhs)
const {
334 if (This->m_rbool_query) {
335 return this->m_rbool_query->dictionary_has_value_for_key_less_than_equals(This->m_col_key, m_key, serialize(rhs));
341 구조체 상자<std::vector<uint8_t>> :
publicbox_base <std::
vector<uint8_t>> {
342 사용 box_base<std::vector<uint8_t>>::box_base;
343 사용 box_base<std::vector<uint8_t>>::operator=;
344 std::vector<uint8_t> 연산자*() {
353 return this->m_backing_map.get(This->m_key).operator std::string();
356 rbool contains(
const std::string& rhs)
const {
357 if (This->m_rbool_query) {
358 return this->m_rbool_query->dictionary_contains_string_for_key(This->m_col_key, m_key, rhs);
360 std::string lhs = m_backing_map.get(m_key);
361 return lhs.find(rhs) != std::string::npos;
373 if (This->m_rbool_query) {
374 return this->m_rbool_query->dictionary_has_value_for_key_equals(This->m_col_key,
378 auto a =
const_cast<box< managed<V*>> *>(
this)->m_backing_map.get_object(This->m_key);
380 if ( this->m_realm != *rhs.m_realm) {
383 return a.get_key() == b->get_key();
387 if (This->m_rbool_query) {
388 return this->m_rbool_query->dictionary_has_value_for_key_not_equals(This->m_col_key,
392 return ! this-> 연산자==(rhs);
396 if (This->m_rbool_query) {
397 return this->m_rbool_query->dictionary_has_value_for_key_equals(This->m_col_key,
402 auto a =
const_cast<box< managed<V*>> *>(
this)->m_backing_map.get_object(This->m_key);
404 if (This->m_realm != rhs.m_realm) {
407 return a.get_key() == b.get_key();
411 if (This->m_rbool_query) {
412 return this->m_rbool_query->dictionary_has_value_for_key_not_equals(This->m_col_key,
417 return ! this-> 연산자==(rhs);
420 std::optional<typename managed<V*>::ref_type> 연산자*() {
421 auto obj = this->m_backing_map.get_object(This->m_key);
422 if (!obj.is_valid()) {
429 if (This->m_rbool_query) {
431 ctx.m_key = this->m_key;
432 ctx.origin_col_key = this->m_col_key;
433 this->m_rbool_query->add_dictionary_link_chain(std::move(ctx));
436 auto obj = this->m_backing_map.get_object(This->m_key);
449 m_obj =
const_cast<상자< managed<V*>> *>(
this)->m_backing_map.create_and_insert_linking_object(
const_cast<상자< managed<V*>> *>(
this)->m_key, pk.value);
454 std:: 적용([&m_obj, &o, 영역 = this->m_realm](
auto && ...p) {
455 (
접근자 <
typename std::decay_t<
decltype(p)>::Result>::set(
456 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
457 (*o).*(std::decay_t<
decltype(p)>::ptr)), ...);
463 this->m_backing_map.insert(This->m_key, o->m_obj.get_key());
468 this->m_backing_map.insert(This->m_key, o.m_obj.get_key());
473 auto a =
const_cast<box<managed<V*>>*>(
this)->m_backing_map.get_object(This->m_key);
475 if (This->m_realm != rhs.m_realm) {
478 return a.get_key() == b.get_key();
482 return ! this-> 연산자==(rhs);
485 bool 연산자==(
const 상자<V*>& rhs) {
486 auto a =
const_cast<box< managed<V*>> *>(
this)->m_backing_map.get_object(This->m_key);
487 auto &b = (&rhs)->m_obj;
488 if (This->m_realm != rhs.m_realm) {
491 return a.get_key() == b.get_key();
494 bool 연산자!=(
const 상자<V*>& rhs)
const {
495 return ! this-> 연산자==(rhs);
501 사용 managed<std::map<std::string, T>>::managed_base:: 연산자=;
503 [[nodiscard]] std::map<std::string, T> fetch()
const {
504 만약 constexpr (std::is_pointer_v<T>) {
505 auto d = internal::bridge::get<internal::bridge::core_dictionary>(*m_obj, m_key);
507 std::map<std::string, T> ret;
508 for (
size_t i = 0; i < s; i++) {
509 auto pair = d.get_pair(i);
510 using Type = std::remove_pointer_t<T>;
514 자동 할당 = [&m, &v](
자동& 쌍) {
515 (*v).*(std::decay_t<
decltype(pair.first)>::ptr) = (m.*(pair.second)).ttach();
519 std:: 적용([&v, &m, &assign](
auto && ...pair) {
528 auto ret = std::map<std::string, T>();
529 for (
auto [k, v] : *
this) {
535 std::enable_if<std::is_pointer_v<T>, std::map<std::string, managed<T>>> to_map()
const {
536 auto ret = std::map<std::string, T>();
537 for (
auto [k, v] : *
this) {
545 iterator_category = std::input_iterator_tag;
547 bool 연산자!=(
const iterator& other)
const
549 return !(*
this == other);
552 bool 연산자==(
const iterator& other)
const
554 return (m_parent == other.m_parent) && (m_i == other.m_i);
557 std::pair<std::string, T> 연산자*()
noex
559 자동 쌍 = m_parent->m_obj->get_dictionary(m_parent->m_key).get_pair(m_i);
560 {
pair.first , deserialize<T>(pair.second) };
563 iterator& operator++()
569 const iterator& operator++(
int i)
575 템플릿<
typename,
typename>
578 iterator(
size_t i,
const managed<std::map<std::string, T>>* parent)
579 : m_i(i), m_parent(parent)
588 return m_obj->get_dictionary(m_key).size();
593 return iterator(0,
this);
598 return iterator(size(),
this);
601 반복자 find(
const std::string& key) {
603 throw std::runtime_error(
"`find`는 유형 안전 쿼리에서 사용할 수 없으므로 대신 `contains_key`를 사용하세요.");
606 auto d = m_obj->get_dictionary(m_key);
607 auto i = d.find_any_key(key);
608 if (i ==
size_t(-1)) {
609 return iterator(size(),
this);
611 return iterator(i,
this);
615 상자<std::conditional_t<std::is_pointer_v<T>, managed<T>, T>> 연산자[](
const std::string &key) {
616 만약 constexpr (std::is_pointer_v<T>) {
618 returnbox < managed<T>>(m_rbool_query, m_key, key, *m_realm);
620 반환 상자< managed<T>>(m_obj->get_dictionary(m_key), key, *m_realm);
623 returnbox <T>(m_rbool_query, m_key, key, *m_realm);
625 returnbox <T>(m_obj->get_dictionary(m_key), key, *m_realm);
629 무효 지우기(
const std::string& key) {
630 m_obj->get_dictionary(m_key).erase(key);
636 return m_rbool_query->dictionary_has_key(m_key, key);
638 return m_obj->get_dictionary(m_key).find_any_key(key) != size_t(-1);
645 auto dict = std::make_shared<realm::internal::bridge::dictionary>(o.get_dictionary(m_key));
647 std::make_shared(std::move(fn),<realm::dictionary_callback_wrapper>
false));
648 token.m_realm = *m_realm;
649 token.m_dictionary = 딕셔너리
655 managed(
const managed&) =
delete;
656 managed(managed &&) =
삭제;
657 managed& 연산자=(
const managed&) =
삭제;
658 managed& operator=(managed&&) =
delete;
659 템플릿<
typename,
typename>
정의: managed_dictionary.hpp:31
정의: managed_dictionary.hpp:129
rbool contains_key(const std::string &key)
형식 안전 쿼리에 주로 사용되는 편의 메서드입니다.
정의: managed_dictionary.hpp:634
정의: managed_primary_key.hpp:30