1#ifndef RITSUKO_CVLS_POINTER_HPP
2#define RITSUKO_CVLS_POINTER_HPP
14#include "../utils.hpp"
35template<
typename Offset_,
typename Length_>
52 static_assert(std::is_integral<Offset_>::value);
53 static_assert(std::is_unsigned<Offset_>::value);
54 static_assert(std::is_integral<Length_>::value);
55 static_assert(std::is_unsigned<Length_>::value);
69template<
typename Offset_,
typename Length_>
72 H5::CompType pointer_type(
sizeof(tmp));
89inline void validate_pointer_datatype(
const H5::CompType& type,
const std::size_t offset_precision,
const std::size_t length_precision) {
90 if (type.getNmembers() != 2) {
91 throw std::runtime_error(
"datatype should have two members");
94 if (type.getMemberName(0) !=
"offset") {
95 throw std::runtime_error(
"first member should be named 'offset'");
97 if (type.getMemberClass(0) != H5T_INTEGER) {
98 throw std::runtime_error(
"first member should be an integer datatype");
100 auto offset_type = type.getMemberIntType(0);
102 throw std::runtime_error(
"first member should not exceed a " +
itoa(offset_precision) +
"-bit unsigned integer");
105 if (type.getMemberName(1) !=
"length") {
106 throw std::runtime_error(
"second member should be named 'length'");
108 if (type.getMemberClass(1) != H5T_INTEGER) {
109 throw std::runtime_error(
"second member should be an integer datatype");
111 auto length_type = type.getMemberIntType(1);
113 throw std::runtime_error(
"second member should not exceed a " +
itoa(length_precision) +
"-bit unsigned integer");
127 if (data.getTypeClass() != H5T_COMPOUND) {
128 throw std::runtime_error(
"expected a compound datatype");
141template<
typename Offset_,
typename Length_>
Check for larger-than-expected types in HDF5 datasets.
Convert an integer to a string.
void validate_pointer_datatype(const H5::CompType &type, const std::size_t offset_precision, const std::size_t length_precision)
Definition Pointer.hpp:89
H5::CompType define_pointer_datatype()
Definition Pointer.hpp:70
bool is_Pointer_out_of_range(const Pointer< Offset_, Length_ > &ptr, const hsize_t heap_length)
Definition Pointer.hpp:142
const H5::PredType & as_numeric_datatype()
Definition as_numeric_datatype.hpp:27
bool exceeds_integer_limit(const H5::IntType &itype, std::size_t precision, bool is_signed)
Definition exceeds_limit.hpp:28
Helper functions for ArtifactDB parsing and validation.
Definition Pointer.hpp:22
void itoa(Integer_ x, std::string &output)
Definition itoa.hpp:26
constexpr bool is_greater_than(Left_ left, Right_ right)
Pointer into the compressed VLS heap.
Definition Pointer.hpp:36
Length_ length
Definition Pointer.hpp:47
Offset_ offset
Definition Pointer.hpp:41