ritsuko
Helper utilities for ArtifactDB C++ code
Loading...
Searching...
No Matches
Pointer.hpp
Go to the documentation of this file.
1#ifndef RITSUKO_CVLS_POINTER_HPP
2#define RITSUKO_CVLS_POINTER_HPP
3
4#include <stdexcept>
5#include <string>
6#include <cstddef>
7#include <limits>
8
9#include "H5Cpp.h"
11
14#include "../utils.hpp"
15#include "../itoa.hpp"
16
22namespace ritsuko {
23
24namespace cvls {
25
35template<typename Offset_, typename Length_>
36struct Pointer {
41 Offset_ offset;
42
47 Length_ length;
48
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);
59};
60
69template<typename Offset_, typename Length_>
71 typedef Pointer<Offset_, Length_> tmp;
72 H5::CompType pointer_type(sizeof(tmp));
73 pointer_type.insertMember("offset", HOFFSET(tmp, offset), hdf5::as_numeric_datatype<Offset_>());
74 pointer_type.insertMember("length", HOFFSET(tmp, length), hdf5::as_numeric_datatype<Length_>());
75 return pointer_type;
76}
77
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");
92 }
93
94 if (type.getMemberName(0) != "offset") {
95 throw std::runtime_error("first member should be named 'offset'");
96 }
97 if (type.getMemberClass(0) != H5T_INTEGER) {
98 throw std::runtime_error("first member should be an integer datatype");
99 }
100 auto offset_type = type.getMemberIntType(0);
101 if (hdf5::exceeds_integer_limit(offset_type, offset_precision, false)) {
102 throw std::runtime_error("first member should not exceed a " + itoa(offset_precision) + "-bit unsigned integer");
103 }
104
105 if (type.getMemberName(1) != "length") {
106 throw std::runtime_error("second member should be named 'length'");
107 }
108 if (type.getMemberClass(1) != H5T_INTEGER) {
109 throw std::runtime_error("second member should be an integer datatype");
110 }
111 auto length_type = type.getMemberIntType(1);
112 if (hdf5::exceeds_integer_limit(length_type, length_precision, false)) {
113 throw std::runtime_error("second member should not exceed a " + itoa(length_precision) + "-bit unsigned integer");
114 }
115}
116
126inline void validate_pointer_datatype(const H5::DataSet& data, const std::size_t offset_precision, const std::size_t length_precision) {
127 if (data.getTypeClass() != H5T_COMPOUND) {
128 throw std::runtime_error("expected a compound datatype");
129 }
130 validate_pointer_datatype(data.getCompType(), offset_precision, length_precision);
131}
132
141template<typename Offset_, typename Length_>
142bool is_Pointer_out_of_range(const Pointer<Offset_, Length_>& ptr, const hsize_t heap_length) {
143 // Some finesse is required here to avoid computing offset + length, as that might overflow.
144 return sanisizer::is_greater_than(ptr.offset, heap_length) || sanisizer::is_greater_than(ptr.length, heap_length - ptr.offset);
145}
146
147}
148
149}
150
151#endif
Choose a HDF5 datatype.
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