1#ifndef ARION_STRUCT_UTILS_HPP
2#define ARION_STRUCT_UTILS_HPP
38inline std::map<arion::CPU_ARCH, uint16_t>
ARCH_SZ{
112 std::shared_ptr<arion_type::KernelType>
arion_type, std::string
name,
size_t sz)
118 std::shared_ptr<arion_type::KernelType>
arion_type, std::string
name)
124 std::string
name,
size_t sz)
155 this->int_vals[name] = val;
160 auto arr_it = this->arr_vals.find(name);
161 if (arr_it != this->arr_vals.end())
162 free(arr_it->second);
163 this->arr_vals[name] = arr;
168 auto int_it = this->int_vals.find(name);
169 return int_it != this->int_vals.end();
174 auto int_it = this->int_vals.find(name);
175 if (int_it == this->int_vals.end())
177 return int_it->second;
182 auto arr_it = this->arr_vals.find(name);
183 return arr_it != this->arr_vals.end();
188 auto arr_it = this->arr_vals.find(name);
189 if (arr_it == this->arr_vals.end())
191 return arr_it->second;
209 std::vector<POLYMORPHIC_STRUCT_FIELD>
fields;
218 if (!this->free_ids.empty())
220 id = this->free_ids.top();
221 this->free_ids.pop();
227 id = this->curr_id++;
240 this->curr_structs[id] = std::move(struct_inst);
254 return align_it->second;
267 return ptr_sz_it->second;
277 auto arch_sz_it =
ARCH_SZ.find(arch);
278 if (arch_sz_it ==
ARCH_SZ.end())
280 return arch_sz_it->second;
309 size_t struct_sz = 0;
317 if (field.constraint.arch_sz != 0 && arch_sz != field.constraint.arch_sz)
324 struct_sz +=
sizeof(uint8_t);
328 if (struct_sz %
sizeof(uint16_t))
329 struct_sz +=
sizeof(uint16_t) - (struct_sz %
sizeof(uint16_t));
330 struct_sz +=
sizeof(uint16_t);
334 if (struct_sz %
sizeof(uint32_t))
335 struct_sz +=
sizeof(uint32_t) - (struct_sz %
sizeof(uint32_t));
336 struct_sz +=
sizeof(uint32_t);
340 if (struct_sz %
sizeof(uint64_t))
341 struct_sz +=
sizeof(uint64_t) - (struct_sz %
sizeof(uint64_t));
342 struct_sz +=
sizeof(uint64_t);
346 if (struct_sz % ptr_sz)
347 struct_sz += ptr_sz - (struct_sz % ptr_sz);
352 size_t arr_sz = field.sz *
sizeof(uint8_t);
357 if (struct_sz %
sizeof(uint16_t))
358 struct_sz +=
sizeof(uint16_t) - (struct_sz %
sizeof(uint16_t));
359 size_t arr_sz = field.sz *
sizeof(uint16_t);
364 if (struct_sz %
sizeof(uint32_t))
365 struct_sz +=
sizeof(uint32_t) - (struct_sz %
sizeof(uint32_t));
366 size_t arr_sz = field.sz *
sizeof(uint32_t);
371 if (struct_sz %
sizeof(uint64_t))
372 struct_sz +=
sizeof(uint64_t) - (struct_sz %
sizeof(uint64_t));
373 size_t arr_sz = field.sz *
sizeof(uint64_t);
378 if (struct_sz % ptr_sz)
379 struct_sz += ptr_sz - (struct_sz % ptr_sz);
380 size_t arr_sz = field.sz * ptr_sz;
388 if (struct_sz % align)
390 uint8_t align_sz = align - (struct_sz % align);
391 struct_sz += align_sz;
416 std::unique_ptr<PolymorphicStruct> curr_struct = std::make_unique<PolymorphicStruct>();
423 if (field.constraint.arch_sz != 0 && arch_sz != field.constraint.arch_sz)
430 memcpy(&val, struct_inst + off,
sizeof(uint8_t));
431 curr_struct->set_field(field.name, val);
432 off +=
sizeof(uint8_t);
436 if (off %
sizeof(uint16_t))
437 off +=
sizeof(uint16_t) - (off %
sizeof(uint16_t));
439 memcpy(&val, struct_inst + off,
sizeof(uint16_t));
440 curr_struct->set_field(field.name, val);
441 off +=
sizeof(uint16_t);
445 if (off %
sizeof(uint32_t))
446 off +=
sizeof(uint32_t) - (off %
sizeof(uint32_t));
448 memcpy(&val, struct_inst + off,
sizeof(uint32_t));
449 curr_struct->set_field(field.name, val);
450 off +=
sizeof(uint32_t);
454 if (off %
sizeof(uint64_t))
455 off +=
sizeof(uint64_t) - (off %
sizeof(uint64_t));
457 memcpy(&val, struct_inst + off,
sizeof(uint64_t));
458 curr_struct->set_field(field.name, val);
459 off +=
sizeof(uint64_t);
464 off += ptr_sz - (off % ptr_sz);
466 memcpy(&val, struct_inst + off, ptr_sz);
467 curr_struct->set_field(field.name, val);
472 size_t arr_sz = field.sz *
sizeof(uint8_t);
473 uint8_t *arr = (uint8_t *)malloc(arr_sz);
474 memcpy(arr, struct_inst + off, arr_sz);
475 curr_struct->set_field(field.name, arr);
480 if (off %
sizeof(uint16_t))
481 off +=
sizeof(uint16_t) - (off %
sizeof(uint16_t));
482 size_t arr_sz = field.sz *
sizeof(uint16_t);
483 uint16_t *arr = (uint16_t *)malloc(arr_sz);
484 memcpy(arr, struct_inst + off, arr_sz);
485 curr_struct->set_field(field.name, arr);
490 if (off %
sizeof(uint32_t))
491 off +=
sizeof(uint32_t) - (off %
sizeof(uint32_t));
492 size_t arr_sz = field.sz *
sizeof(uint32_t);
493 uint32_t *arr = (uint32_t *)malloc(arr_sz);
494 memcpy(arr, struct_inst + off, arr_sz);
495 curr_struct->set_field(field.name, arr);
500 if (off %
sizeof(uint64_t))
501 off +=
sizeof(uint64_t) - (off %
sizeof(uint64_t));
502 size_t arr_sz = field.sz *
sizeof(uint64_t);
503 uint64_t *arr = (uint64_t *)malloc(arr_sz);
504 memcpy(arr, struct_inst + off, arr_sz);
505 curr_struct->set_field(field.name, arr);
511 off += ptr_sz - (off % ptr_sz);
512 size_t arr_sz = field.sz * ptr_sz;
513 uint8_t *arr = (uint8_t *)malloc(arr_sz);
514 memcpy(arr, struct_inst + off, arr_sz);
515 curr_struct->set_field(field.name, arr);
535 memcpy(data, struct_inst,
sizeof(T));
550 auto struct_it = this->curr_structs.find(
id);
551 if (struct_it == this->curr_structs.end())
553 std::unique_ptr<PolymorphicStruct> curr_struct = std::move(struct_it->second);
555 std::vector<arion::BYTE> data_vec;
564 if (field.constraint.arch_sz != 0 && arch_sz != field.constraint.arch_sz)
571 if (curr_struct->has_int_field(field.name))
572 val = curr_struct->get_int_field(field.name);
573 data_vec.push_back(val);
577 if (data_vec.size() %
sizeof(uint16_t))
579 uint8_t align_sz =
sizeof(uint16_t) - (data_vec.size() %
sizeof(uint16_t));
580 data_vec.insert(data_vec.end(), align_sz, 0);
583 if (curr_struct->has_int_field(field.name))
584 val = curr_struct->get_int_field(field.name);
585 data_vec.insert(data_vec.end(), (uint8_t *)&val, (uint8_t *)&val +
sizeof(uint16_t));
589 if (data_vec.size() %
sizeof(uint32_t))
591 uint8_t align_sz =
sizeof(uint32_t) - (data_vec.size() %
sizeof(uint32_t));
592 data_vec.insert(data_vec.end(), align_sz, 0);
595 if (curr_struct->has_int_field(field.name))
596 val = curr_struct->get_int_field(field.name);
597 data_vec.insert(data_vec.end(), (uint8_t *)&val, (uint8_t *)&val +
sizeof(uint32_t));
601 if (data_vec.size() %
sizeof(uint64_t))
603 uint8_t align_sz =
sizeof(uint64_t) - (data_vec.size() %
sizeof(uint64_t));
604 data_vec.insert(data_vec.end(), align_sz, 0);
607 if (curr_struct->has_int_field(field.name))
608 val = curr_struct->get_int_field(field.name);
609 data_vec.insert(data_vec.end(), (uint8_t *)&val, (uint8_t *)&val +
sizeof(uint64_t));
613 if (data_vec.size() % ptr_sz)
615 uint8_t align_sz = ptr_sz - (data_vec.size() % ptr_sz);
616 data_vec.insert(data_vec.end(), align_sz, 0);
619 if (curr_struct->has_int_field(field.name))
620 val = curr_struct->get_int_field(field.name);
621 data_vec.insert(data_vec.end(), (uint8_t *)&val, (uint8_t *)&val + ptr_sz);
625 size_t arr_sz = field.sz *
sizeof(uint8_t);
626 bool has_field = curr_struct->has_arr_field(field.name);
629 arr = (uint8_t *)curr_struct->get_arr_field(field.name);
631 arr = (uint8_t *)malloc(arr_sz);
632 data_vec.insert(data_vec.end(), arr, arr + arr_sz);
638 if (data_vec.size() %
sizeof(uint16_t))
640 uint8_t align_sz =
sizeof(uint16_t) - (data_vec.size() %
sizeof(uint16_t));
641 data_vec.insert(data_vec.end(), align_sz, 0);
643 size_t arr_sz = field.sz *
sizeof(uint16_t);
644 bool has_field = curr_struct->has_arr_field(field.name);
647 arr = (uint16_t *)curr_struct->get_arr_field(field.name);
649 arr = (uint16_t *)malloc(arr_sz);
650 data_vec.insert(data_vec.end(), (uint8_t *)arr, (uint8_t *)arr + arr_sz);
656 if (data_vec.size() %
sizeof(uint32_t))
658 uint8_t align_sz =
sizeof(uint32_t) - (data_vec.size() %
sizeof(uint32_t));
659 data_vec.insert(data_vec.end(), align_sz, 0);
661 size_t arr_sz = field.sz *
sizeof(uint32_t);
662 bool has_field = curr_struct->has_arr_field(field.name);
665 arr = (uint32_t *)curr_struct->get_arr_field(field.name);
667 arr = (uint32_t *)malloc(arr_sz);
668 data_vec.insert(data_vec.end(), (uint8_t *)arr, (uint8_t *)arr + arr_sz);
674 if (data_vec.size() %
sizeof(uint64_t))
676 uint8_t align_sz =
sizeof(uint64_t) - (data_vec.size() %
sizeof(uint64_t));
677 data_vec.insert(data_vec.end(), align_sz, 0);
679 size_t arr_sz = field.sz *
sizeof(uint64_t);
680 bool has_field = curr_struct->has_arr_field(field.name);
683 arr = (uint64_t *)curr_struct->get_arr_field(field.name);
685 arr = (uint64_t *)malloc(arr_sz);
686 data_vec.insert(data_vec.end(), (uint8_t *)arr, (uint8_t *)arr + arr_sz);
692 if (data_vec.size() % ptr_sz)
694 uint8_t align_sz = ptr_sz - (data_vec.size() % ptr_sz);
695 data_vec.insert(data_vec.end(), align_sz, 0);
697 size_t arr_sz = field.sz * ptr_sz;
698 bool has_field = curr_struct->has_arr_field(field.name);
701 arr = (uint8_t *)curr_struct->get_arr_field(field.name);
703 arr = (uint8_t *)malloc(arr_sz);
704 data_vec.insert(data_vec.end(), (uint8_t *)arr, (uint8_t *)arr + arr_sz);
714 if (data_vec.size() % align)
716 uint8_t align_sz = align - (data_vec.size() % align);
717 data_vec.insert(data_vec.end(), align_sz, 0);
719 struct_len = data_vec.size();
721 memcpy(data, data_vec.data(), struct_len);
722 this->curr_structs[id] = std::move(curr_struct);
735 T *struct_inst = (T *)malloc(
sizeof(T));
736 size_t min_sz = std::min(
sizeof(T), data_len);
737 memcpy(struct_inst, data, min_sz);
751 auto struct_it = this->curr_structs.find(
id);
752 if (struct_it == this->curr_structs.end())
754 std::unique_ptr<PolymorphicStruct> curr_struct = std::move(struct_it->second);
760 std::stringstream ss;
767 if (field.constraint.arch_sz != 0 && arch_sz != field.constraint.arch_sz)
770 if (ss.str().size() > 1)
772 ss << field.name <<
"=";
781 if (curr_struct->has_int_field(field.name))
782 val = curr_struct->get_int_field(field.name);
783 ss << field.arion_type->str(
arion, val);
788 if (curr_struct->has_arr_field(field.name))
790 uint8_t *arr = (uint8_t *)curr_struct->get_arr_field(field.name);
791 for (
size_t arr_i = 0; arr_i < field.sz; arr_i++)
793 ss << field.arion_type->str(
arion, arr[arr_i]);
794 if (arr_i < field.sz - 1)
803 if (curr_struct->has_arr_field(field.name))
805 uint16_t *arr = (uint16_t *)curr_struct->get_arr_field(field.name);
806 for (
size_t arr_i = 0; arr_i < field.sz; arr_i++)
808 ss << field.arion_type->str(
arion, arr[arr_i]);
809 if (arr_i < field.sz - 1)
818 if (curr_struct->has_arr_field(field.name))
820 uint32_t *arr = (uint32_t *)curr_struct->get_arr_field(field.name);
821 for (
size_t arr_i = 0; arr_i < field.sz; arr_i++)
823 ss << field.arion_type->str(
arion, arr[arr_i]);
824 if (arr_i < field.sz - 1)
833 if (curr_struct->has_arr_field(field.name))
835 uint64_t *arr = (uint64_t *)curr_struct->get_arr_field(field.name);
836 for (
size_t arr_i = 0; arr_i < field.sz; arr_i++)
838 ss << field.arion_type->str(
arion, arr[arr_i]);
839 if (arr_i < field.sz - 1)
848 if (curr_struct->has_arr_field(field.name))
850 void *arr = curr_struct->get_arr_field(field.name);
851 for (
size_t arr_i = 0; arr_i < field.sz; arr_i++)
854 memcpy(&val, (
void *)((uint64_t)arr + arr_i * ptr_sz), ptr_sz);
855 ss << field.arion_type->str(
arion, val);
856 if (arr_i < field.sz - 1)
872 this->curr_structs[id] = std::move(curr_struct);
882 auto struct_it = this->curr_structs.find(
id);
883 if (struct_it == this->curr_structs.end())
886 this->curr_structs.erase(
id);
887 if (this->curr_structs.size())
888 this->free_ids.push(
id);
891 this->free_ids = std::stack<STRUCT_ID>();
901 std::vector<STRUCT_ID> struct_ids;
903 struct_ids.push_back(struct_pair.first);
949 std::shared_ptr<arion_poly_struct::PolymorphicStructFactory<T>>
factory;
968 std::string
str(std::shared_ptr<arion::Arion>
arion, uint64_t val)
override
971 return arion::int_to_hex<uint64_t>(val);
973 size_t struct_sz = this->factory->get_struct_sz(arch);
975 std::vector<arion::BYTE> struct_data = this->
arion_read_mem(arion, val, struct_sz);
976 memcpy(struct_buf, struct_data.data(), struct_sz);
978 std::string struct_str = this->factory->to_string(struct_id,
arion, arch);
980 this->factory->release_struct(struct_id);
997 virtual std::shared_ptr<arion_poly_struct::AbsArionStructType>
process(std::shared_ptr<arion::Arion>
arion,
1015 std::string
str(std::shared_ptr<arion::Arion>
arion, uint64_t val)
override
1017 std::shared_ptr<AbsArionStructType> struct_type = this->
process(arion, val);
1020 std::shared_ptr<arion_type::KernelType> type = std::dynamic_pointer_cast<arion_type::KernelType>(struct_type);
1023 return type->str(
arion, val);
Thrown when attempting to access a field in a structure that does not exist.
Definition global_excepts.hpp:564
Thrown when there are too many active structures.
Definition global_excepts.hpp:576
Thrown when the CPU architecture is not supported.
Definition global_excepts.hpp:348
Thrown when an invalid struct id is specified.
Definition global_excepts.hpp:586
Abstract base class providing common utilities for structure types that interact with emulated memory...
Definition struct_utils.hpp:911
arion::CPU_ARCH arion_curr_arch(std::shared_ptr< arion::Arion > arion)
std::vector< arion::BYTE > arion_read_mem(std::shared_ptr< arion::Arion > arion, arion::ADDR addr, size_t sz)
virtual ~AbsArionStructType()=default
bool arion_is_mapped(std::shared_ptr< arion::Arion > arion, arion::ADDR addr)
Definition struct_utils.hpp:946
ArionStructType(std::string name, std::shared_ptr< arion_poly_struct::PolymorphicStructFactory< T > > factory)
Definition struct_utils.hpp:957
std::shared_ptr< arion_poly_struct::PolymorphicStructFactory< T > > factory
The factory responsible for handling the polymorphic nature of the structure.
Definition struct_utils.hpp:949
std::string str(std::shared_ptr< arion::Arion > arion, uint64_t val) override
Definition struct_utils.hpp:968
Definition struct_utils.hpp:988
std::string str(std::shared_ptr< arion::Arion > arion, uint64_t val) override
Definition struct_utils.hpp:1015
ArionVariableStructType(std::string name)
Definition struct_utils.hpp:1005
virtual std::shared_ptr< arion_poly_struct::AbsArionStructType > process(std::shared_ptr< arion::Arion > arion, uint64_t val)=0
Definition struct_utils.hpp:200
STRUCT_ID feed_host(T *struct_inst)
Definition struct_utils.hpp:532
std::map< STRUCT_ID, std::unique_ptr< PolymorphicStruct > > curr_structs
Map of currently allocated polymorphic structure instances.
Definition struct_utils.hpp:207
STRUCT_ID curr_id
Counter for generating unique structure IDs.
Definition struct_utils.hpp:203
STRUCT_ID add_struct_entry(std::unique_ptr< PolymorphicStruct > struct_inst)
Definition struct_utils.hpp:237
uint8_t get_align(arion::CPU_ARCH arch)
Definition struct_utils.hpp:249
T * build_host(STRUCT_ID id)
Definition struct_utils.hpp:731
void release_struct(STRUCT_ID id)
Definition struct_utils.hpp:880
PolymorphicStructFactory(std::vector< POLYMORPHIC_STRUCT_FIELD > fields)
Definition struct_utils.hpp:288
std::string to_string(STRUCT_ID id, std::shared_ptr< arion::Arion > arion, arion::CPU_ARCH arch)
Definition struct_utils.hpp:749
size_t get_struct_sz(arion::CPU_ARCH arch)
Definition struct_utils.hpp:307
std::vector< POLYMORPHIC_STRUCT_FIELD > fields
Definition of all potential fields in the polymorphic structure.
Definition struct_utils.hpp:209
size_t get_host_struct_sz()
Definition struct_utils.hpp:400
std::stack< STRUCT_ID > free_ids
Stack of released IDs for reuse.
Definition struct_utils.hpp:205
arion::BYTE * build(STRUCT_ID id, arion::CPU_ARCH arch, size_t &struct_len)
Definition struct_utils.hpp:548
~PolymorphicStructFactory()
Definition struct_utils.hpp:292
uint8_t get_ptr_sz(arion::CPU_ARCH arch)
Definition struct_utils.hpp:262
void clear_structs()
Definition struct_utils.hpp:899
uint16_t get_arch_sz(arion::CPU_ARCH arch)
Definition struct_utils.hpp:275
STRUCT_ID feed(arion::CPU_ARCH arch, arion::BYTE *struct_inst)
Definition struct_utils.hpp:411
STRUCT_ID gen_next_id()
Definition struct_utils.hpp:215
Represents a single instance of a polymorphic structure, storing its field values dynamically.
Definition struct_utils.hpp:136
~PolymorphicStruct()
Definition struct_utils.hpp:147
uint64_t get_int_field(std::string name)
Retrieves the value of a named integer field.
Definition struct_utils.hpp:172
void set_field(std::string name, uint64_t val)
Sets an integer/primitive field value.
Definition struct_utils.hpp:153
void set_field(std::string name, void *arr)
Sets an array field value (takes ownership of the pointer).
Definition struct_utils.hpp:158
std::map< std::string, uint64_t > int_vals
Map storing integer/primitive field values by name.
Definition struct_utils.hpp:139
std::map< std::string, void * > arr_vals
Map storing pointers to dynamically allocated array field values by name.
Definition struct_utils.hpp:141
void * get_arr_field(std::string name)
Retrieves the pointer to a named array field.
Definition struct_utils.hpp:186
bool has_arr_field(std::string name)
Checks if a named array field exists.
Definition struct_utils.hpp:180
bool has_int_field(std::string name)
Checks if a named integer field exists.
Definition struct_utils.hpp:166
Abstract base class for all kernel-related data types used for visualization/logging.
Definition type_utils.hpp:27
std::string name
Display name of the data type (e.g., "File descriptor").
Definition type_utils.hpp:30
KernelType(std::string name, arion::LOG_COLOR color=arion::LOG_COLOR::DEFAULT)
Definition type_utils.hpp:40
#define ARION_MAX_U64
Maximum number for an unsigned 64-bit integer.
Definition global_defs.hpp:27
Definition struct_utils.hpp:17
std::map< arion::CPU_ARCH, uint16_t > ARCH_SZ
Map defining the architecture size (in bits) based on the CPU architecture.
Definition struct_utils.hpp:38
std::map< arion::CPU_ARCH, uint8_t > PTR_SZ_BY_ARCH
Map defining the size of a pointer (in bytes) based on the CPU architecture.
Definition struct_utils.hpp:30
POLYMORPHIC_STRUCT_FIELD_TYPE
Enumeration for specifying the size and type of a polymorphic structure field.
Definition struct_utils.hpp:47
@ A32
32-bit array type.
Definition struct_utils.hpp:63
@ A8
8-bit array type.
Definition struct_utils.hpp:59
@ PTR_ARR
Pointer size array type (array of pointers).
Definition struct_utils.hpp:67
@ A64
64-bit array type.
Definition struct_utils.hpp:65
@ V32
32-bit integer type.
Definition struct_utils.hpp:53
@ V64
64-bit integer type.
Definition struct_utils.hpp:55
@ V8
8-bit integer type.
Definition struct_utils.hpp:49
@ PTR_SZ
Pointer size type (size determined by architecture).
Definition struct_utils.hpp:57
@ V16
16-bit integer type.
Definition struct_utils.hpp:51
@ A16
16-bit array type.
Definition struct_utils.hpp:61
uint64_t STRUCT_ID
Type definition for a unique ID assigned to a managed polymorphic struct instance.
Definition struct_utils.hpp:19
std::map< arion::CPU_ARCH, uint8_t > ALIGN_BY_ARCH
Map defining the required memory alignment (in bytes) based on the CPU architecture.
Definition struct_utils.hpp:22
Definition type_utils.hpp:23
std::shared_ptr< IntType > INT_TYPE
Shared pointer to the singleton instance of IntType.
Definition arch_x86-64.hpp:11
uint64_t ADDR
Identifies a memory address.
Definition global_defs.hpp:36
CPU_ARCH get_host_cpu_arch()
Definition host_utils.hpp:17
CPU_ARCH
Identifies a CPU architecture.
Definition global_defs.hpp:128
@ X8664_ARCH
The x86-64 CPU architecture.
Definition global_defs.hpp:134
@ UNKNOWN_ARCH
Unknown CPU architecture.
Definition global_defs.hpp:130
@ X86_ARCH
The x86 CPU architecture.
Definition global_defs.hpp:132
@ ARM64_ARCH
The ARM64 CPU architecture.
Definition global_defs.hpp:138
@ ARM_ARCH
The ARM CPU architecture.
Definition global_defs.hpp:136
uint8_t BYTE
Identifies an 8-bit integer.
Definition global_defs.hpp:40
Structure defining an architecture constraint for a field in a polymorphic struct.
Definition struct_utils.hpp:72
uint16_t arch_sz
The specific architecture bit size required (e.g., 32 or 64 bit).
Definition struct_utils.hpp:76
POLYMORPHIC_STRUCT_CONSTRAINT()
Definition struct_utils.hpp:81
arion::CPU_ARCH arch
The specific architecture required for the field to be present/used.
Definition struct_utils.hpp:74
POLYMORPHIC_STRUCT_CONSTRAINT(uint16_t arch_sz)
Definition struct_utils.hpp:91
POLYMORPHIC_STRUCT_CONSTRAINT(arion::CPU_ARCH arch)
Definition struct_utils.hpp:86
Structure defining a field within a polymorphic struct, including its constraints and type metadata.
Definition struct_utils.hpp:96
POLYMORPHIC_STRUCT_CONSTRAINT constraint
Constraints dictating when this field is active.
Definition struct_utils.hpp:98
size_t sz
Size of the array (if an array type, otherwise 0).
Definition struct_utils.hpp:106
POLYMORPHIC_STRUCT_FIELD(POLYMORPHIC_STRUCT_CONSTRAINT constraint, POLYMORPHIC_STRUCT_FIELD_TYPE type, std::shared_ptr< arion_type::KernelType > arion_type, std::string name)
Definition struct_utils.hpp:117
POLYMORPHIC_STRUCT_FIELD(POLYMORPHIC_STRUCT_FIELD_TYPE type, std::shared_ptr< arion_type::KernelType > arion_type, std::string name)
Definition struct_utils.hpp:129
std::shared_ptr< arion_type::KernelType > arion_type
The Arion type object used for displaying/interpreting the field value.
Definition struct_utils.hpp:102
POLYMORPHIC_STRUCT_FIELD_TYPE type
The type and size of the field.
Definition struct_utils.hpp:100
POLYMORPHIC_STRUCT_FIELD(POLYMORPHIC_STRUCT_CONSTRAINT constraint, POLYMORPHIC_STRUCT_FIELD_TYPE type, std::shared_ptr< arion_type::KernelType > arion_type, std::string name, size_t sz)
Definition struct_utils.hpp:111
std::string name
The name of the field within the structure.
Definition struct_utils.hpp:104
POLYMORPHIC_STRUCT_FIELD(POLYMORPHIC_STRUCT_FIELD_TYPE type, std::shared_ptr< arion_type::KernelType > arion_type, std::string name, size_t sz)
Definition struct_utils.hpp:123