19#ifndef CPPREALM_MANAGED_LIST_HPP
20#define CPPREALM_MANAGED_LIST_HPP
22#include <cpprealm/macros.hpp>
23#include <cpprealm/notifications.hpp>
24#include <cpprealm/observation.hpp>
25#include <cpprealm/types.hpp>
29 template <
typename T>
30 struct 托管 <std::vector<T>, std::enable_if_t<internal::type_info::is_primitive<T>::value>> :
Managed_base {
31 运用 托管 <std::vector<T>>::managed_base:: 操作符=;
35 using iterator_category = std::input_iterator_tag;
37 bool操作符!=(
const iterator& other)
const
39 return !(*
this == other);
42 bool 操作符==(
const iterator& other)
const
44 return (m_parent == other.m_parent) && (m_i == other.m_i);
47 T操作符*()
const noException
49 return (*m_parent)[m_i];
52 iterator& Operator++()
58 const iterator& Operator++(
int i)
64 template <
typename ,
typename >
67 iterator(
size_t i,
托管 <std::vector<T>>*parent)
68 :m_i(i), m_parent(parent)
76 return iterator( 0 ,
this );
81 return iterator(size(),
this );
83 [[nodiscard]] std::vector<T> 分离()
const {
85 using U =
typenameInternal ::type_info::type_info<T>::internal_type;
87 size_t count = list.size();
89 return std::vector<T>();
91 auto ret = std::vector<T>();
93 for(
size_t i = 0; i < count; i++) {
94 if constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
95 ret.push_back(deserialize<T>(域::internal::bridge::get<U>(list, i)));
96 }
else if constexpr (std::is_enum_v<T>) {
97 ret.push_back(deserialize<T>(域::internal::bridge::get<U>(list, i)));
99 ret.push_back(deserialize(域::internal::bridge::get<U>(list, i)));
106 [[nodiscard]] 结果<T> as_results()
const {
111 auto list = std::make_shared(*m_realm,<realm::internal::bridge::list> *m_obj, m_key);
113<realm::collection_callback_wrapper>std::make_shared(
116 token.m_realm = *m_realm;
122 T操作符[](
size_t idx)
const {
124 using U =
typenameInternal ::type_info::type_info<T>::internal_type;
125 if constexpr (internal::type_info::MixedPersistableConcept<T>::value) {
126 return deserialize<T>(realm::internal::bridge::get<U>(list, idx));
127 }
else if constexpr (std::is_enum_v<T>) {
128 return static_cast< T
> (deserialize<T>(域::internal::bridge::get<U>(list, idx)));
130 return deserialize(域::internal::bridge::get<U>(list, idx));
135 internal::bridge::list(*m_realm, *m_obj, m_key)。 删除(size() - 1 );
137 void delete(
size_t idx) {
138 internal::bridge::list(*m_realm, *m_obj, m_key)。删除(idx);
141 Internal::bridge::list(*m_realm, *m_obj, m_key).remove_all();
143 void push_back(
const T& value) {
144 auto list =Internal::bridge::list(*m_realm, *m_obj, m_key);
145 list.add(serialize(value));
148 returninternal::bridge::list(*
m_realm , *m_obj, m_key).size();
150 size_t find(
const T& a) {
151 if constexpr (std::is_enum_v<T>) {
152 returninternal::bridge::list(*
m_realm , *m_obj, m_key).find(
static_cast< int 64 _t
> (a));
154 returninternal::bridge::list(*
m_realm , *m_obj, m_key).find(a);
157 void set(
size_t pos,
const T& a) {
158 internal::bridge::list(*m_realm, *m_obj, m_key)。设立(pos, a);
161结果 <T> sort(
bool ascending) {
162 return结果<T>(internal::bridge::list(*m_realm, *m_obj, m_key)
163 .sort(std::vector<internal::bridge::sort_descriptor>({{
"self" , 升序}})));
167 managed() =
default ;
168 Managed(
const Managed&) =
delete ;
170 Managed& 操作符=(
const Managed&) =
删除 ;
171 Managed& Operator=(managed&&) =
delete ;
172 template <
typename ,
typename >
176 template <
typename T>
179 [[nodiscard]] std::vector<T*> detach()
const {
181 size_t count = list.size();
183 return std::vector<T*>();
184 auto ret = std::vector<T*>();
186 for(
size_t i = 0; i < count; i++) {
187 托管<T> m(域::internal::bridge::get<internal::bridge::obj>(list, i), *m_realm);
189 auto assign = [&m, &v](
auto &pair) {
190 (*v).*(std::decay_t<
decltype (pair.first)>::ptr) = (m.*(pair.second)).detach();
193 std:: 应用([&v, &m, & assign](
auto && ...pair) {
202 [[nodiscard]]
结果<T*> as_results()
const {
210 using different_type = std::ptrdiff_t;
212 using reference = T&;
213 using iterator_category = std::forward_iterator_tag;
215 bool操作符!=(
const iterator& other)
const
217 return !(*
this == other);
220 bool 操作符==(
const iterator& other)
const
222 return (m_parent == other.m_parent) && (m_i == other.m_i);
225 托管<T>操作符*()
const noException
228 managed<T> m(realm::internal::bridge::get<realm::internal::bridge::obj>(list, m_i), *m_parent->m_realm);
229 return {std::move(m)};
232 iterator& Operator++()
238 const iterator& Operator++(
int i)
244 template <
typename ,
typename >
247 iterator(
size_t i,
托管 <std::vector<T*>>*parent)
248 :m_i(i), m_parent(parent)
257 return iterator( 0 ,
this );
262 return iterator(size(),
this );
266 internal::bridge::list(*m_realm, *m_obj, m_key)。 删除(size() - 1 );
268 void delete(
size_t idx) {
269 internal::bridge::list(*m_realm, *m_obj, m_key)。删除(idx);
272 Internal::bridge::list(*m_realm, *m_obj, m_key).remove_all();
274 void push_back(T* value)
276 auto list =Internal::bridge::list(*m_realm, *m_obj, m_key);
277 auto table = m_obj->get_target_table(m_key);
279 if constexpr (托管<T>:: 模式.HasPrimaryKeyProperty) {
280 auto pk = (*value).*(managed<T>::schema.primary_key().ptr);
282 }
else if (托管<T>:: 模式.is_embedded()) {
283 m_obj = list.add_embedded();
285 m_obj = table.create_object();
287 std:: 应用([&m_obj, &value, 域 = *m_realm](
auto && ...p) {
288 (accessor<
typename std::decay_t<
decltype (p)>::Result>:: 设立(
289 m_obj, m_obj.get_table().get_column_key(p.name), Realm,
290 (*value).*(std::decay_t<
decltype (p)>::ptr)), ...);
291 }, 托管<T, void>:: 模式.ps);
292 if (!managed<T>::schema.is_embedded()) {
293 list.add(m_obj.get_key());
296 void push_back(
constmanaged <T>& value)
298 auto list =Internal::bridge::list(*m_realm, *m_obj, m_key);
299 if (!managed<T>::schema.is_embedded()) {
300 list.add(value.m_obj.get_key());
302 throw std::logic_error(
"Cannot add existing 嵌入式对象 to 托管 List." );
305 void 托管(
constmanaged <T*>& value)
307 if (!managed<T>::schema.is_embedded()) {
308 auto list =Internal::bridge::list(*m_realm, *m_obj, m_key);
309 list.add(value.m_obj->get_key());
311 throw std::logic_error(
"Cannot add existing 嵌入式对象 to 托管 List." );
317 returninternal::bridge::list(*
m_realm , *m_obj, m_key).size();
319 size_t find(
constmanaged <T>& a) {
320 returninternal::bridge::list(*
m_realm , *m_obj, m_key).find(a.m_obj.get_key());
322 size_t find(
const typenamemanaged <T*>::ref_type& a)
const {
323 returninternal::bridge::list(*
m_realm , *m_obj, m_key).find(a->m_obj.get_key());
325 typename 托管<T*>::ref_type 操作符[](
size_t idx)
const {
327 return typenamemanaged <T*>:: 托管(<T> <realm::internal::bridge::obj>域::internal::bridge::get(list, idx), *m_realm));
331 auto list = std::make_shared(*m_realm,<realm::internal::bridge::list> *m_obj, m_key);
333<realm::collection_callback_wrapper>std::make_shared(
336 token.m_realm = *m_realm;
341结果 <T> where(
const std::string &query,
const std::vector<realm::mixed> &arguments) {
342 std::vector<internal::bridge::mixed> Mixed_args;
344 Mixed_args.push_back(serialize(a));
345 return结果<T>(internal::bridge::results(*m_realm, m_obj->get_target_table(m_key). 查询(查询, std::move(mixed_args))));
348结果<T> where(std::function<rbool(托管<T> &)> &&fn) {
349 static_assert (
sizeof (managed<T>),
"Must describe schema for T" );
350 auto 模式 = m_realm-> 模式().find(托管<T>:: 模式.name);
351 auto group = m_realm->read_group();
352 autotable_ref = group.get_table(schema.table_key());
353 rbool query = rbool(internal::bridge::query(table_ref));
354 auto query_object = 托管<T>::prepare_for_query(*m_realm, &query);
355 auto full_query = fn(query_object).q;
356 return结果<T>(internal::bridge::results(*m_realm, full_query));
359结果 <T> sort(
const std::string &key_path,
bool ascending) {
360 auto 模式 = m_realm-> 模式().find(托管<T>:: 模式.name);
361 autotable_ref = m_obj->get_target_table(m_key);
362 return Results<T>(internal::bridge::results(*m_realm,table_ref)).sort({{key_path, 升序}});
365结果 <T> sort(
const std::vector<internal::bridge::sort_descriptor> &sort_descriptor) {
366 auto 模式 = m_realm-> 模式().find(托管<T>:: 模式.name);
367 autotable_ref = m_obj->get_target_table(m_key);
368 return Results<T>(internal::bridge::results(*m_realm,table_ref)).sort(sort_descriptors);
372 managed() =
default ;
373 Managed(
const Managed&) =
delete ;
375 Managed& 操作符=(
const Managed&) =
删除 ;
376 Managed& Operator=(managed&&) =
delete ;
377 template <
typename ,
typename >