Dev Essential
Loading...
Searching...
No Matches
dd_struct_access.h
Go to the documentation of this file.
1
14
15#ifndef DD_DDL_STRUCT_ACCESS_H_INCLUDED
16#define DD_DDL_STRUCT_ACCESS_H_INCLUDED
17
19
20#include <cstddef>
21#include <functional>
22#include <string>
23
24namespace ddl {
25namespace dd {
26
27class TypeInfo;
28class ElementTypeInfo;
31
42public:
43 friend class StructTypeAccess;
44 friend class StructElementAccessIterator;
45 friend class StructArrayElementAccessIterator;
46
77 StructElementAccess(std::nullptr_t);
78
83
92 operator bool() const;
99
104 std::string getName() const;
113 std::shared_ptr<const datamodel::StructType> getStructType() const;
122 std::shared_ptr<const datamodel::EnumType> getEnumType() const;
131 std::shared_ptr<const datamodel::DataType> getDataType() const;
132
151 StructTypeAccess getStructTypeAccess(size_t array_pos = 0) const;
152
158 bool isStruct() const;
159
165 bool isLeaf() const;
166
172 bool isArray() const;
173
179 bool isPadding() const;
180
186 size_t getArraySize() const;
187
195 StructElementAccess getArrayElement(size_t array_pos = 0) const;
196
202 const datamodel::StructType::Element& getElement() const;
209 bool isDynamic() const;
218 bool isAfterDynamic() const;
236 size_t getDeserializedBytePos(size_t array_pos = 0) const;
244
251
266 size_t getSerializedBytePos(size_t array_pos = 0) const;
274 size_t getSerializedBitOffset(size_t array_pos = 0) const;
281 size_t getSerializedBitSize() const;
288
294
300 const std::string& getValidElementCount() const;
301
306 typedef StructArrayElementAccessIterator const_iterator;
307
328
329private:
338 StructElementAccess(const std::shared_ptr<const datamodel::StructType::Element>& elem,
339 OptionalSize serialized_element_bit_offset,
340 OptionalSize deserialized_element_byte_offset,
341 OptionalSize array_pos);
350 StructElementAccess(const std::shared_ptr<const datamodel::StructType::Element>& elem,
351 const ElementTypeInfo* element_type_info,
352 OptionalSize serialized_element_bit_offset,
353 OptionalSize deserialized_element_byte_offset,
354 OptionalSize array_pos);
355
356private:
357 std::shared_ptr<const datamodel::StructType::Element> _element = {};
358 const ElementTypeInfo* _element_type_info = nullptr;
359 OptionalSize _deserialized_struct_byte_offset = {};
360 OptionalSize _serialized_struct_bit_offset = {};
361 OptionalSize _array_pos = {};
362};
363
371class StructArrayElementAccessIterator {
372public:
373 StructArrayElementAccessIterator() = delete;
377 StructArrayElementAccessIterator(const StructArrayElementAccessIterator&);
381 StructArrayElementAccessIterator& operator=(const StructArrayElementAccessIterator&);
385 StructArrayElementAccessIterator(StructArrayElementAccessIterator&&) noexcept;
389 StructArrayElementAccessIterator& operator=(StructArrayElementAccessIterator&&) noexcept;
393 ~StructArrayElementAccessIterator();
397 typedef StructArrayElementAccessIterator self_type;
401 typedef StructElementAccess value_type;
405 typedef StructElementAccess& reference;
409 typedef const StructElementAccess& const_reference;
413 typedef StructElementAccess* pointer;
417 typedef const StructElementAccess* const_pointer;
421 typedef int difference_type;
425 typedef std::forward_iterator_tag iterator_category;
426
432 self_type& operator++();
438 self_type operator++(int);
444 const_reference operator*() const;
450 const_pointer operator->() const;
458 bool operator==(const self_type& rhs) const;
466 bool operator!=(const self_type& rhs) const;
467
468private:
469 friend class StructElementAccess;
470 StructArrayElementAccessIterator(const StructElementAccess* parent,
471 StructElementAccess array_element);
472 const StructElementAccess* _parent;
473 StructElementAccess _current_array_element;
474};
475
481class StructElementAccessIterator {
482public:
483 StructElementAccessIterator() = delete;
487 StructElementAccessIterator(const StructElementAccessIterator&);
491 StructElementAccessIterator& operator=(const StructElementAccessIterator&);
495 StructElementAccessIterator(StructElementAccessIterator&&) noexcept;
499 StructElementAccessIterator& operator=(StructElementAccessIterator&&) noexcept;
503 ~StructElementAccessIterator();
507 typedef StructElementAccessIterator self_type;
531 typedef int difference_type;
535 typedef std::forward_iterator_tag iterator_category;
536
542 self_type operator++();
549 self_type operator++(int junk);
555 const_reference operator*() const;
561 const_pointer operator->() const;
569 bool operator==(const self_type& rhs) const;
577 bool operator!=(const self_type& rhs) const;
578
579private:
580 friend StructTypeAccess;
589 StructElementAccessIterator(datamodel::StructType::Elements::const_iterator other_it,
590 datamodel::StructType::Elements::const_iterator end_it,
591 OptionalSize struct_ser,
592 OptionalSize struct_deser);
593 datamodel::StructType::Elements::const_iterator _base_it;
594 datamodel::StructType::Elements::const_iterator _end_it;
596 OptionalSize _struct_ser;
597 OptionalSize _struct_deser;
598};
599
606public:
607 friend class DataDefinition;
608 friend class StructElementAccess;
609 friend class ElementTypeInfo;
623 StructTypeAccess& operator=(StructTypeAccess&&) noexcept;
632
640 StructTypeAccess(const std::shared_ptr<const datamodel::StructType>& struct_type);
641
645 StructTypeAccess(std::nullptr_t);
646
651
652private:
660 StructTypeAccess(const std::shared_ptr<const datamodel::StructType>& struct_type,
661 OptionalSize serialized_struct_offset,
662 OptionalSize deserialized_struct_offset);
663
664public:
682 StructElementAccess getElementByPath(std::string_view name_path) const;
691 operator bool() const;
697 size_t getStaticStructSize() const;
698
706
714
721 bool isDynamic() const;
722
729
759
760private:
761 std::shared_ptr<const datamodel::StructType> _struct_type;
762 OptionalSize _serialized_struct_as_element_offset =
763 {}; // these values are greater 0 if the struct is used within another struct and we
764 // calculate that element
765 OptionalSize _deserialized_struct_as_element_offset =
766 {}; // these values are greater 0 if the struct is used within another struct and we
767 // calculate that element
768 const TypeInfo* _type_info = nullptr;
769};
770
777std::pair<std::string_view, std::string_view> findFirstNameInPath(std::string_view name_path);
778
788std::pair<std::string_view, OptionalSize> findArrayPos(std::string_view name);
789
795 std::function<void(const StructElementAccess& /*child*/, const StructTypeAccess& /*parent*/)>;
803 std::function<bool(const StructElementAccess& /*child*/, const StructTypeAccess& /*parent*/)>;
804
805/*
806 * @brief Helper to assert proper visitor callbacks
807 * @see @ref forEachElementInfix
808 * @see @ref forEachElementInPathInfix
809 */
810template <class RETURN_VALUE, class CALLBACK>
811inline constexpr bool is_for_each_element_callback_v =
812 std::is_invocable_r_v<RETURN_VALUE,
813 std::decay_t<CALLBACK>,
814 const StructElementAccess&,
815 const StructTypeAccess&>;
816
848
849template <typename ACCESS_LEAF_CALLBACK,
850 typename ENTER_ELEMENT_MEMBER_CALLBACK,
851 typename LEAVE_ELEMENT_MEMBER_CALLBACK,
852 typename ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK,
853 typename LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK>
855 ACCESS_LEAF_CALLBACK&& access_leaf_callback,
856 ENTER_ELEMENT_MEMBER_CALLBACK&& enter_element_member_callback,
857 LEAVE_ELEMENT_MEMBER_CALLBACK&& leave_element_member_callback,
858 ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK&& enter_array_element_member_callback,
859 LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK&& leave_array_element_member_callback,
860 bool filter_padding_elements = true,
861 bool continue_arrays_after_skip = true)
862{
863 static_assert(is_for_each_element_callback_v<void, ACCESS_LEAF_CALLBACK>);
864 static_assert(is_for_each_element_callback_v<bool, ENTER_ELEMENT_MEMBER_CALLBACK>);
865 static_assert(is_for_each_element_callback_v<void, LEAVE_ELEMENT_MEMBER_CALLBACK>);
866 static_assert(is_for_each_element_callback_v<bool, ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK>);
867 static_assert(is_for_each_element_callback_v<void, LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK>);
868
869 for (const auto& child: parent) {
870 if (filter_padding_elements && child.isPadding()) {
871 continue;
872 }
873 if (enter_element_member_callback(child, parent)) {
874 if (child.isArray()) {
875 for (const auto& array_element: child) {
876 if (array_element.isStruct()) {
877 const auto child_array_struct_access = array_element.getStructTypeAccess();
878 if (enter_array_element_member_callback(array_element,
879 child_array_struct_access)) {
880 forEachElementInfix(child_array_struct_access,
881 access_leaf_callback,
882 enter_element_member_callback,
883 leave_element_member_callback,
884 enter_array_element_member_callback,
885 leave_array_element_member_callback,
886 filter_padding_elements,
887 continue_arrays_after_skip);
888 leave_array_element_member_callback(array_element,
889 child_array_struct_access);
890 }
891 else if (!continue_arrays_after_skip) {
892 break;
893 }
894 }
895 else {
896 if (enter_array_element_member_callback(array_element, parent)) {
897 access_leaf_callback(array_element, parent);
898 leave_array_element_member_callback(array_element, parent);
899 }
900 else if (!continue_arrays_after_skip) {
901 break;
902 }
903 }
904 }
905 }
906 else {
907 if (child.isStruct()) {
908 forEachElementInfix(child.getStructTypeAccess(),
909 access_leaf_callback,
910 enter_element_member_callback,
911 leave_element_member_callback,
912 enter_array_element_member_callback,
913 leave_array_element_member_callback,
914 filter_padding_elements,
915 continue_arrays_after_skip);
916 }
917 else {
918 access_leaf_callback(child, parent);
919 }
920 }
921 leave_element_member_callback(child, parent);
922 }
923 }
924}
925
946template <typename ACCESS_LEAF_CALLBACK,
947 typename ENTER_ELEMENT_MEMBER_CALLBACK,
948 typename LEAVE_ELEMENT_MEMBER_CALLBACK>
950 ACCESS_LEAF_CALLBACK&& access_leaf_callback,
951 ENTER_ELEMENT_MEMBER_CALLBACK&& enter_element_member_callback,
952 LEAVE_ELEMENT_MEMBER_CALLBACK&& leave_element_member_callback,
953 bool filter_padding_elements = true)
954{
956 parent,
957 std::forward<ACCESS_LEAF_CALLBACK>(access_leaf_callback),
958 std::forward<ENTER_ELEMENT_MEMBER_CALLBACK>(enter_element_member_callback),
959 std::forward<LEAVE_ELEMENT_MEMBER_CALLBACK>(leave_element_member_callback),
960 [](const auto&, const auto&) noexcept -> bool { return true; },
961 [](const auto&, const auto&) noexcept -> void {},
962 filter_padding_elements,
963 true);
964}
965
977template <typename ACCESS_LEAF_CALLBACK>
979 ACCESS_LEAF_CALLBACK&& access_leaf_callback,
980 bool filter_padding_elements = true)
981{
983 parent,
984 std::forward<ACCESS_LEAF_CALLBACK>(access_leaf_callback),
985 [](const auto&, const auto&) noexcept -> bool { return true; },
986 [](const auto&, const auto&) noexcept -> void {},
987 [](const auto&, const auto&) noexcept -> bool { return true; },
988 [](const auto&, const auto&) noexcept -> void {},
989 filter_padding_elements,
990 true);
991}
992
1019template <typename TARGET_ELEMENT_CALLBACK,
1020 typename ENTER_ELEMENT_MEMBER_CALLBACK,
1021 typename LEAVE_ELEMENT_MEMBER_CALLBACK,
1022 typename ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK,
1023 typename LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK>
1025 const StructTypeAccess& parent,
1026 std::string_view path,
1027 TARGET_ELEMENT_CALLBACK&& target_element_callback,
1028 ENTER_ELEMENT_MEMBER_CALLBACK&& enter_element_member_callback,
1029 LEAVE_ELEMENT_MEMBER_CALLBACK&& leave_element_member_callback,
1030 ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK&& enter_array_element_member_callback,
1031 LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK&& leave_array_element_member_callback)
1032{
1033 static_assert(is_for_each_element_callback_v<void, TARGET_ELEMENT_CALLBACK>);
1034 static_assert(is_for_each_element_callback_v<void, ENTER_ELEMENT_MEMBER_CALLBACK>);
1035 static_assert(is_for_each_element_callback_v<void, LEAVE_ELEMENT_MEMBER_CALLBACK>);
1036 static_assert(is_for_each_element_callback_v<void, ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK>);
1037 static_assert(is_for_each_element_callback_v<void, LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK>);
1038
1039 if (parent) {
1040 auto [name, tail] = findFirstNameInPath(path);
1041 const auto [element_name, array_pos] = findArrayPos(name);
1042 const auto child = parent.getElementByPath(element_name);
1043 if (child) {
1044 enter_element_member_callback(child, parent);
1045 if (array_pos) {
1046 const auto array_element_child = child.getArrayElement(array_pos.get());
1047 if (array_element_child) {
1048 enter_array_element_member_callback(array_element_child, parent);
1049 if (tail.empty()) {
1050 target_element_callback(array_element_child, parent);
1051 }
1052 else {
1053 forEachElementInPathInfix(array_element_child.getStructTypeAccess(),
1054 tail,
1055 target_element_callback,
1056 enter_element_member_callback,
1057 leave_element_member_callback,
1058 enter_array_element_member_callback,
1059 leave_array_element_member_callback);
1060 }
1061 leave_array_element_member_callback(array_element_child, parent);
1062 }
1063 }
1064 else {
1065 if (tail.empty()) {
1066 target_element_callback(child, parent);
1067 }
1068 else {
1069 forEachElementInPathInfix(child.getStructTypeAccess(),
1070 tail,
1071 target_element_callback,
1072 enter_element_member_callback,
1073 leave_element_member_callback,
1074 enter_array_element_member_callback,
1075 leave_array_element_member_callback);
1076 }
1077 }
1078 leave_element_member_callback(child, parent);
1079 }
1080 }
1081}
1082
1104template <typename TARGET_ELEMENT_CALLBACK,
1105 typename ENTER_ELEMENT_MEMBER_CALLBACK,
1106 typename LEAVE_ELEMENT_MEMBER_CALLBACK>
1108 std::string_view path,
1109 TARGET_ELEMENT_CALLBACK&& target_element_callback,
1110 ENTER_ELEMENT_MEMBER_CALLBACK&& enter_element_member_callback,
1111 LEAVE_ELEMENT_MEMBER_CALLBACK&& leave_element_member_callback)
1112{
1114 parent,
1115 path,
1116 std::forward<TARGET_ELEMENT_CALLBACK>(target_element_callback),
1117 std::forward<ENTER_ELEMENT_MEMBER_CALLBACK>(enter_element_member_callback),
1118 std::forward<LEAVE_ELEMENT_MEMBER_CALLBACK>(leave_element_member_callback),
1119 [](const auto&, const auto&) noexcept -> void {},
1120 [](const auto&, const auto&) noexcept -> void {});
1121}
1122
1123} // namespace dd
1124} // namespace ddl
1125
1126#endif // DD_DDL_STRUCT_ACCESS_H_INCLUDED
Definition dd_struct_access.h:371
int difference_type
difference value type definition
Definition dd_struct_access.h:421
const StructElementAccess * const_pointer
pointer to const data value type definition
Definition dd_struct_access.h:417
const StructElementAccess & const_reference
const reference value type definition
Definition dd_struct_access.h:409
StructElementAccess & reference
reference value type definition
Definition dd_struct_access.h:405
std::forward_iterator_tag iterator_category
iterator type definition
Definition dd_struct_access.h:425
StructArrayElementAccessIterator(const StructArrayElementAccessIterator &)
Copy CTOR.
StructArrayElementAccessIterator & operator=(const StructArrayElementAccessIterator &)
Copy Assignment Operator.
StructArrayElementAccessIterator(StructArrayElementAccessIterator &&) noexcept
Move CTOR.
StructArrayElementAccessIterator self_type
this iterator type definition
Definition dd_struct_access.h:397
StructElementAccess value_type
iterator value type definition
Definition dd_struct_access.h:401
StructElementAccess * pointer
pointer value type definition
Definition dd_struct_access.h:413
Iterator to iterate thru the StructTypeAccess.
Definition dd_struct_access.h:481
const StructElementAccess & const_reference
const reference value type definition
Definition dd_struct_access.h:519
int difference_type
difference value type definition
Definition dd_struct_access.h:531
StructElementAccessIterator & operator=(const StructElementAccessIterator &)
Copy Assignment Operator.
const StructElementAccess * const_pointer
pointer to const data value type definition
Definition dd_struct_access.h:527
StructElementAccessIterator(const StructElementAccessIterator &)
Copy CTOR.
StructElementAccess & reference
reference value type definition
Definition dd_struct_access.h:515
StructElementAccess value_type
iterator value type definition
Definition dd_struct_access.h:511
StructElementAccess * pointer
pointer value type definition
Definition dd_struct_access.h:523
StructElementAccessIterator self_type
this iterator type definition
Definition dd_struct_access.h:507
std::forward_iterator_tag iterator_category
iterator type definition
Definition dd_struct_access.h:535
StructElementAccessIterator(StructElementAccessIterator &&) noexcept
Move CTOR.
Class to access and obtain the byte position and other information of a instance of this element with...
Definition dd_struct_access.h:41
bool isStruct() const
Determines if the element is an struct type.
size_t getSerializedBitOffset(size_t array_pos=0) const
Get SerializedBitOffset.
const_iterator begin() const
Get the begin const iterator to the array elements of this element access.
size_t getSerializedBitSize() const
Get the serialized Bit size of the value.
TypeOfType getTypeOfType() const
Get the Type Of the type. Retrieves the information of the elements type.
const datamodel::StructType::Element & getElement() const
Get the Element Information which is also part of the data definition.
StructElementAccess getArrayElement(size_t array_pos=0) const
Retrieves an element with byte and bit offsets for the given array position.
bool isDynamic() const
Retieve information if this element is a dynamic array.
const std::string & getValidElementCount() const
StructElementAccess()=delete
deleted CTOR
bool isArray() const
Determines if the element is an array type.
const_iterator end() const
Get the end const iterator to the array elements of this element access.
StructElementAccess(StructElementAccess &&) noexcept
Default move CTOR.
size_t getDeserializedBytePos(size_t array_pos=0) const
Get the Deserialized Byte Pos relative to the first byte position of the struct obtained by dd::DataD...
StructTypeAccess getStructTypeAccess(size_t array_pos=0) const
Get the Struct Type Access if the element depends on a structtype. All byte positions within the retu...
size_t getSerializedBytePos(size_t array_pos=0) const
Get SerializedBytePos obtained by dd::DataDefinition::getStructTypeAccess.
bool isLeaf() const
Determines if the element is a leaf type (no struct, no array).
std::string getName() const
size_t getDeserializedByteSize() const
Get the Byte size (depends on alignments, ddlversion and arraysize)
const_iterator cend() const
Get the end const iterator to the array elements of this element access.
size_t getSerializedTypeBitSize() const
Get the serialized bit size of one element.
OptionalSize getArrayPos() const
Get the Array Pos, if this element was retrieved via StructTypeAccess::getElementByPath and the opera...
size_t getDeserializedTypeAlignedByteSize() const
Get the Serialized Type Byte size aligned.
std::shared_ptr< const datamodel::EnumType > getEnumType() const
Gets the Enum Type if the element is dependent on a enumtype.
std::shared_ptr< const datamodel::StructType > getStructType() const
Gets the Struct Type if the element is dependent on a structtype.
bool isAfterDynamic() const
The element is on a byte position after a dynamic element, the byte position can not be calculated un...
size_t getArraySize() const
Retrieves the array size if the element is an static array type.
StructArrayElementAccessIterator const_iterator
this is the const iterator type definition for the array elements of this element access.
Definition dd_struct_access.h:306
size_t getDeserializedTypeByteSize() const
Get the Serialized Type Byte size.
const_iterator cbegin() const
Get the begin const iterator to the array elements of this element access.
bool isPadding() const
Determines if the element is a padding.
std::shared_ptr< const datamodel::DataType > getDataType() const
Gets the Data Type if the element is dependent on a datatype.
Accessing class for a instance of a struct. This will calculate the byte positions can be used for se...
Definition dd_struct_access.h:605
const_iterator end() const
constant range based end iterator
StructElementAccess getElementByPath(std::string_view name_path) const
Get the StructElementAccess information class by path. Separator is "." or "/" Following element ac...
const_iterator cend() const
constant end iterator
size_t getStaticStructSize() const
Get the known Static Struct Size of this instance.
size_t getStaticUnalignedStructSize() const
Get the known unaligned Static Struct Size of this instance (this is usually the last position + size...
const_iterator begin() const
constant range based iterator access
StructTypeAccess()=delete
default CTOR is deleted
bool isDynamic() const
retrieves information if it contains dynamic elements and so has dynamic size.
const_iterator cbegin() const
constant iterator access
const datamodel::StructType & getStructType() const
Get the Struct Type it refers to (for data definition information)
const StructElementAccessIterator const_iterator
iterator type of this struct
Definition dd_struct_access.h:734
StructTypeAccess(StructTypeAccess &&) noexcept
Move CTOR.
size_t getStaticSerializedBitSize() const
Get the known bitsize of this instance (this is usually the last position + sizeof last element)
definition of the datamodel namespace
Definition datamodel_base.h:28
definition of the dd namespace
Definition datamodel_base.h:26
datamodel::DataType DataType
Definition dd.h:51
datamodel::EnumType EnumType
Definition dd.h:55
std::function< void(const StructElementAccess &, const StructTypeAccess &)> CallbackStructElementAccess
Callback function type definitions for struct element access traversal.
Definition dd_struct_access.h:794
std::pair< std::string_view, std::string_view > findFirstNameInPath(std::string_view name_path)
Extract first naming component from a path.
datamodel::StructType StructType
Definition dd.h:59
std::pair< std::string_view, OptionalSize > findArrayPos(std::string_view name)
Determine the position of the named element within an array.
utility::Optional< size_t > OptionalSize
Optional Size Type.
Definition dd_common_types.h:38
TypeOfType
Classification of a Type.
Definition dd_common_types.h:44
@ struct_type
the type is a struct type (StructType)
Definition dd_common_types.h:64
void forEachElementInfix(const StructTypeAccess &parent, ACCESS_LEAF_CALLBACK &&access_leaf_callback, ENTER_ELEMENT_MEMBER_CALLBACK &&enter_element_member_callback, LEAVE_ELEMENT_MEMBER_CALLBACK &&leave_element_member_callback, ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK &&enter_array_element_member_callback, LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK &&leave_array_element_member_callback, bool filter_padding_elements=true, bool continue_arrays_after_skip=true)
Traverse all elements of a struct type access in infix order and calls the callbacks.
Definition dd_struct_access.h:854
@ element_type_info
Element Type Info.
Definition dd_infomodel_type.h:44
void forEachElementInPathInfix(const StructTypeAccess &parent, std::string_view path, TARGET_ELEMENT_CALLBACK &&target_element_callback, ENTER_ELEMENT_MEMBER_CALLBACK &&enter_element_member_callback, LEAVE_ELEMENT_MEMBER_CALLBACK &&leave_element_member_callback, ENTER_ARRAY_ELEMENT_MEMBER_CALLBACK &&enter_array_element_member_callback, LEAVE_ARRAY_ELEMENT_MEMBER_CALLBACK &&leave_array_element_member_callback)
Traverse all elements along a given path in struct type access in infix order and calls the callbacks...
Definition dd_struct_access.h:1024
std::function< bool(const StructElementAccess &, const StructTypeAccess &)> CallbackStructElementAccessControl
Callback function type definitions for struct element access traversal. The return value indicates if...
Definition dd_struct_access.h:802
definition of the ddl namespace
Definition codec.h:21