57template <
class RecordT>
59 const std::size_t size_of_record_signature,
60 const std::size_t max_size_of_record)
61 : m_filename(filename),
62 size_of_record_signature(size_of_record_signature),
63 max_size_of_record(max_size_of_record)
65 assert(size_of_record_signature <= max_size_of_record);
67 this->max_buffer_size = 10000000;
68 this->buffer.reset(
new char[this->max_buffer_size]);
73template <
class RecordT>
75InputStreamWithRecordsFromHDF5<RecordT>::set_up()
78 data_sptr.reset(
new char[this->max_size_of_record]);
79 starting_stream_position = 0;
82 input_sptr->initialise_listmode_data();
83 m_list_size = input_sptr->get_dataset_size() - this->size_of_record_signature;
85 this->buffer_size = 0;
86 return Succeeded::yes;
89template <
class RecordT>
91InputStreamWithRecordsFromHDF5<RecordT>::fill_buffer(
const std::streampos offset)
const
93 this->buffer_size =
static_cast<std::size_t
>(std::min(
static_cast<uint64_t
>(this->max_buffer_size), m_list_size - offset));
94 input_sptr->read_list_data(buffer.get(), offset, hsize_t(this->buffer_size));
95 this->start_of_buffer_offset = offset;
98template <
class RecordT>
100InputStreamWithRecordsFromHDF5<RecordT>::read_data(
char* output,
const std::streampos offset,
const hsize_t size)
const
102 if (this->buffer_size == 0 || offset < this->start_of_buffer_offset
103 || offset >= (this->start_of_buffer_offset +
static_cast<std::streampos
>(this->buffer_size)))
104 this->fill_buffer(offset);
107 const std::size_t offset_in_buffer = offset - this->start_of_buffer_offset;
108 const hsize_t size_in_buffer = std::min(size,
static_cast<hsize_t
>(this->buffer_size - offset_in_buffer));
110 memcpy(output, this->buffer.get() + offset_in_buffer,
static_cast<std::size_t
>(size_in_buffer));
113 if (size_in_buffer < size)
114 read_data(output + size_in_buffer, offset +
static_cast<std::streampos
>(size_in_buffer), size - size_in_buffer);
117template <
class RecordT>
119InputStreamWithRecordsFromHDF5<RecordT>::get_next_record(RecordT& record)
123 if (current_offset >=
static_cast<std::streampos
>(m_list_size))
124 return Succeeded::no;
125 char* data_ptr = data_sptr.get();
126 this->
read_data(data_ptr, current_offset, hsize_t(this->size_of_record_signature));
127 const std::size_t size_of_record = record.size_of_record_at_ptr(data_ptr, this->size_of_record_signature,
false);
129 assert(size_of_record <= this->max_size_of_record);
131 auto remainder = size_of_record - this->size_of_record_signature;
133 this->
read_data(data_ptr + this->size_of_record_signature,
134 current_offset +
static_cast<std::streampos
>(this->size_of_record_signature),
136 current_offset += size_of_record;
137 return record.init_from_data_ptr(data_ptr, size_of_record,
false);
141 return Succeeded::no;
145template <
class RecordT>
149 if (is_null_ptr(input_sptr))
150 return Succeeded::no;
153 return Succeeded::yes;
156template <
class RecordT>
157typename InputStreamWithRecordsFromHDF5<RecordT>::SavedPosition
160 assert(!is_null_ptr(input_sptr));
163 saved_get_positions.push_back(current_offset);
164 return saved_get_positions.size() - 1;
167template <
class RecordT>
170 const typename InputStreamWithRecordsFromHDF5<RecordT>::SavedPosition& pos)
172 if (is_null_ptr(input_sptr))
173 return Succeeded::no;
175 assert(pos < saved_get_positions.size());
176 current_offset = saved_get_positions[pos];
178 return Succeeded::yes;
181template <
class RecordT>
182std::vector<std::streampos>
185 return saved_get_positions;
188template <
class RecordT>
192 saved_get_positions = poss;
Declaration of class stir::Succeeded.
A class that extracts and reads the necessary data from GE HDF5 input files.
Definition GEHDF5Wrapper.h:51
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition Succeeded.h:44
Succeeded read_data(IStreamT &s, ArrayType< num_dimensions, elemT > &data, const ByteOrder byte_order=ByteOrder::native)
Read the data of an Array from file.
Definition read_data.inl:63
Definition of stir::is_null_ptr functions.
Import of std::shared_ptr, std::dynamic_pointer_cast and std::static_pointer_cast into the stir names...
This file declares various utility functions.