16#ifndef FDL_COLLECTION_HELPERS_H
17#define FDL_COLLECTION_HELPERS_H
25namespace fdl::detail {
38 if (!data.contains(key) || !data[key].is_array()) {
41 return static_cast<uint32_t
>(data[key].size());
59template<
typename HandleT,
typename MakeHandleFn,
typename GetCacheFn>
61 fdl_doc_t* doc,
const char* key, uint32_t index, MakeHandleFn make_handle, GetCacheFn get_cache) {
63 if (!data.contains(key) || !data[key].is_array()) {
66 if (index >= data[key].size()) {
70 auto [vec, map] = get_cache(doc);
71 auto it = map.find(index);
72 if (it != map.end()) {
76 auto handle = make_handle(doc, index);
77 auto* ptr = handle.get();
78 vec.push_back(std::move(handle));
100template<
typename HandleT,
typename MakeHandleFn,
typename GetCacheFn>
103 const char* array_key,
104 const char* field_key,
106 MakeHandleFn make_handle,
107 GetCacheFn get_cache) {
109 if (!data.contains(array_key) || !data[array_key].is_array()) {
113 const std::string_view sv(target);
114 auto& arr = data[array_key];
115 for (
size_t i = 0; i < arr.size(); ++i) {
117 if (elem.contains(field_key) && elem[field_key].is_string() && elem[field_key].as<std::string_view>() == sv) {
118 auto index =
static_cast<uint32_t
>(i);
119 auto [vec, map] = get_cache(doc);
120 auto it = map.find(index);
121 if (it != map.end()) {
124 auto handle = make_handle(doc, index);
125 auto* ptr = handle.get();
126 vec.push_back(std::move(handle));
144 if (parent_node ==
nullptr || !parent_node->contains(key) || !(*parent_node)[key].is_array()) {
147 return static_cast<uint32_t
>((*parent_node)[key].size());
167template<
typename HandleT,
typename KeyT,
typename MakeHandleFn,
typename GetCacheFn>
169 const jsoncons::ojson* parent_node,
173 MakeHandleFn make_handle,
174 GetCacheFn get_cache) {
175 if (parent_node ==
nullptr || !parent_node->contains(key) || !(*parent_node)[key].is_array()) {
178 if (index >= (*parent_node)[key].size()) {
182 auto [vec, map] = get_cache();
183 auto it = map.find(dedup_key);
184 if (it != map.end()) {
188 auto handle = make_handle(index);
189 auto* ptr = handle.get();
190 vec.push_back(std::move(handle));
191 map[dedup_key] = ptr;
213template<
typename HandleT,
typename MakeKeyFn,
typename MakeHandleFn,
typename GetCacheFn>
215 const jsoncons::ojson* parent_node,
216 const char* array_key,
217 const char* field_key,
220 MakeHandleFn make_handle,
221 GetCacheFn get_cache) {
222 if (parent_node ==
nullptr || !parent_node->contains(array_key) || !(*parent_node)[array_key].is_array()) {
226 const std::string_view sv(target);
227 const auto& arr = (*parent_node)[array_key];
228 for (
size_t i = 0; i < arr.size(); ++i) {
229 const auto& elem = arr[i];
230 if (elem.contains(field_key) && elem[field_key].is_string() && elem[field_key].as<std::string_view>() == sv) {
231 auto index =
static_cast<uint32_t
>(i);
232 auto dedup_key = make_key(index);
233 auto [vec, map] = get_cache();
234 auto it = map.find(dedup_key);
235 if (it != map.end()) {
238 auto handle = make_handle(index);
239 auto* ptr = handle.get();
240 vec.push_back(std::move(handle));
241 map[dedup_key] = ptr;
const ojson & data() const
Access the internal JSON data (const).
Definition fdl_doc.h:47
HandleT * root_collection_at(fdl_doc_t *doc, const char *key, uint32_t index, MakeHandleFn make_handle, GetCacheFn get_cache)
Access an element by index in a root-level collection, with handle deduplication.
Definition fdl_collection_helpers.h:60
uint32_t root_collection_count(fdl_doc_t *doc, const char *key)
Count elements in a root-level collection array.
Definition fdl_collection_helpers.h:36
HandleT * root_collection_find(fdl_doc_t *doc, const char *array_key, const char *field_key, const char *target, MakeHandleFn make_handle, GetCacheFn get_cache)
Find an element by a string field in a root-level collection.
Definition fdl_collection_helpers.h:101
uint32_t child_collection_count(const jsoncons::ojson *parent_node, const char *key)
Count elements in a child collection accessed via a parent node.
Definition fdl_collection_helpers.h:143
HandleT * child_collection_at(const jsoncons::ojson *parent_node, const char *key, uint32_t index, KeyT dedup_key, MakeHandleFn make_handle, GetCacheFn get_cache)
Access an element by index in a child collection, with handle deduplication.
Definition fdl_collection_helpers.h:168
HandleT * child_collection_find(const jsoncons::ojson *parent_node, const char *array_key, const char *field_key, const char *target, MakeKeyFn make_key, MakeHandleFn make_handle, GetCacheFn get_cache)
Find an element by a string field in a child collection.
Definition fdl_collection_helpers.h:214
Internal Document class and opaque fdl_doc handle definition.
Opaque handle definition — shared across ABI translation units.
Definition fdl_doc.h:82
fdl::detail::Document doc
Document data tree.
Definition fdl_doc.h:83