openPMD-api
IOTask.hpp
1 /* Copyright 2017-2020 Fabian Koller
2  *
3  * This file is part of openPMD-api.
4  *
5  * openPMD-api is free software: you can redistribute it and/or modify
6  * it under the terms of of either the GNU General Public License or
7  * the GNU Lesser General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * openPMD-api is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License and the GNU Lesser General Public License
15  * for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * and the GNU Lesser General Public License along with openPMD-api.
19  * If not, see <http://www.gnu.org/licenses/>.
20  */
21 #pragma once
22 
23 #include "openPMD/auxiliary/Export.hpp"
24 #include "openPMD/auxiliary/Variant.hpp"
25 #include "openPMD/backend/Attribute.hpp"
26 #include "openPMD/ChunkInfo.hpp"
27 #include "openPMD/Dataset.hpp"
28 
29 #include <memory>
30 #include <map>
31 #include <string>
32 #include <utility>
33 #include <vector>
34 
35 #include "openPMD/Streaming.hpp"
36 
37 
38 namespace openPMD
39 {
40 class Attributable;
41 class Writable;
42 
43 Writable*
44 getWritable(Attributable*);
45 
49 {
50  CREATE_FILE,
51  OPEN_FILE,
52  CLOSE_FILE,
53  DELETE_FILE,
54 
55  CREATE_PATH,
56  CLOSE_PATH,
57  OPEN_PATH,
58  DELETE_PATH,
59  LIST_PATHS,
60 
61  CREATE_DATASET,
62  EXTEND_DATASET,
63  OPEN_DATASET,
64  DELETE_DATASET,
65  WRITE_DATASET,
66  READ_DATASET,
67  LIST_DATASETS,
68 
69  DELETE_ATT,
70  WRITE_ATT,
71  READ_ATT,
72  LIST_ATTS,
73 
74  ADVANCE,
75  AVAILABLE_CHUNKS
76 }; // Operation
77 
78 struct OPENPMDAPI_EXPORT AbstractParameter
79 {
80  virtual ~AbstractParameter() = default;
81  AbstractParameter() = default;
82  //AbstractParameter(AbstractParameter&&) = default;
83 
84  // avoid object slicing
85  AbstractParameter(const AbstractParameter&) = delete;
86  AbstractParameter& operator=(const AbstractParameter&) = delete;
87  virtual std::unique_ptr< AbstractParameter > clone() const = 0;
88 };
89 
98 template< Operation >
99 struct OPENPMDAPI_EXPORT Parameter : public AbstractParameter
100 {
101  Parameter() = delete;
102  Parameter(Parameter const &) = delete;
103  Parameter(Parameter &&) = delete;
104 };
105 
106 template<>
107 struct OPENPMDAPI_EXPORT Parameter< Operation::CREATE_FILE > : public AbstractParameter
108 {
109  Parameter() = default;
110  Parameter(Parameter const & p) : AbstractParameter(), name(p.name) {}
111 
112  std::unique_ptr< AbstractParameter >
113  clone() const override
114  {
115  return std::unique_ptr< AbstractParameter >(
117  }
118 
119  std::string name = "";
120 };
121 
122 template<>
123 struct OPENPMDAPI_EXPORT Parameter< Operation::OPEN_FILE > : public AbstractParameter
124 {
125  Parameter() = default;
126  Parameter(Parameter const & p) : AbstractParameter(), name(p.name) {}
127 
128  std::unique_ptr< AbstractParameter >
129  clone() const override
130  {
131  return std::unique_ptr< AbstractParameter >(
133  }
134 
135  std::string name = "";
136 };
137 
138 template<>
139 struct OPENPMDAPI_EXPORT Parameter< Operation::CLOSE_FILE > : public AbstractParameter
140 {
141  Parameter() = default;
142  Parameter( Parameter const & ) : AbstractParameter() {}
143 
144  std::unique_ptr< AbstractParameter >
145  clone() const override
146  {
147  return std::unique_ptr< AbstractParameter >(
148  new Parameter< Operation::CLOSE_FILE >( *this ) );
149  }
150 };
151 
152 template<>
153 struct OPENPMDAPI_EXPORT Parameter< Operation::DELETE_FILE > : public AbstractParameter
154 {
155  Parameter() = default;
156  Parameter(Parameter const & p) : AbstractParameter(), name(p.name) {}
157 
158  std::unique_ptr< AbstractParameter >
159  clone() const override
160  {
161  return std::unique_ptr< AbstractParameter >(
163  }
164 
165  std::string name = "";
166 };
167 
168 template<>
169 struct OPENPMDAPI_EXPORT Parameter< Operation::CREATE_PATH > : public AbstractParameter
170 {
171  Parameter() = default;
172  Parameter(Parameter const & p) : AbstractParameter(), path(p.path) {}
173 
174  std::unique_ptr< AbstractParameter >
175  clone() const override
176  {
177  return std::unique_ptr< AbstractParameter >(
179  }
180 
181  std::string path = "";
182 };
183 
184 template<>
185 struct OPENPMDAPI_EXPORT Parameter< Operation::CLOSE_PATH > : public AbstractParameter
186 {
187  Parameter() = default;
188  Parameter( Parameter const & ) : AbstractParameter()
189  {
190  }
191 
192  Parameter &
193  operator=( Parameter const & )
194  {
195  return *this;
196  }
197 
198  std::unique_ptr< AbstractParameter >
199  clone() const override
200  {
201  return std::unique_ptr< AbstractParameter >(
202  new Parameter< Operation::CLOSE_PATH >( *this ) );
203  }
204 };
205 
206 template<>
207 struct OPENPMDAPI_EXPORT Parameter< Operation::OPEN_PATH > : public AbstractParameter
208 {
209  Parameter() = default;
210  Parameter(Parameter const & p) : AbstractParameter(), path(p.path) {}
211 
212  std::unique_ptr< AbstractParameter >
213  clone() const override
214  {
215  return std::unique_ptr< AbstractParameter >(
217  }
218 
219  std::string path = "";
220 };
221 
222 template<>
223 struct OPENPMDAPI_EXPORT Parameter< Operation::DELETE_PATH > : public AbstractParameter
224 {
225  Parameter() = default;
226  Parameter(Parameter const & p) : AbstractParameter(), path(p.path) {}
227 
228  std::unique_ptr< AbstractParameter >
229  clone() const override
230  {
231  return std::unique_ptr< AbstractParameter >(
233  }
234 
235  std::string path = "";
236 };
237 
238 template<>
239 struct OPENPMDAPI_EXPORT Parameter< Operation::LIST_PATHS > : public AbstractParameter
240 {
241  Parameter() = default;
242  Parameter(Parameter const & p) : AbstractParameter(), paths(p.paths) {}
243 
244  std::unique_ptr< AbstractParameter >
245  clone() const override
246  {
247  return std::unique_ptr< AbstractParameter >(
249  }
250 
251  std::shared_ptr< std::vector< std::string > > paths
252  = std::make_shared< std::vector< std::string > >();
253 };
254 
255 template<>
256 struct OPENPMDAPI_EXPORT Parameter< Operation::CREATE_DATASET > : public AbstractParameter
257 {
258  Parameter() = default;
259  Parameter(Parameter const & p) : AbstractParameter(),
260  name(p.name), extent(p.extent), dtype(p.dtype),
261  chunkSize(p.chunkSize), compression(p.compression),
262  transform(p.transform), options(p.options) {}
263 
264  std::unique_ptr< AbstractParameter >
265  clone() const override
266  {
267  return std::unique_ptr< AbstractParameter >(
269  }
270 
271  std::string name = "";
272  Extent extent = {};
273  Datatype dtype = Datatype::UNDEFINED;
274  Extent chunkSize = {};
275  std::string compression = "";
276  std::string transform = "";
277  std::string options = "{}";
278 };
279 
280 template<>
281 struct OPENPMDAPI_EXPORT Parameter< Operation::EXTEND_DATASET > : public AbstractParameter
282 {
283  Parameter() = default;
284  Parameter(Parameter const & p) : AbstractParameter(),
285  name(p.name), extent(p.extent) {}
286 
287  std::unique_ptr< AbstractParameter >
288  clone() const override
289  {
290  return std::unique_ptr< AbstractParameter >(
292  }
293 
294  std::string name = "";
295  Extent extent = {};
296 };
297 
298 template<>
299 struct OPENPMDAPI_EXPORT Parameter< Operation::OPEN_DATASET > : public AbstractParameter
300 {
301  Parameter() = default;
302  Parameter(Parameter const & p) : AbstractParameter(),
303  name(p.name), dtype(p.dtype), extent(p.extent) {}
304 
305  std::unique_ptr< AbstractParameter >
306  clone() const override
307  {
308  return std::unique_ptr< AbstractParameter >(
310  }
311 
312  std::string name = "";
313  std::shared_ptr< Datatype > dtype
314  = std::make_shared< Datatype >();
315  std::shared_ptr< Extent > extent
316  = std::make_shared< Extent >();
317 };
318 
319 template<>
320 struct OPENPMDAPI_EXPORT Parameter< Operation::DELETE_DATASET > : public AbstractParameter
321 {
322  Parameter() = default;
323  Parameter(Parameter const & p) : AbstractParameter(), name(p.name) {}
324 
325  std::unique_ptr< AbstractParameter >
326  clone() const override
327  {
328  return std::unique_ptr< AbstractParameter >(
330  }
331 
332  std::string name = "";
333 };
334 
335 template<>
336 struct OPENPMDAPI_EXPORT Parameter< Operation::WRITE_DATASET > : public AbstractParameter
337 {
338  Parameter() = default;
340  extent(p.extent), offset(p.offset), dtype(p.dtype),
341  data(p.data) {}
342 
343  Parameter& operator=(const Parameter& p) {
344  this->extent = p.extent;
345  this->offset = p.offset;
346  this->dtype = p.dtype;
347  this->data = p.data;
348  return *this;
349  }
350 
351  std::unique_ptr< AbstractParameter >
352  clone() const override
353  {
354  return std::unique_ptr< AbstractParameter >(
356  }
357 
358  Extent extent = {};
359  Offset offset = {};
360  Datatype dtype = Datatype::UNDEFINED;
361  std::shared_ptr< void const > data = nullptr;
362 };
363 
364 template<>
365 struct OPENPMDAPI_EXPORT Parameter< Operation::READ_DATASET > : public AbstractParameter
366 {
367  Parameter() = default;
369  extent(p.extent), offset(p.offset), dtype(p.dtype),
370  data(p.data) {}
371 
372  Parameter& operator=(const Parameter &p) {
373  this->extent = p.extent;
374  this->offset = p.offset;
375  this->dtype = p.dtype;
376  this->data = p.data;
377  return *this;
378  }
379 
380  std::unique_ptr< AbstractParameter >
381  clone() const override
382  {
383  return std::unique_ptr< AbstractParameter >(
385  }
386 
387  Extent extent = {};
388  Offset offset = {};
389  Datatype dtype = Datatype::UNDEFINED;
390  std::shared_ptr< void > data = nullptr;
391 };
392 
393 template<>
394 struct OPENPMDAPI_EXPORT Parameter< Operation::LIST_DATASETS > : public AbstractParameter
395 {
396  Parameter() = default;
397  Parameter(Parameter const & p) : AbstractParameter(),
398  datasets(p.datasets) {}
399 
400  std::unique_ptr< AbstractParameter >
401  clone() const override
402  {
403  return std::unique_ptr< AbstractParameter >(
405  }
406 
407  std::shared_ptr< std::vector< std::string > > datasets
408  = std::make_shared< std::vector< std::string > >();
409 };
410 
411 template<>
412 struct OPENPMDAPI_EXPORT Parameter< Operation::DELETE_ATT > : public AbstractParameter
413 {
414  Parameter() = default;
415  Parameter(Parameter const & p) : AbstractParameter(), name(p.name) {}
416 
417  std::unique_ptr< AbstractParameter >
418  clone() const override
419  {
420  return std::unique_ptr< AbstractParameter >(
422  }
423 
424  std::string name = "";
425 };
426 
427 template<>
428 struct OPENPMDAPI_EXPORT Parameter< Operation::WRITE_ATT > : public AbstractParameter
429 {
430  Parameter() = default;
431  Parameter(Parameter const & p) : AbstractParameter(),
432  name(p.name), dtype(p.dtype), resource(p.resource) {}
433 
434  std::unique_ptr< AbstractParameter >
435  clone() const override
436  {
437  return std::unique_ptr< AbstractParameter >(
439  }
440 
441  std::string name = "";
442  Datatype dtype = Datatype::UNDEFINED;
443  Attribute::resource resource;
444 };
445 
446 template<>
447 struct OPENPMDAPI_EXPORT Parameter< Operation::READ_ATT > : public AbstractParameter
448 {
449  Parameter() = default;
450  Parameter(Parameter const & p) : AbstractParameter(),
451  name(p.name), dtype(p.dtype), resource(p.resource) {}
452 
453  Parameter& operator=(const Parameter &p) {
454  this->name = p.name;
455  this->dtype = p.dtype;
456  this->resource = p.resource;
457  return *this;
458  }
459 
460  std::unique_ptr< AbstractParameter >
461  clone() const override
462  {
463  return std::unique_ptr< AbstractParameter >(
465  }
466 
467  std::string name = "";
468  std::shared_ptr< Datatype > dtype
469  = std::make_shared< Datatype >();
470  std::shared_ptr< Attribute::resource > resource
471  = std::make_shared< Attribute::resource >();
472 };
473 
474 template<>
475 struct OPENPMDAPI_EXPORT Parameter< Operation::LIST_ATTS > : public AbstractParameter
476 {
477  Parameter() = default;
478  Parameter(Parameter const & p) : AbstractParameter(),
479  attributes(p.attributes) {}
480 
481  std::unique_ptr< AbstractParameter >
482  clone() const override
483  {
484  return std::unique_ptr< AbstractParameter >(
486  }
487 
488  std::shared_ptr< std::vector< std::string > > attributes
489  = std::make_shared< std::vector< std::string > >();
490 };
491 
492 template<>
493 struct OPENPMDAPI_EXPORT Parameter< Operation::ADVANCE > : public AbstractParameter
494 {
495  Parameter() = default;
496  Parameter( Parameter const & p )
497  : AbstractParameter(), mode( p.mode ), status( p.status )
498  {
499  }
500 
501  std::unique_ptr< AbstractParameter >
502  clone() const override
503  {
504  return std::unique_ptr< AbstractParameter >(
505  new Parameter< Operation::ADVANCE >( *this ) );
506  }
507 
511  std::shared_ptr< AdvanceStatus > status =
512  std::make_shared< AdvanceStatus >( AdvanceStatus::OK );
513 };
514 
515 template<>
516 struct OPENPMDAPI_EXPORT Parameter< Operation::AVAILABLE_CHUNKS >
517  : public AbstractParameter
518 {
519  Parameter() = default;
520  Parameter( Parameter const & p ) : AbstractParameter(), chunks( p.chunks )
521  {
522  }
523 
524  Parameter &
525  operator=( Parameter const & p )
526  {
527  chunks = p.chunks;
528  return *this;
529  }
530 
531  std::unique_ptr< AbstractParameter >
532  clone() const override
533  {
534  return std::unique_ptr< AbstractParameter >(
536  }
537 
538  // output parameter
539  std::shared_ptr< ChunkTable > chunks = std::make_shared< ChunkTable >();
540 };
541 
550 class OPENPMDAPI_EXPORT IOTask
551 {
552 public:
559  template< Operation op >
560  explicit IOTask(Writable* w,
561  Parameter< op > const & p)
562  : writable{w},
563  operation{op},
564  parameter{p.clone()}
565  { }
566 
567  template< Operation op >
568  explicit IOTask(Attributable* a,
569  Parameter< op > const & p)
570  : writable{getWritable(a)},
571  operation{op},
572  parameter{p.clone()}
573  { }
574 
575  explicit IOTask(IOTask const & other) :
576  writable{other.writable},
577  operation{other.operation},
578  parameter{other.parameter}
579  {}
580 
581  IOTask& operator=(IOTask const & other)
582  {
583  writable = other.writable;
584  operation = other.operation;
585  parameter = other.parameter;
586  return *this;
587  }
588 
589  Writable* writable;
590  Operation operation;
591  std::shared_ptr< AbstractParameter > parameter;
592 }; // IOTask
593 } // namespace openPMD
Self-contained description of a single IO operation.
Definition: IOTask.hpp:550
AdvanceMode mode
input parameter
Definition: IOTask.hpp:509
AdvanceMode
In step-based mode (i.e.
Definition: Streaming.hpp:33
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:42
Public definitions of openPMD-api.
Definition: Date.cpp:29
Layer to mirror structure of logical data and persistent data in file.
Definition: Writable.hpp:55
Typesafe description of all required arguments for a specified Operation.
Definition: IOTask.hpp:99
OPENPMDAPI_EXPORT_ENUM_CLASS(Operation)
Type of IO operation between logical and persistent data.
Definition: IOTask.hpp:48
Definition: IOTask.hpp:78
IOTask(Writable *w, Parameter< op > const &p)
Constructor for self-contained description of single IO operation.
Definition: IOTask.hpp:560
Layer to manage storage of attributes associated with file objects.
Definition: Attributable.hpp:65