95class Reader :
public GridReader {
97 using ReaderFactoryFunctor = ReaderDetail::ReaderFactoryFunctor;
100 : Reader(ReaderDetail::default_reader_factory())
103 explicit Reader(ReaderFactoryFunctor f)
104 : _reader_factory{std::move(f)}
107 explicit Reader(
const FileFormat::Any&, ReaderFactoryFunctor f = ReaderDetail::default_reader_factory())
111 template<Concepts::Communicator C>
113 : Reader(ReaderDetail::default_reader_factory(c))
116 template<ReaderDetail::SequentiallyConstructible FileFormat>
117 explicit Reader(
const FileFormat& f)
121 template<
typename FileFormat,
122 Concepts::Communicator Communicator>
123 requires(ReaderDetail::ParallelConstructible<FileFormat, Communicator>)
124 explicit Reader(
const FileFormat& f,
const Communicator& c)
129 template<
typename... ConstructorArgs>
130 static Reader
from(
const std::string&
filename, ConstructorArgs&&... args) {
143 return std::move(*
this);
147 template<
typename ReaderImpl>
148 auto _make_unique(ReaderImpl&& reader)
const {
149 return std::make_unique<std::remove_cvref_t<ReaderImpl>>(std::move(reader));
152 std::string _name()
const override {
153 if (_reader_is_set())
154 return _access_reader().
name();
158 void _open(
const std::string&
filename,
typename GridReader::FieldNames& names)
override {
160 _reader = (*_reader_factory)(
filename);
161 _access_reader().close();
163 ReaderDetail::copy_field_names(_access_reader(), names);
166 void _close()
override {
167 _access_reader().close();
170 std::size_t _number_of_cells()
const override {
171 return _access_reader().number_of_cells();
174 std::size_t _number_of_points()
const override {
175 return _access_reader().number_of_points();
178 std::size_t _number_of_pieces()
const override {
179 return _access_reader().number_of_pieces();
182 FieldPtr _cell_field(std::string_view
name)
const override {
183 return _access_reader().cell_field(
name);
186 FieldPtr _point_field(std::string_view
name)
const override {
187 return _access_reader().point_field(
name);
190 FieldPtr _meta_data_field(std::string_view
name)
const override {
191 return _access_reader().meta_data_field(
name);
194 void _visit_cells(
const CellVisitor& v)
const override {
195 _access_reader().visit_cells(v);
199 return _access_reader().points();
202 typename GridReader::PieceLocation _location()
const override {
203 return _access_reader().location();
206 std::vector<double> _ordinates(
unsigned int dir)
const override {
207 return _access_reader().ordinates(dir);
210 std::array<double, 3> _spacing()
const override {
211 return _access_reader().spacing();
214 std::array<double, 3> _origin()
const override {
215 return _access_reader().origin();
218 std::array<double, 3> _basis_vector(
unsigned int dir)
const override {
219 return _access_reader().basis_vector(dir);
222 bool _is_sequence()
const override {
223 return _access_reader().is_sequence();
226 std::size_t _number_of_steps()
const override {
227 return _access_reader().number_of_steps();
230 double _time_at_step(std::size_t step)
const override {
231 return _access_reader().time_at_step(step);
234 void _set_step(std::size_t step,
typename GridReader::FieldNames& field_names)
override {
235 _access_reader().set_step(step);
237 ReaderDetail::copy_field_names(_access_reader(), field_names);
240 const GridReader& _access_reader()
const {
241 _check_reader_access();
245 GridReader& _access_reader() {
246 _check_reader_access();
250 void _check_reader_access()
const {
251 if (!_reader_is_set())
252 throw InvalidState(
"No file has been read");
255 bool _reader_is_set()
const {
256 return static_cast<bool>(_reader);
259 std::unique_ptr<GridReader> _reader;
260 std::optional<ReaderFactoryFunctor> _reader_factory;