22#include "boost/shared_array.hpp"
28template <
class RecordT,
class OptionsT>
30 const std::size_t size_of_record_signature,
31 const std::size_t max_size_of_record,
32 const OptionsT& options)
33 : stream_ptr(stream_ptr),
34 size_of_record_signature(size_of_record_signature),
35 max_size_of_record(max_size_of_record),
38 assert(size_of_record_signature <= max_size_of_record);
39 if (is_null_ptr(stream_ptr))
41 starting_stream_position = stream_ptr->tellg();
42 if (!stream_ptr->good())
43 error(
"InputStreamWithRecords: error in tellg()\n");
46template <
class RecordT,
class OptionsT>
48 const std::size_t size_of_record_signature,
49 const std::size_t max_size_of_record,
50 const OptionsT& options,
51 const std::streampos start_of_data)
53 starting_stream_position(start_of_data),
54 size_of_record_signature(size_of_record_signature),
55 max_size_of_record(max_size_of_record),
58 assert(size_of_record_signature <= max_size_of_record);
59 std::fstream* s_ptr =
new std::fstream;
61 stream_ptr.reset(s_ptr);
62 if (
reset() == Succeeded::no)
63 error(
"InputStreamWithRecords: error in reset() for filename %s\n", filename.c_str());
66template <
class RecordT,
class OptionsT>
68InputStreamWithRecords<RecordT, OptionsT>::get_next_record(RecordT& record)
const
70 if (is_null_ptr(stream_ptr))
76# pragma omp critical(LISTMODEIO)
80 assert(this->size_of_record_signature <= this->max_size_of_record);
81 boost::shared_array<char> data_sptr(
new char[this->max_size_of_record]);
83 stream_ptr->read(data_sptr.get(), this->size_of_record_signature);
84 if (stream_ptr->gcount() <
static_cast<std::streamsize
>(this->size_of_record_signature))
88 const std::size_t size_of_record = record.size_of_record_at_ptr(data_sptr.get(), this->size_of_record_signature, options);
89 assert(size_of_record <= this->max_size_of_record);
90 if (size_of_record > this->size_of_record_signature)
91 stream_ptr->read(data_sptr.get() + this->size_of_record_signature, size_of_record - this->size_of_record_signature);
92 if (stream_ptr->eof())
96 else if (stream_ptr->bad())
98 warning(
"Error after reading from list mode stream in get_next_record");
101 if (ret == Succeeded::yes)
102 ret = record.init_from_data_ptr(data_sptr.get(), size_of_record, options);
108template <
class RecordT,
class OptionsT>
112 if (is_null_ptr(stream_ptr))
113 return Succeeded::no;
116 if (stream_ptr->eof())
118 stream_ptr->seekg(starting_stream_position, std::ios::beg);
119 if (stream_ptr->bad())
120 return Succeeded::no;
122 return Succeeded::yes;
125template <
class RecordT,
class OptionsT>
126typename InputStreamWithRecords<RecordT, OptionsT>::SavedPosition
129 assert(!is_null_ptr(stream_ptr));
132 if (!stream_ptr->eof())
134 pos = stream_ptr->tellg();
135 if (!stream_ptr->good())
136 error(
"InputStreamWithRecords<RecordT, OptionsT>::save_get_position\n"
137 "Error after getting position in file");
143 pos = std::streampos(-1);
145 saved_get_positions.push_back(pos);
146 return saved_get_positions.size() - 1;
149template <
class RecordT,
class OptionsT>
152 const typename InputStreamWithRecords<RecordT, OptionsT>::SavedPosition& pos)
154 if (is_null_ptr(stream_ptr))
155 return Succeeded::no;
157 assert(pos < saved_get_positions.size());
159 if (saved_get_positions[pos] == std::streampos(-1))
160 stream_ptr->seekg(0, std::ios::end);
162 stream_ptr->seekg(saved_get_positions[pos]);
164 if (!stream_ptr->good())
165 return Succeeded::no;
167 return Succeeded::yes;
170template <
class RecordT,
class OptionsT>
171std::vector<std::streampos>
174 return saved_get_positions;
177template <
class RecordT,
class OptionsT>
181 saved_get_positions = poss;
Declaration of class stir::Succeeded.
a class containing an enumeration type that can be used by functions to signal successful operation o...
Definition Succeeded.h:44
Declaration of stir::error()
void error(const char *const s,...)
Print error with format string a la printf and throw exception.
Definition error.cxx:42
void warning(const char *const s,...)
Print warning with format string a la printf.
Definition warning.cxx:41
FILE *& open_read_binary(FILE *&fptr, const string &name)
opens a FILE for reading binary data. Calls error() when it does not succeed.
Definition utilities.cxx:79
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.
Declaration of stir::warning()