FDL Core Library
ASC Framing Decision List — C/C++ Reference Implementation
Loading...
Searching...
No Matches
fdl_collection_helpers.h
Go to the documentation of this file.
1// SPDX-FileCopyrightText: 2024-present American Society Of Cinematographers
2// SPDX-License-Identifier: Apache-2.0
16#ifndef FDL_COLLECTION_HELPERS_H
17#define FDL_COLLECTION_HELPERS_H
18
19#include "fdl_doc.h"
20
21#include <cstdint>
22#include <memory>
23#include <string_view>
24
25namespace fdl::detail {
26
36inline uint32_t root_collection_count(fdl_doc_t* doc, const char* key) {
37 auto& data = doc->doc.data();
38 if (!data.contains(key) || !data[key].is_array()) {
39 return 0;
40 }
41 return static_cast<uint32_t>(data[key].size());
42}
43
59template<typename HandleT, typename MakeHandleFn, typename GetCacheFn>
61 fdl_doc_t* doc, const char* key, uint32_t index, MakeHandleFn make_handle, GetCacheFn get_cache) {
62 auto& data = doc->doc.data();
63 if (!data.contains(key) || !data[key].is_array()) {
64 return nullptr;
65 }
66 if (index >= data[key].size()) {
67 return nullptr;
68 }
69
70 auto [vec, map] = get_cache(doc);
71 auto it = map.find(index);
72 if (it != map.end()) {
73 return it->second;
74 }
75
76 auto handle = make_handle(doc, index);
77 auto* ptr = handle.get();
78 vec.push_back(std::move(handle));
79 map[index] = ptr;
80 return ptr;
81}
82
100template<typename HandleT, typename MakeHandleFn, typename GetCacheFn>
102 fdl_doc_t* doc,
103 const char* array_key,
104 const char* field_key,
105 const char* target,
106 MakeHandleFn make_handle,
107 GetCacheFn get_cache) {
108 auto& data = doc->doc.data();
109 if (!data.contains(array_key) || !data[array_key].is_array()) {
110 return nullptr;
111 }
112
113 const std::string_view sv(target);
114 auto& arr = data[array_key];
115 for (size_t i = 0; i < arr.size(); ++i) {
116 auto& elem = arr[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()) {
122 return it->second;
123 }
124 auto handle = make_handle(doc, index);
125 auto* ptr = handle.get();
126 vec.push_back(std::move(handle));
127 map[index] = ptr;
128 return ptr;
129 }
130 }
131 return nullptr;
132}
133
143inline uint32_t child_collection_count(const jsoncons::ojson* parent_node, const char* key) {
144 if (parent_node == nullptr || !parent_node->contains(key) || !(*parent_node)[key].is_array()) {
145 return 0;
146 }
147 return static_cast<uint32_t>((*parent_node)[key].size());
148}
149
167template<typename HandleT, typename KeyT, typename MakeHandleFn, typename GetCacheFn>
169 const jsoncons::ojson* parent_node,
170 const char* key,
171 uint32_t index,
172 KeyT dedup_key,
173 MakeHandleFn make_handle,
174 GetCacheFn get_cache) {
175 if (parent_node == nullptr || !parent_node->contains(key) || !(*parent_node)[key].is_array()) {
176 return nullptr;
177 }
178 if (index >= (*parent_node)[key].size()) {
179 return nullptr;
180 }
181
182 auto [vec, map] = get_cache();
183 auto it = map.find(dedup_key);
184 if (it != map.end()) {
185 return it->second;
186 }
187
188 auto handle = make_handle(index);
189 auto* ptr = handle.get();
190 vec.push_back(std::move(handle));
191 map[dedup_key] = ptr;
192 return ptr;
193}
194
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,
218 const char* target,
219 MakeKeyFn make_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()) {
223 return nullptr;
224 }
225
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()) {
236 return it->second;
237 }
238 auto handle = make_handle(index);
239 auto* ptr = handle.get();
240 vec.push_back(std::move(handle));
241 map[dedup_key] = ptr;
242 return ptr;
243 }
244 }
245 return nullptr;
246}
247
248} // namespace fdl::detail
249
250#endif // FDL_COLLECTION_HELPERS_H
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