23 -> container_module::optimized_value {
24 container_module::optimized_value result;
25 const auto vr = element.vr();
26 const auto tag = element.tag();
29 result.name = make_element_key(tag,
vr);
33 if (element.is_empty()) {
35 result.type = container_module::value_types::string_value;
36 result.data = std::string{};
38 result.type = container_module::value_types::null_value;
39 result.data = std::monostate{};
45 if (element.is_sequence()) {
46 result.type = container_module::value_types::container_value;
47 result.data = sequence_to_container(element);
53 result.type = container_module::value_types::string_value;
54 result.data = element.as_string().unwrap_or(
"");
58 bool converted =
false;
61 auto val = element.as_numeric<
short>();
63 result.type = container_module::value_types::short_value;
64 result.data = val.value();
70 auto val = element.as_numeric<
unsigned short>();
72 result.type = container_module::value_types::ushort_value;
73 result.data = val.value();
79 auto val = element.as_numeric<
int>();
81 result.type = container_module::value_types::int_value;
82 result.data = val.value();
88 auto val = element.as_numeric<
unsigned int>();
90 result.type = container_module::value_types::uint_value;
91 result.data = val.value();
97 auto val = element.as_numeric<
long long>();
99 result.type = container_module::value_types::llong_value;
100 result.data = val.value();
106 auto val = element.as_numeric<
unsigned long long>();
108 result.type = container_module::value_types::ullong_value;
109 result.data = val.value();
115 auto val = element.as_numeric<
float>();
117 result.type = container_module::value_types::float_value;
118 result.data = val.value();
124 auto val = element.as_numeric<
double>();
126 result.type = container_module::value_types::double_value;
127 result.data = val.value();
137 result.type = container_module::value_types::bytes_value;
138 auto raw = element.raw_data();
139 result.data = std::vector<uint8_t>(raw.begin(), raw.end());
142 result.type = container_module::value_types::bytes_value;
143 auto raw = element.raw_data();
144 result.data = std::vector<uint8_t>(raw.begin(), raw.end());
147 auto val = element.as_numeric<
unsigned int>();
149 result.type = container_module::value_types::uint_value;
150 result.data = val.value();
152 result.type = container_module::value_types::bytes_value;
153 auto raw = element.raw_data();
154 result.data = std::vector<uint8_t>(raw.begin(), raw.end());
158 result.type = container_module::value_types::bytes_value;
159 auto raw = element.raw_data();
160 result.data = std::vector<uint8_t>(raw.begin(), raw.end());
171 if (val.type == container_module::value_types::null_value) {
178 if (std::holds_alternative<std::shared_ptr<container_module::value_container>>(
180 auto container = std::get<std::shared_ptr<container_module::value_container>>(val.data);
182 auto items = container_to_sequence(*container);
183 for (
auto& item : items) {
184 elem.sequence_items().push_back(std::move(item));
194 if (std::holds_alternative<std::string>(val.data)) {
195 str_val = std::get<std::string>(val.data);
197 str_val = container_module::variant_helpers::to_string(val.data, val.type);
206 if (std::holds_alternative<short>(val.data)) {
208 std::get<short>(val.data));
212 if (std::holds_alternative<unsigned short>(val.data)) {
214 std::get<unsigned short>(val.data));
218 if (std::holds_alternative<int>(val.data)) {
220 std::get<int>(val.data));
224 if (std::holds_alternative<unsigned int>(val.data)) {
226 std::get<unsigned int>(val.data));
230 if (std::holds_alternative<long long>(val.data)) {
232 std::get<long long>(val.data));
236 if (std::holds_alternative<unsigned long long>(val.data)) {
238 std::get<unsigned long long>(val.data));
242 if (std::holds_alternative<float>(val.data)) {
244 std::get<float>(val.data));
248 if (std::holds_alternative<double>(val.data)) {
250 std::get<double>(val.data));
259 if (std::holds_alternative<std::vector<uint8_t>>(val.data)) {
260 auto& bytes = std::get<std::vector<uint8_t>>(val.data);
359 -> container_module::value_types {
361 return container_module::value_types::string_value;
366 return container_module::value_types::short_value;
368 return container_module::value_types::ushort_value;
370 return container_module::value_types::int_value;
373 return container_module::value_types::uint_value;
375 return container_module::value_types::llong_value;
377 return container_module::value_types::ullong_value;
379 return container_module::value_types::float_value;
381 return container_module::value_types::double_value;
383 return container_module::value_types::container_value;
385 return container_module::value_types::bytes_value;
401 -> std::optional<std::pair<core::dicom_tag, encoding::vr_type>> {
403 if (key.size() < 12) {
408 auto colon_pos = key.find(
':');
409 if (colon_pos == std::string_view::npos || colon_pos < 9) {
415 auto group_str = key.substr(0, 4);
416 auto group_result = std::from_chars(group_str.data(),
417 group_str.data() + group_str.size(),
419 if (group_result.ec != std::errc{}) {
424 uint16_t element = 0;
425 auto elem_str = key.substr(5, 4);
426 auto elem_result = std::from_chars(elem_str.data(),
427 elem_str.data() + elem_str.size(),
429 if (elem_result.ec != std::errc{}) {
434 auto vr_str = key.substr(colon_pos + 1, 2);
444 -> std::shared_ptr<container_module::value_container> {
445 auto container = std::make_shared<container_module::value_container>();
447 const auto& items = element.sequence_items();
448 container->set(
"_item_count",
static_cast<unsigned int>(items.size()));
450 size_t item_index = 0;
451 for (
const auto& item : items) {
452 auto item_container = serialize_dataset(item);
453 container_module::optimized_value val;
454 val.name = kcenon::pacs::compat::format(
"item_{}", item_index++);
455 val.type = container_module::value_types::container_value;
456 val.data = item_container;
464 const container_module::value_container& container)
465 -> std::vector<core::dicom_dataset> {
466 std::vector<core::dicom_dataset> items;
468 for (
const auto& val : container) {
469 if (!val.name.starts_with(
"item_")) {
473 if (std::holds_alternative<std::shared_ptr<container_module::value_container>>(
475 auto item_container =
476 std::get<std::shared_ptr<container_module::value_container>>(val.data);
477 if (item_container) {
478 auto result = deserialize_dataset(*item_container);
479 if (result.is_ok()) {
480 items.push_back(std::move(result.value()));