PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
kcenon::pacs::core::dicom_dataset Class Reference

#include <dicom_dataset.h>

Collaboration diagram for kcenon::pacs::core::dicom_dataset:
Collaboration graph

Public Types

using storage_type = std::map<dicom_tag, dicom_element>
 Storage type for elements (ordered by tag)
 
using iterator = storage_type::iterator
 Iterator type.
 
using const_iterator = storage_type::const_iterator
 Const iterator type.
 

Public Member Functions

 dicom_dataset ()=default
 Default constructor - creates an empty dataset.
 
 dicom_dataset (const dicom_dataset &)=default
 Copy constructor.
 
 dicom_dataset (dicom_dataset &&) noexcept=default
 Move constructor.
 
auto operator= (const dicom_dataset &) -> dicom_dataset &=default
 Copy assignment.
 
auto operator= (dicom_dataset &&) noexcept -> dicom_dataset &=default
 Move assignment.
 
 ~dicom_dataset ()=default
 Default destructor.
 
auto contains (dicom_tag tag) const noexcept -> bool
 Check if the dataset contains an element with the given tag.
 
auto get (dicom_tag tag) noexcept -> dicom_element *
 Get a pointer to the element with the given tag.
 
auto get (dicom_tag tag) const noexcept -> const dicom_element *
 Get a const pointer to the element with the given tag.
 
auto get_string (dicom_tag tag, std::string_view default_value="") const -> std::string
 Get the string value of an element.
 
template<typename T >
requires std::is_arithmetic_v<T>
auto get_numeric (dicom_tag tag) const -> std::optional< T >
 Get the numeric value of an element.
 
auto has_sequence (dicom_tag tag) const noexcept -> bool
 Check if the dataset contains a sequence element with the given tag.
 
auto get_sequence (dicom_tag tag) const noexcept -> const std::vector< dicom_dataset > *
 
auto get_sequence (dicom_tag tag) noexcept -> std::vector< dicom_dataset > *
 Get mutable access to sequence items for a given tag.
 
auto get_or_create_sequence (dicom_tag tag) -> std::vector< dicom_dataset > &
 Insert or create a sequence element with the given tag.
 
auto get_private_creator (dicom_tag private_data_tag) const -> std::optional< std::string >
 Get the Private Creator identification string for a private data element.
 
auto get_private_block (std::string_view creator_id, uint16_t group) const -> std::vector< const dicom_element * >
 Get all private data elements belonging to a specific creator.
 
auto set_private_element (std::string_view creator_id, uint16_t group, uint8_t element_offset, encoding::vr_type vr, std::string_view value) -> std::optional< dicom_tag >
 Insert a private data element with automatic creator management.
 
auto remove_private_block (std::string_view creator_id, uint16_t group) -> size_t
 Remove all private data elements and their creator for a given creator.
 
auto cleanup_orphaned_creators () -> size_t
 Remove orphaned Private Creator elements that have no data elements.
 
auto validate_private_tags () const -> std::vector< dicom_tag >
 Validate private tag relationships in this dataset.
 
void insert (dicom_element element)
 Insert or replace an element in the dataset.
 
void set_string (dicom_tag tag, encoding::vr_type vr, std::string_view value)
 Set a string value for the given tag.
 
template<typename T >
requires std::is_arithmetic_v<T>
void set_numeric (dicom_tag tag, encoding::vr_type vr, T value)
 Set a numeric value for the given tag.
 
auto remove (dicom_tag tag) -> bool
 Remove an element from the dataset.
 
void clear () noexcept
 Remove all elements from the dataset.
 
auto begin () noexcept -> iterator
 Get iterator to the first element.
 
auto end () noexcept -> iterator
 Get iterator past the last element.
 
auto begin () const noexcept -> const_iterator
 Get const iterator to the first element.
 
auto end () const noexcept -> const_iterator
 Get const iterator past the last element.
 
auto cbegin () const noexcept -> const_iterator
 Get const iterator to the first element.
 
auto cend () const noexcept -> const_iterator
 Get const iterator past the last element.
 
auto size () const noexcept -> size_t
 Get the number of elements in the dataset.
 
auto empty () const noexcept -> bool
 Check if the dataset is empty.
 
auto copy_with_tags (std::initializer_list< dicom_tag > tags) const -> dicom_dataset
 Create a copy containing only the specified tags.
 
auto copy_with_tags (std::span< const dicom_tag > tags) const -> dicom_dataset
 Create a copy containing only the specified tags.
 
void merge (const dicom_dataset &other)
 Merge elements from another dataset.
 
void merge (dicom_dataset &&other)
 Merge elements from another dataset (move version)
 

Private Attributes

storage_type elements_
 

Detailed Description

Member Typedef Documentation

◆ const_iterator

using kcenon::pacs::core::dicom_dataset::const_iterator = storage_type::const_iterator

◆ iterator

◆ storage_type

Constructor & Destructor Documentation

◆ dicom_dataset() [1/3]

kcenon::pacs::core::dicom_dataset::dicom_dataset ( )
default

Default constructor - creates an empty dataset.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

◆ dicom_dataset() [2/3]

kcenon::pacs::core::dicom_dataset::dicom_dataset ( const dicom_dataset & )
default

Copy constructor.

◆ dicom_dataset() [3/3]

kcenon::pacs::core::dicom_dataset::dicom_dataset ( dicom_dataset && )
defaultnoexcept

Move constructor.

◆ ~dicom_dataset()

kcenon::pacs::core::dicom_dataset::~dicom_dataset ( )
default

Member Function Documentation

◆ begin() [1/2]

auto kcenon::pacs::core::dicom_dataset::begin ( ) const -> const_iterator
nodiscardnoexcept

Get const iterator to the first element.

Returns
Const iterator to the beginning

Definition at line 311 of file dicom_dataset.cpp.

311 {
312 return elements_.begin();
313}

References elements_.

◆ begin() [2/2]

auto kcenon::pacs::core::dicom_dataset::begin ( ) -> iterator
nodiscardnoexcept

Get iterator to the first element.

Returns
Iterator to the beginning
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 303 of file dicom_dataset.cpp.

303 {
304 return elements_.begin();
305}

References elements_.

◆ cbegin()

auto kcenon::pacs::core::dicom_dataset::cbegin ( ) const -> const_iterator
nodiscardnoexcept

Get const iterator to the first element.

Returns
Const iterator to the beginning
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 319 of file dicom_dataset.cpp.

319 {
320 return elements_.cbegin();
321}

References elements_.

◆ cend()

auto kcenon::pacs::core::dicom_dataset::cend ( ) const -> const_iterator
nodiscardnoexcept

Get const iterator past the last element.

Returns
Const iterator to the end
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 323 of file dicom_dataset.cpp.

323 {
324 return elements_.cend();
325}

References elements_.

◆ cleanup_orphaned_creators()

auto kcenon::pacs::core::dicom_dataset::cleanup_orphaned_creators ( ) -> size_t

Remove orphaned Private Creator elements that have no data elements.

Returns
Number of orphaned creators removed
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 234 of file dicom_dataset.cpp.

234 {
235 size_t removed = 0;
236 std::vector<dicom_tag> orphans;
237
238 for (const auto& [tag, elem] : elements_) {
239 if (!tag.is_private_creator()) {
240 continue;
241 }
242 // Check if any data elements exist in this creator's block
243 const auto range = tag.private_data_range();
244 if (!range) {
245 continue;
246 }
247 const auto [first, last] = *range;
248 auto it = elements_.lower_bound(first);
249 if (it == elements_.end() || it->first > last) {
250 orphans.push_back(tag);
251 }
252 }
253
254 for (const auto& tag : orphans) {
255 elements_.erase(tag);
256 ++removed;
257 }
258
259 return removed;
260}

◆ clear()

void kcenon::pacs::core::dicom_dataset::clear ( )
noexcept

Remove all elements from the dataset.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 295 of file dicom_dataset.cpp.

295 {
296 elements_.clear();
297}

References elements_.

◆ contains()

auto kcenon::pacs::core::dicom_dataset::contains ( dicom_tag tag) const -> bool
nodiscardnoexcept

Check if the dataset contains an element with the given tag.

Parameters
tagThe DICOM tag to check
Returns
true if an element with this tag exists
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, and dcm_modify/main.cpp.

Definition at line 18 of file dicom_dataset.cpp.

18 {
19 return elements_.contains(tag);
20}

Referenced by kcenon::pacs::services::validation::sr_iod_validator::check_completion_flag(), kcenon::pacs::services::validation::mg_iod_validator::check_compression_force_range(), kcenon::pacs::services::validation::rt_dose_iod_validator::check_dose_data_consistency(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_laterality(), kcenon::pacs::services::validation::mg_iod_validator::check_laterality_consistency(), kcenon::pacs::services::validation::ct_iod_validator::check_modality(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_modality(), kcenon::pacs::services::validation::dx_iod_validator::check_modality(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_modality(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_modality(), kcenon::pacs::services::validation::mg_iod_validator::check_modality(), kcenon::pacs::services::validation::mr_iod_validator::check_modality(), kcenon::pacs::services::validation::nm_iod_validator::check_modality(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_modality(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_modality(), kcenon::pacs::services::validation::pet_iod_validator::check_modality(), kcenon::pacs::services::validation::seg_iod_validator::check_modality(), kcenon::pacs::services::validation::sr_iod_validator::check_modality(), kcenon::pacs::services::validation::us_iod_validator::check_modality(), kcenon::pacs::services::validation::wsi_iod_validator::check_modality(), kcenon::pacs::services::validation::xa_iod_validator::check_modality(), kcenon::pacs::services::validation::dx_iod_validator::check_photometric_interpretation(), kcenon::pacs::services::validation::mg_iod_validator::check_photometric_interpretation(), kcenon::pacs::services::validation::ct_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::mr_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::nm_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::pet_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::us_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::wsi_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::xa_iod_validator::check_positioner_angles(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::check_roi_consistency(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::ct_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::dx_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::mg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::mr_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::nm_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::pet_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_dose_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_plan_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::us_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::waveform_ps_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::wsi_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::xa_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::ct_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::dx_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::mg_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::mr_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::nm_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::pet_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::rt_dose_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::rt_plan_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::seg_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::us_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::waveform_ps_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::wsi_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::xa_iod_validator::check_type2_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_verification_flag(), kcenon::pacs::services::validation::mg_iod_validator::check_view_position_validity(), kcenon::pacs::services::validation::xa_iod_validator::check_xa_photometric(), kcenon::pacs::services::validation::has_breast_implant(), kcenon::pacs::services::validation::has_qca_calibration(), kcenon::pacs::services::validation::is_binary_segmentation(), kcenon::pacs::services::validation::is_for_presentation_dx(), kcenon::pacs::services::validation::is_for_presentation_mg(), kcenon::pacs::services::validation::is_for_processing_dx(), kcenon::pacs::services::validation::is_for_processing_mg(), kcenon::pacs::services::validation::is_fractional_segmentation(), kcenon::pacs::services::validation::is_heightmap_segmentation(), kcenon::pacs::services::validation::is_label_map_segmentation(), kcenon::pacs::services::validation::is_screening_mammogram(), kcenon::pacs::services::validation::is_sr_complete(), kcenon::pacs::services::validation::is_sr_verified(), kcenon::pacs::network::dimse::dimse_message::is_valid(), kcenon::pacs::services::validation::ct_iod_validator::quick_check(), kcenon::pacs::services::validation::ct_processing_iod_validator::quick_check(), kcenon::pacs::services::validation::dx_iod_validator::quick_check(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::quick_check(), kcenon::pacs::services::validation::label_map_seg_iod_validator::quick_check(), kcenon::pacs::services::validation::mg_iod_validator::quick_check(), kcenon::pacs::services::validation::mr_iod_validator::quick_check(), kcenon::pacs::services::validation::nm_iod_validator::quick_check(), kcenon::pacs::services::validation::ophthalmic_iod_validator::quick_check(), kcenon::pacs::services::validation::parametric_map_iod_validator::quick_check(), kcenon::pacs::services::validation::pet_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_dose_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_plan_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::quick_check(), kcenon::pacs::services::validation::seg_iod_validator::quick_check(), kcenon::pacs::services::validation::sr_iod_validator::quick_check(), kcenon::pacs::services::validation::us_iod_validator::quick_check(), kcenon::pacs::services::validation::waveform_ps_iod_validator::quick_check(), kcenon::pacs::services::validation::wsi_iod_validator::quick_check(), kcenon::pacs::services::validation::xa_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_iod_validator::validate(), kcenon::pacs::services::validation::sr_iod_validator::validate(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_acquisition_context_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_acquisition_dose_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_breast_implant_module(), kcenon::pacs::services::validation::xa_iod_validator::validate_calibration_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_coded_entry(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_common_instance_reference_module(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_common_instance_reference_module(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_common_instance_reference_module(), kcenon::pacs::services::validation::seg_iod_validator::validate_common_instance_reference_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_content_sequence(), kcenon::pacs::services::validation::pet_iod_validator::validate_corrections(), kcenon::pacs::services::validation::ct_iod_validator::validate_ct_image_module(), kcenon::pacs::services::validation::ct_processing_iod_validator::validate_ct_image_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_anatomy_imaged_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_dx_anatomy_imaged_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_detector_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_dx_detector_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_image_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_positioning_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_energy_window_info(), kcenon::pacs::services::validation::sr_iod_validator::validate_evidence_sequences(), kcenon::pacs::services::validation::dx_iod_validator::validate_for_presentation(), kcenon::pacs::services::validation::mg_iod_validator::validate_for_presentation(), kcenon::pacs::services::validation::dx_iod_validator::validate_for_processing(), kcenon::pacs::services::validation::mg_iod_validator::validate_for_processing(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_image_pixel_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_key_object_selection(), kcenon::pacs::services::validation::mg_iod_validator::validate_mammography_image_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_mammography_series_module(), kcenon::pacs::services::validation::mr_iod_validator::validate_mr_image_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_multiframe(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_multiframe_dimension_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_multiframe_dimension_module(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_multiframe_functional_groups_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::us_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::xa_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_detector_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_gated_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_image_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_series_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_tomo_module(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_ophthalmic_image_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_optical_path_module(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_parametric_map_image_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_pet_image_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_pet_series_module(), validate_private_tags(), kcenon::pacs::services::validation::nm_iod_validator::validate_radiopharmaceutical_info(), kcenon::pacs::services::validation::pet_iod_validator::validate_radiopharmaceutical_info(), kcenon::pacs::services::validation::pet_iod_validator::validate_reconstruction_info(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate_references(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_roi_contour_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_beams_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_rt_dose_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_fraction_scheme_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_general_plan_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_rt_roi_observations_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_segment_sequence(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_segment_sequence(), kcenon::pacs::services::validation::seg_iod_validator::validate_segment_sequence(), kcenon::pacs::services::validation::seg_iod_validator::validate_segmentation_image_module(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::ct_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::ct_processing_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::mr_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::us_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::xa_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_specimen_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sr_document_content_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sr_document_general_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_structure_set_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_suv_parameters(), kcenon::pacs::services::validation::us_iod_validator::validate_us_image_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_voi_lut_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_voi_lut_module(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate_waveform_annotation_module(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate_waveform_ps_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_wsi_image_module(), and kcenon::pacs::services::validation::xa_iod_validator::validate_xa_acquisition_module().

◆ copy_with_tags() [1/2]

auto kcenon::pacs::core::dicom_dataset::copy_with_tags ( std::initializer_list< dicom_tag > tags) const -> dicom_dataset
nodiscard

Create a copy containing only the specified tags.

Parameters
tagsList of tags to include in the copy
Returns
A new dataset containing only the specified elements
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 343 of file dicom_dataset.cpp.

344 {
345 return copy_with_tags(std::span{tags.begin(), tags.size()});
346}
auto copy_with_tags(std::initializer_list< dicom_tag > tags) const -> dicom_dataset
Create a copy containing only the specified tags.

◆ copy_with_tags() [2/2]

auto kcenon::pacs::core::dicom_dataset::copy_with_tags ( std::span< const dicom_tag > tags) const -> dicom_dataset
nodiscard

Create a copy containing only the specified tags.

Parameters
tagsSpan of tags to include in the copy
Returns
A new dataset containing only the specified elements

Definition at line 348 of file dicom_dataset.cpp.

349 {
350 dicom_dataset result;
351
352 for (const auto& tag : tags) {
353 const auto* elem = get(tag);
354 if (elem != nullptr) {
355 result.insert(*elem);
356 }
357 }
358
359 return result;
360}
auto get(dicom_tag tag) noexcept -> dicom_element *
Get a pointer to the element with the given tag.

References insert().

Here is the call graph for this function:

◆ empty()

auto kcenon::pacs::core::dicom_dataset::empty ( ) const -> bool
nodiscardnoexcept

Check if the dataset is empty.

Returns
true if no elements are present
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 335 of file dicom_dataset.cpp.

335 {
336 return elements_.empty();
337}

References elements_.

◆ end() [1/2]

auto kcenon::pacs::core::dicom_dataset::end ( ) const -> const_iterator
nodiscardnoexcept

Get const iterator past the last element.

Returns
Const iterator to the end

Definition at line 315 of file dicom_dataset.cpp.

315 {
316 return elements_.end();
317}

References elements_.

◆ end() [2/2]

auto kcenon::pacs::core::dicom_dataset::end ( ) -> iterator
nodiscardnoexcept

Get iterator past the last element.

Returns
Iterator to the end
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 307 of file dicom_dataset.cpp.

307 {
308 return elements_.end();
309}

References elements_.

◆ get() [1/2]

auto kcenon::pacs::core::dicom_dataset::get ( dicom_tag tag) const -> const dicom_element*
nodiscardnoexcept

Get a const pointer to the element with the given tag.

Parameters
tagThe DICOM tag to look up
Returns
Const pointer to the element, or nullptr if not found

Definition at line 30 of file dicom_dataset.cpp.

30 {
31 auto it = elements_.find(tag);
32 if (it == elements_.end()) {
33 return nullptr;
34 }
35 return &it->second;
36}

◆ get() [2/2]

auto kcenon::pacs::core::dicom_dataset::get ( dicom_tag tag) -> dicom_element*
nodiscardnoexcept

Get a pointer to the element with the given tag.

Parameters
tagThe DICOM tag to look up
Returns
Pointer to the element, or nullptr if not found
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, dcm_dump/main.cpp, dcm_extract/main.cpp, get_scu/main.cpp, and retrieve_scu/main.cpp.

Definition at line 22 of file dicom_dataset.cpp.

22 {
23 auto it = elements_.find(tag);
24 if (it == elements_.end()) {
25 return nullptr;
26 }
27 return &it->second;
28}

Referenced by kcenon::pacs::network::dimse::dimse_message::attribute_identifier_list(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::waveform_ps_iod_validator::check_type1_attribute(), kcenon::pacs::services::print_scu::create_film_box(), kcenon::pacs::services::xds::imaging_document_consumer::extract_references(), kcenon::pacs::services::n_get_scu::get(), kcenon::pacs::services::ups_push_scu::get(), kcenon::pacs::services::validation::get_content_item_count(), kcenon::pacs::encoding::get_decoded_string(), get_numeric(), kcenon::pacs::services::validation::get_segment_count(), kcenon::pacs::services::validation::get_sr_document_title(), kcenon::pacs::services::print_scu::query_printer_status(), kcenon::pacs::services::validation::sr_iod_validator::validate_content_sequence(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_segment_sequence(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_segment_sequence(), kcenon::pacs::services::validation::seg_iod_validator::validate_segment_sequence(), and kcenon::pacs::services::validation::sr_iod_validator::validate_sr_document_content_module().

Here is the caller graph for this function:

◆ get_numeric()

template<typename T >
requires std::is_arithmetic_v<T>
auto kcenon::pacs::core::dicom_dataset::get_numeric ( dicom_tag tag) const -> std::optional<T>
nodiscard

Get the numeric value of an element.

Template Parameters
TThe numeric type to return
Parameters
tagThe DICOM tag to look up
Returns
Optional containing the value, or nullopt if not found/conversion fails
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, dcm_dump/main.cpp, and dcm_extract/main.cpp.

Definition at line 433 of file dicom_dataset.h.

433 {
434 const auto* elem = get(tag);
435 if (elem == nullptr) {
436 return std::nullopt;
437 }
438
439 auto result = elem->as_numeric<T>();
440 if (result.is_ok()) {
441 return result.value();
442 }
443 return std::nullopt;
444}

References get().

Referenced by kcenon::pacs::network::dimse::dimse_message::action_type_id(), kcenon::pacs::services::validation::mg_iod_validator::check_compression_force_range(), kcenon::pacs::services::validation::rt_dose_iod_validator::check_dose_data_consistency(), kcenon::pacs::services::validation::ct_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::dx_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::mg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::mr_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::nm_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::pet_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::us_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::wsi_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::xa_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::xa_iod_validator::check_positioner_angles(), kcenon::pacs::network::dimse::dimse_message::completed_subops(), kcenon::pacs::network::dimse::dimse_message::event_type_id(), kcenon::pacs::network::dimse::dimse_message::failed_subops(), kcenon::pacs::services::validation::has_qca_calibration(), kcenon::pacs::network::dimse::dimse_message::message_id_responded_to(), kcenon::pacs::network::dimse::dimse_message::priority(), kcenon::pacs::network::dimse::dimse_message::remaining_subops(), kcenon::pacs::network::dimse::dimse_message::status(), kcenon::pacs::services::validation::mg_iod_validator::validate_acquisition_dose_module(), kcenon::pacs::services::validation::xa_iod_validator::validate_calibration_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_image_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_beams_module(), and kcenon::pacs::network::dimse::dimse_message::warning_subops().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ get_or_create_sequence()

auto kcenon::pacs::core::dicom_dataset::get_or_create_sequence ( dicom_tag tag) -> std::vector<dicom_dataset>&
nodiscard

Insert or create a sequence element with the given tag.

Parameters
tagThe DICOM tag for the sequence
Returns
Reference to the sequence items vector (creates empty sequence if not exists)

If an element with the tag already exists and is not a sequence, it will be replaced with an empty sequence.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 79 of file dicom_dataset.cpp.

80 {
81 auto* elem = get(tag);
82 if (elem != nullptr && elem->is_sequence()) {
83 return elem->sequence_items();
84 }
85 // Create or replace with empty sequence
86 insert(dicom_element{tag, encoding::vr_type::SQ});
87 return get(tag)->sequence_items();
88}
void insert(dicom_element element)
Insert or replace an element in the dataset.
@ SQ
Sequence of Items (undefined length)

References kcenon::pacs::encoding::SQ.

Referenced by kcenon::pacs::services::storage_commitment_scu::build_action_dataset(), kcenon::pacs::services::storage_commitment_scp::build_event_report_dataset(), kcenon::pacs::services::print_scp::create_film_box(), and kcenon::pacs::services::print_scu::create_film_box().

Here is the caller graph for this function:

◆ get_private_block()

auto kcenon::pacs::core::dicom_dataset::get_private_block ( std::string_view creator_id,
uint16_t group ) const -> std::vector<const dicom_element*>
nodiscard

Get all private data elements belonging to a specific creator.

Searches the given group for a Private Creator element matching creator_id, then returns all data elements in that creator's block.

Parameters
creator_idThe Private Creator identification string (e.g. "SIEMENS CSA HEADER")
groupThe private group number (must be odd)
Returns
Vector of pointers to matching data elements (empty if none found)
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 111 of file dicom_dataset.cpp.

113 {
114 std::vector<const dicom_element*> result;
115
116 // Scan Private Creator elements (gggg,0010)-(gggg,00FF) for a match
117 for (uint16_t slot = 0x0010; slot <= 0x00FF; ++slot) {
118 const dicom_tag creator_tag{group, slot};
119 const auto* creator_elem = get(creator_tag);
120 if (creator_elem == nullptr) {
121 continue;
122 }
123 auto str_result = creator_elem->as_string();
124 if (str_result.is_err() || str_result.value() != creator_id) {
125 continue;
126 }
127
128 // Found the creator — collect all data elements in its block
129 const auto range = creator_tag.private_data_range();
130 if (!range) {
131 break;
132 }
133 const auto [first, last] = *range;
134 auto it = elements_.lower_bound(first);
135 while (it != elements_.end() && it->first <= last) {
136 result.push_back(&it->second);
137 ++it;
138 }
139 break;
140 }
141
142 return result;
143}

◆ get_private_creator()

auto kcenon::pacs::core::dicom_dataset::get_private_creator ( dicom_tag private_data_tag) const -> std::optional<std::string>
nodiscard

Get the Private Creator identification string for a private data element.

Looks up the Private Creator element (gggg,00xx) for a given private data element (gggg,xxyy) and returns its string value.

Parameters
private_data_tagA private data element tag
Returns
The creator identification string, or nullopt if not found
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 94 of file dicom_dataset.cpp.

95 {
96 const auto creator_tag = private_data_tag.private_creator_tag();
97 if (!creator_tag) {
98 return std::nullopt;
99 }
100 const auto* elem = get(*creator_tag);
101 if (elem == nullptr) {
102 return std::nullopt;
103 }
104 auto result = elem->as_string();
105 if (result.is_ok()) {
106 return result.value();
107 }
108 return std::nullopt;
109}

Referenced by kcenon::pacs::core::dicom_file::decode_implicit_vr_le().

Here is the caller graph for this function:

◆ get_sequence() [1/2]

auto kcenon::pacs::core::dicom_dataset::get_sequence ( dicom_tag tag) const -> const std::vector<dicom_dataset>*
nodiscardnoexcept
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 61 of file dicom_dataset.cpp.

62 {
63 const auto* elem = get(tag);
64 if (elem == nullptr || !elem->is_sequence()) {
65 return nullptr;
66 }
67 return &elem->sequence_items();
68}

Referenced by kcenon::pacs::services::storage_commitment_scu::parse_event_report_dataset(), and kcenon::pacs::services::storage_commitment_scp::parse_referenced_sop_sequence().

Here is the caller graph for this function:

◆ get_sequence() [2/2]

auto kcenon::pacs::core::dicom_dataset::get_sequence ( dicom_tag tag) -> std::vector<dicom_dataset>*
nodiscardnoexcept

Get mutable access to sequence items for a given tag.

Parameters
tagThe DICOM tag of the sequence element
Returns
Pointer to the sequence items vector, or nullptr if not found or not a sequence

Definition at line 70 of file dicom_dataset.cpp.

71 {
72 auto* elem = get(tag);
73 if (elem == nullptr || !elem->is_sequence()) {
74 return nullptr;
75 }
76 return &elem->sequence_items();
77}

◆ get_string()

auto kcenon::pacs::core::dicom_dataset::get_string ( dicom_tag tag,
std::string_view default_value = "" ) const -> std::string
nodiscard

Get the string value of an element.

Parameters
tagThe DICOM tag to look up
default_valueValue to return if element not found
Returns
The element's string value, or default_value if not found
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, dcm_anonymize/main.cpp, dcm_dump/main.cpp, dcm_extract/main.cpp, find_scu/main.cpp, get_scu/main.cpp, mpps_scp/main.cpp, qr_scp/main.cpp, retrieve_scu/main.cpp, and worklist_scp/main.cpp.

Definition at line 42 of file dicom_dataset.cpp.

44 {
45 const auto* elem = get(tag);
46 if (elem == nullptr) {
47 return std::string{default_value};
48 }
49 return elem->as_string().unwrap_or(std::string{default_value});
50}

Referenced by kcenon::pacs::services::pir::patient_reconciliation_service::add_instance(), kcenon::pacs::network::dimse::dimse_message::affected_sop_class_uid(), kcenon::pacs::network::dimse::dimse_message::affected_sop_instance_uid(), kcenon::pacs::dcm_modify::anonymizer::anonymize_uids(), kcenon::pacs::services::xds::imaging_document_source::build_document_entry(), kcenon::pacs::services::validation::sr_iod_validator::check_completion_flag(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_laterality(), kcenon::pacs::services::validation::mg_iod_validator::check_laterality_consistency(), kcenon::pacs::services::validation::ct_iod_validator::check_modality(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_modality(), kcenon::pacs::services::validation::dx_iod_validator::check_modality(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_modality(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_modality(), kcenon::pacs::services::validation::mg_iod_validator::check_modality(), kcenon::pacs::services::validation::mr_iod_validator::check_modality(), kcenon::pacs::services::validation::nm_iod_validator::check_modality(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_modality(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_modality(), kcenon::pacs::services::validation::pet_iod_validator::check_modality(), kcenon::pacs::services::validation::seg_iod_validator::check_modality(), kcenon::pacs::services::validation::sr_iod_validator::check_modality(), kcenon::pacs::services::validation::us_iod_validator::check_modality(), kcenon::pacs::services::validation::wsi_iod_validator::check_modality(), kcenon::pacs::services::validation::xa_iod_validator::check_modality(), kcenon::pacs::services::validation::dx_iod_validator::check_photometric_interpretation(), kcenon::pacs::services::validation::mg_iod_validator::check_photometric_interpretation(), kcenon::pacs::services::validation::ct_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::mr_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::nm_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::pet_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::seg_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::us_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::wsi_iod_validator::check_pixel_data_consistency(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::seg_iod_validator::check_segmentation_type(), kcenon::pacs::services::validation::ct_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::ct_processing_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::dx_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::label_map_seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::mg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::mr_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::nm_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::ophthalmic_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::parametric_map_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::pet_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_dose_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_plan_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::seg_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::us_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::waveform_ps_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::wsi_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::xa_iod_validator::check_type1_attribute(), kcenon::pacs::services::validation::sr_iod_validator::check_verification_flag(), kcenon::pacs::services::validation::mg_iod_validator::check_view_position_validity(), kcenon::pacs::services::validation::xa_iod_validator::check_xa_photometric(), worklist_cli::worklist_result_formatter::extract_item(), kcenon::pacs::services::query_scp::extract_query_level(), kcenon::pacs::encoding::get_decoded_string(), kcenon::pacs::client::routing_manager::get_field_value(), query_scu::result_formatter::get_tag_value(), kcenon::pacs::example::pacs_server_app::handle_query(), kcenon::pacs::example::pacs_server_app::handle_retrieve(), kcenon::pacs::example::pacs_server_app::handle_store(), kcenon::pacs::example::pacs_server_app::handle_worklist_query(), kcenon::pacs::services::validation::has_breast_implant(), kcenon::pacs::services::validation::is_binary_segmentation(), kcenon::pacs::services::validation::is_for_presentation_dx(), kcenon::pacs::services::validation::is_for_presentation_mg(), kcenon::pacs::services::validation::is_for_processing_dx(), kcenon::pacs::services::validation::is_for_processing_mg(), kcenon::pacs::services::validation::is_fractional_segmentation(), kcenon::pacs::services::validation::is_heightmap_segmentation(), kcenon::pacs::services::validation::is_label_map_segmentation(), kcenon::pacs::services::validation::is_screening_mammogram(), kcenon::pacs::services::validation::is_sr_complete(), kcenon::pacs::services::validation::is_sr_verified(), kcenon::pacs::services::ups_watch_scu::parse_event_dataset(), kcenon::pacs::services::storage_commitment_scu::parse_event_report_dataset(), kcenon::pacs::services::worklist_scu::parse_worklist_item(), kcenon::pacs::services::validation::ct_iod_validator::quick_check(), kcenon::pacs::services::validation::ct_processing_iod_validator::quick_check(), kcenon::pacs::services::validation::dx_iod_validator::quick_check(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::quick_check(), kcenon::pacs::services::validation::label_map_seg_iod_validator::quick_check(), kcenon::pacs::services::validation::mg_iod_validator::quick_check(), kcenon::pacs::services::validation::mr_iod_validator::quick_check(), kcenon::pacs::services::validation::nm_iod_validator::quick_check(), kcenon::pacs::services::validation::ophthalmic_iod_validator::quick_check(), kcenon::pacs::services::validation::parametric_map_iod_validator::quick_check(), kcenon::pacs::services::validation::pet_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_dose_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_plan_iod_validator::quick_check(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::quick_check(), kcenon::pacs::services::validation::seg_iod_validator::quick_check(), kcenon::pacs::services::validation::sr_iod_validator::quick_check(), kcenon::pacs::services::validation::us_iod_validator::quick_check(), kcenon::pacs::services::validation::waveform_ps_iod_validator::quick_check(), kcenon::pacs::services::validation::wsi_iod_validator::quick_check(), kcenon::pacs::services::validation::xa_iod_validator::quick_check(), kcenon::pacs::network::dimse::dimse_message::requested_sop_class_uid(), kcenon::pacs::network::dimse::dimse_message::requested_sop_instance_uid(), kcenon::pacs::client::routing_manager::route(), kcenon::pacs::encoding::set_encoded_string(), kcenon::pacs::core::dicom_file::sop_class_uid(), kcenon::pacs::core::dicom_file::sop_instance_uid(), kcenon::pacs::di::test::MockStorage::store(), kcenon::pacs::ai::assessment_manager::store_assessment(), kcenon::pacs::services::storage_scu::store_impl(), TEST_CASE(), kcenon::pacs::core::dicom_file::transfer_syntax(), kcenon::pacs::storage::hsm_storage::update_metadata(), kcenon::pacs::services::validation::rt_iod_validator::validate(), kcenon::pacs::services::validation::sr_iod_validator::validate(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate(), kcenon::pacs::services::validation::mg_iod_validator::validate_breast_implant_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_content_sequence(), kcenon::pacs::services::validation::pet_iod_validator::validate_corrections(), kcenon::pacs::services::validation::mg_iod_validator::validate_dx_anatomy_imaged_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_detector_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_dx_detector_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_image_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_dx_positioning_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_for_presentation(), kcenon::pacs::services::validation::mg_iod_validator::validate_for_presentation(), kcenon::pacs::services::validation::dx_iod_validator::validate_for_processing(), kcenon::pacs::services::validation::mg_iod_validator::validate_for_processing(), kcenon::pacs::services::validation::mg_iod_validator::validate_mammography_image_module(), kcenon::pacs::services::validation::mr_iod_validator::validate_mr_image_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_multiframe(), kcenon::pacs::services::validation::wsi_iod_validator::validate_multiframe_dimension_module(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_multiframe_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_detector_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_image_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_series_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_nm_tomo_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_pet_image_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_pet_series_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_radiopharmaceutical_info(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_beams_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_rt_dose_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_general_plan_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_rt_series_module(), kcenon::pacs::services::validation::seg_iod_validator::validate_segmentation_image_module(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::seg_iod_validator::validate_single_segment(), kcenon::pacs::services::validation::ct_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::ct_processing_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::dx_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::heightmap_seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::label_map_seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::mg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::mr_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::nm_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::ophthalmic_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::parametric_map_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::pet_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_dose_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_plan_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::rt_structure_set_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::seg_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::us_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::waveform_ps_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::wsi_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::xa_iod_validator::validate_sop_common_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sr_document_content_module(), kcenon::pacs::services::validation::sr_iod_validator::validate_sr_document_general_module(), and kcenon::pacs::services::validation::pet_iod_validator::validate_suv_parameters().

◆ has_sequence()

auto kcenon::pacs::core::dicom_dataset::has_sequence ( dicom_tag tag) const -> bool
nodiscardnoexcept

Check if the dataset contains a sequence element with the given tag.

Parameters
tagThe DICOM tag to check
Returns
true if an element with this tag exists and is a sequence (VR = SQ)
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 56 of file dicom_dataset.cpp.

56 {
57 const auto* elem = get(tag);
58 return elem != nullptr && elem->is_sequence();
59}

◆ insert()

void kcenon::pacs::core::dicom_dataset::insert ( dicom_element element)

Insert or replace an element in the dataset.

Parameters
elementThe element to insert (copied or moved)

If an element with the same tag already exists, it will be replaced. Use std::move() when passing the element to avoid unnecessary copies.

Examples
json_to_dcm/main.cpp, and xml_to_dcm/main.cpp.

Definition at line 282 of file dicom_dataset.cpp.

282 {
283 elements_.insert_or_assign(element.tag(), std::move(element));
284}

References elements_, and kcenon::pacs::core::dicom_element::tag().

Referenced by kcenon::pacs::integration_test::test_data_generator::add_multiframe_pixel_data(), kcenon::pacs::integration_test::test_data_generator::add_pixel_data(), copy_with_tags(), kcenon::pacs::encoding::explicit_vr_big_endian_codec::decode(), kcenon::pacs::encoding::explicit_vr_codec::decode(), kcenon::pacs::encoding::implicit_vr_codec::decode(), kcenon::pacs::core::dicom_file::decode_explicit_vr_be(), kcenon::pacs::core::dicom_file::decode_explicit_vr_le(), kcenon::pacs::core::dicom_file::decode_implicit_vr_le(), kcenon::pacs::integration::container_adapter::deserialize_dataset(), kcenon::pacs::integration_test::generate_ct_dataset(), kcenon::pacs::core::dicom_file::generate_meta_information(), kcenon::pacs::integration_test::generate_mr_dataset(), kcenon::pacs::integration_test::generate_xa_dataset(), kcenon::pacs::integration_test::test_data_generator::invalid(), merge(), merge(), kcenon::pacs::core::dicom_file::parse_meta_information(), kcenon::pacs::network::dimse::dimse_message::set_attribute_identifier_list(), kcenon::pacs::encoding::set_encoded_string(), set_numeric(), set_string(), and TEST_CASE().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ merge() [1/2]

void kcenon::pacs::core::dicom_dataset::merge ( const dicom_dataset & other)

Merge elements from another dataset.

Parameters
otherThe dataset to merge from

Elements from 'other' will overwrite existing elements with the same tag.

Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 362 of file dicom_dataset.cpp.

362 {
363 for (const auto& [tag, element] : other) {
364 insert(element);
365 }
366}

References insert().

Here is the call graph for this function:

◆ merge() [2/2]

void kcenon::pacs::core::dicom_dataset::merge ( dicom_dataset && other)

Merge elements from another dataset (move version)

Parameters
otherThe dataset to merge from (moved)

Definition at line 368 of file dicom_dataset.cpp.

368 {
369 for (auto& [tag, element] : other.elements_) {
370 insert(std::move(element));
371 }
372 other.clear();
373}

References insert().

Here is the call graph for this function:

◆ operator=() [1/2]

auto kcenon::pacs::core::dicom_dataset::operator= ( const dicom_dataset & ) -> dicom_dataset &=default
default

◆ operator=() [2/2]

auto kcenon::pacs::core::dicom_dataset::operator= ( dicom_dataset && ) -> dicom_dataset &=default
defaultnoexcept

Move assignment.

◆ remove()

auto kcenon::pacs::core::dicom_dataset::remove ( dicom_tag tag) -> bool

◆ remove_private_block()

auto kcenon::pacs::core::dicom_dataset::remove_private_block ( std::string_view creator_id,
uint16_t group ) -> size_t

Remove all private data elements and their creator for a given creator.

Removes both the Private Creator element and all associated data elements in the specified group.

Parameters
creator_idThe Private Creator identification string
groupThe private group number (must be odd)
Returns
Number of elements removed (including the creator)
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 199 of file dicom_dataset.cpp.

200 {
201 size_t removed = 0;
202
203 for (uint16_t slot = 0x0010; slot <= 0x00FF; ++slot) {
204 const dicom_tag creator_tag{group, slot};
205 const auto* creator_elem = get(creator_tag);
206 if (creator_elem == nullptr) {
207 continue;
208 }
209 auto str_result = creator_elem->as_string();
210 if (str_result.is_err() || str_result.value() != creator_id) {
211 continue;
212 }
213
214 // Found the creator — remove all data elements in its block
215 const auto range = creator_tag.private_data_range();
216 if (range) {
217 const auto [first, last] = *range;
218 auto it = elements_.lower_bound(first);
219 while (it != elements_.end() && it->first <= last) {
220 it = elements_.erase(it);
221 ++removed;
222 }
223 }
224
225 // Remove the creator element itself
226 elements_.erase(creator_tag);
227 ++removed;
228 break;
229 }
230
231 return removed;
232}

◆ set_numeric()

template<typename T >
requires std::is_arithmetic_v<T>
void kcenon::pacs::core::dicom_dataset::set_numeric ( dicom_tag tag,
encoding::vr_type vr,
T value )

Set a numeric value for the given tag.

Template Parameters
TThe numeric type
Parameters
tagThe DICOM tag
vrThe value representation
valueThe numeric value
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 448 of file dicom_dataset.h.

448 {
450}
static auto from_numeric(dicom_tag tag, encoding::vr_type vr, T value) -> dicom_element
Create an element from a numeric value.
vr_encoding vr

References kcenon::pacs::core::dicom_element::from_numeric(), insert(), and vr.

Referenced by kcenon::pacs::integration_test::test_data_generator::add_image_pixel_module(), kcenon::pacs::network::dimse::dimse_message::dimse_message(), kcenon::pacs::integration_test::generate_ct_dataset(), kcenon::pacs::integration_test::generate_mr_dataset(), kcenon::pacs::integration_test::generate_xa_dataset(), kcenon::pacs::integration_test::test_data_generator::invalid(), kcenon::pacs::network::dimse::dimse_message::set_action_type_id(), kcenon::pacs::network::dimse::dimse_message::set_completed_subops(), kcenon::pacs::network::dimse::dimse_message::set_event_type_id(), kcenon::pacs::network::dimse::dimse_message::set_failed_subops(), kcenon::pacs::network::dimse::dimse_message::set_message_id_responded_to(), kcenon::pacs::network::dimse::dimse_message::set_priority(), kcenon::pacs::network::dimse::dimse_message::set_remaining_subops(), kcenon::pacs::network::dimse::dimse_message::set_status(), kcenon::pacs::network::dimse::dimse_message::set_warning_subops(), TEST_CASE(), kcenon::pacs::network::dimse::dimse_message::update_command_group_length(), and kcenon::pacs::network::dimse::dimse_message::update_data_set_type().

Here is the call graph for this function:
Here is the caller graph for this function:

◆ set_private_element()

auto kcenon::pacs::core::dicom_dataset::set_private_element ( std::string_view creator_id,
uint16_t group,
uint8_t element_offset,
encoding::vr_type vr,
std::string_view value ) -> std::optional<dicom_tag>

Insert a private data element with automatic creator management.

Automatically ensures the corresponding Private Creator element exists. If the creator already owns a block in the given group, reuses that block. Otherwise, allocates the next available slot.

Per DICOM PS3.5 §7.8.1, Private Creator elements are placed at (gggg,00xx) and data elements at (gggg,xxyy).

Parameters
creator_idPrivate Creator identification (e.g. "SIEMENS CSA HEADER")
groupOdd group number (e.g. 0x0009)
element_offsetOffset within the block (0x00-0xFF)
vrValue Representation for the data element
valueThe element value
Returns
The actual tag assigned, or nullopt if allocation failed
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 145 of file dicom_dataset.cpp.

150 {
151 // Group must be odd and > 0x0008 for private tags
152 if ((group & 1) == 0 || group <= 0x0008) {
153 return std::nullopt;
154 }
155
156 // Find existing block for this creator, or allocate a new slot
157 uint16_t block_number = 0;
158 bool found = false;
159
160 for (uint16_t slot = 0x0010; slot <= 0x00FF; ++slot) {
161 const dicom_tag creator_tag{group, slot};
162 const auto* creator_elem = get(creator_tag);
163 if (creator_elem == nullptr) {
164 // Empty slot — allocate if we haven't found a match yet
165 if (!found) {
166 block_number = slot;
167 found = true;
168 }
169 continue;
170 }
171 auto str_result = creator_elem->as_string();
172 if (str_result.is_ok() && str_result.value() == creator_id) {
173 // Creator already owns this slot
174 block_number = slot;
175 found = true;
176 break;
177 }
178 }
179
180 if (!found) {
181 return std::nullopt; // No available slots
182 }
183
184 // Ensure the Private Creator element exists
185 const dicom_tag creator_tag{group, block_number};
186 if (get(creator_tag) == nullptr) {
187 set_string(creator_tag, encoding::vr_type::LO, creator_id);
188 }
189
190 // Place the data element at (group, block_number << 8 | element_offset)
191 const auto data_element_num = static_cast<uint16_t>(
192 (block_number << 8) | element_offset);
193 const dicom_tag data_tag{group, data_element_num};
194 set_string(data_tag, vr, value);
195
196 return data_tag;
197}
void set_string(dicom_tag tag, encoding::vr_type vr, std::string_view value)
Set a string value for the given tag.
@ LO
Long String (64 chars max)

References kcenon::pacs::encoding::LO, and vr.

◆ set_string()

void kcenon::pacs::core::dicom_dataset::set_string ( dicom_tag tag,
encoding::vr_type vr,
std::string_view value )

Set a string value for the given tag.

Parameters
tagThe DICOM tag
vrThe value representation
valueThe string value

Creates a new element or updates an existing one.

Examples
/home/runner/work/pacs_system/pacs_system/examples/query_scu/query_builder.h, /home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, and dcm_modify/main.cpp.

Definition at line 286 of file dicom_dataset.cpp.

287 {
289}
static auto from_string(dicom_tag tag, encoding::vr_type vr, std::string_view value) -> dicom_element
Create an element from a string value.

References kcenon::pacs::core::dicom_element::from_string(), insert(), and vr.

Referenced by kcenon::pacs::integration_test::test_data_generator::add_image_pixel_module(), query_scu::query_builder::add_instance_keys(), kcenon::pacs::integration_test::test_data_generator::add_multiframe_pixel_data(), query_scu::query_builder::add_patient_keys(), kcenon::pacs::integration_test::test_data_generator::add_patient_module(), query_scu::query_builder::add_series_keys(), kcenon::pacs::integration_test::test_data_generator::add_series_module(), query_scu::query_builder::add_study_keys(), kcenon::pacs::integration_test::test_data_generator::add_study_module(), kcenon::pacs::dcm_modify::anonymizer::anonymize_patient_info(), kcenon::pacs::dcm_modify::anonymizer::anonymize_uids(), kcenon::pacs::services::pir::patient_reconciliation_service::apply_demographics(), kcenon::pacs::services::storage_commitment_scu::build_action_dataset(), kcenon::pacs::services::storage_commitment_scp::build_event_report_dataset(), kcenon::pacs::services::xds::imaging_document_source::build_evidence_sequence(), kcenon::pacs::ai::assessment_creator::build_referenced_sop_sequence(), kcenon::pacs::ai::assessment_creator::build_sr_content(), kcenon::pacs::services::print_scp::create_film_box(), kcenon::pacs::services::print_scu::create_film_box(), kcenon::pacs::services::print_scu::create_film_session(), kcenon::pacs::services::xds::imaging_document_source::create_kos_document(), kcenon::pacs::integration_test::test_data_generator::ct(), kcenon::pacs::integration_test::test_data_generator::enhanced_ct(), kcenon::pacs::integration_test::test_data_generator::enhanced_mr(), kcenon::pacs::client::job_manager::impl::execute_prefetch_job(), kcenon::pacs::client::job_manager::impl::execute_query_job(), kcenon::pacs::client::job_manager::impl::execute_sync_job(), kcenon::pacs::integration_test::generate_ct_dataset(), kcenon::pacs::core::dicom_file::generate_meta_information(), kcenon::pacs::integration_test::generate_mr_dataset(), kcenon::pacs::integration_test::generate_worklist_item(), kcenon::pacs::integration_test::generate_xa_dataset(), kcenon::pacs::services::print_scp::handle_n_get(), kcenon::pacs::services::ups_push_scp::handle_n_get(), kcenon::pacs::example::pacs_server_app::handle_query(), kcenon::pacs::example::pacs_server_app::handle_worklist_query(), kcenon::pacs::integration_test::test_data_generator::invalid(), kcenon::pacs::integration_test::test_data_generator::large(), kcenon::pacs::integration_test::test_data_generator::mr(), kcenon::pacs::services::ups_watch_scp::notify_cancel_requested(), kcenon::pacs::services::ups_watch_scp::notify_progress(), kcenon::pacs::services::ups_watch_scp::notify_state_change(), kcenon::pacs::integration_test::test_data_generator::patient_journey(), kcenon::pacs::client::sync_manager::impl::query_remote_studies(), kcenon::pacs::network::dimse::dimse_message::set_affected_sop_class_uid(), kcenon::pacs::network::dimse::dimse_message::set_affected_sop_instance_uid(), kcenon::pacs::services::print_scu::set_image_box(), kcenon::pacs::network::dimse::dimse_message::set_requested_sop_class_uid(), kcenon::pacs::network::dimse::dimse_message::set_requested_sop_instance_uid(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), TEST_CASE(), kcenon::pacs::integration_test::test_data_generator::unicode(), kcenon::pacs::integration_test::test_data_generator::us(), kcenon::pacs::integration_test::test_data_generator::us_cine(), kcenon::pacs::integration_test::test_data_generator::with_private_tags(), kcenon::pacs::integration_test::test_data_generator::worklist(), kcenon::pacs::integration_test::test_data_generator::xa(), and kcenon::pacs::integration_test::test_data_generator::xa_cine().

Here is the call graph for this function:

◆ size()

auto kcenon::pacs::core::dicom_dataset::size ( ) const -> size_t
nodiscardnoexcept

Get the number of elements in the dataset.

Returns
The element count
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h, and module_example/main.cpp.

Definition at line 331 of file dicom_dataset.cpp.

331 {
332 return elements_.size();
333}

References elements_.

Referenced by kcenon::pacs::services::storage_scu::store_impl().

Here is the caller graph for this function:

◆ validate_private_tags()

auto kcenon::pacs::core::dicom_dataset::validate_private_tags ( ) const -> std::vector<dicom_tag>
nodiscard

Validate private tag relationships in this dataset.

Checks that every private data element has a corresponding Private Creator element and returns tags that are missing their creator.

Returns
Vector of private data element tags missing their Private Creator
Examples
/home/runner/work/pacs_system/pacs_system/include/kcenon/pacs/core/dicom_dataset.h.

Definition at line 262 of file dicom_dataset.cpp.

262 {
263 std::vector<dicom_tag> missing_creators;
264
265 for (const auto& [tag, elem] : elements_) {
266 if (!tag.is_private_data()) {
267 continue;
268 }
269 const auto creator_tag = tag.private_creator_tag();
270 if (!creator_tag || !contains(*creator_tag)) {
271 missing_creators.push_back(tag);
272 }
273 }
274
275 return missing_creators;
276}
auto contains(dicom_tag tag) const noexcept -> bool
Check if the dataset contains an element with the given tag.

References contains(), and elements_.

Here is the call graph for this function:

Member Data Documentation

◆ elements_

storage_type kcenon::pacs::core::dicom_dataset::elements_
private

The documentation for this class was generated from the following files: