openPMD-api
IOTask.hpp
1 /* Copyright 2017-2025 Fabian Koller, Axel Huebl, Franz Poeschel, Junmin Gu
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/ChunkInfo.hpp"
24 #include "openPMD/Dataset.hpp"
25 #include "openPMD/Error.hpp"
26 #include "openPMD/IterationEncoding.hpp"
27 #include "openPMD/Streaming.hpp"
28 #include "openPMD/auxiliary/Export.hpp"
29 #include "openPMD/auxiliary/Memory.hpp"
30 #include "openPMD/auxiliary/Variant.hpp"
31 #include "openPMD/backend/Attribute.hpp"
32 #include "openPMD/backend/ParsePreference.hpp"
33 
34 #include <any>
35 #include <cstddef>
36 #include <memory>
37 #include <optional>
38 #include <string>
39 #include <utility>
40 #include <variant>
41 #include <vector>
42 
43 namespace openPMD
44 {
45 class Attributable;
46 class Writable;
47 namespace json
48 {
49  class JsonMatcher;
50 }
51 
52 Writable *getWritable(Attributable *);
53 
57  CREATE_FILE,
58  CHECK_FILE,
59  OPEN_FILE,
60  CLOSE_FILE,
61  DELETE_FILE,
62 
63  CREATE_PATH,
64  CLOSE_PATH,
65  OPEN_PATH,
66  DELETE_PATH,
67  LIST_PATHS,
68 
69  CREATE_DATASET,
70  EXTEND_DATASET,
71  OPEN_DATASET,
72  DELETE_DATASET,
73  WRITE_DATASET,
74  READ_DATASET,
75  LIST_DATASETS,
76  GET_BUFFER_VIEW,
77 
78  DELETE_ATT,
79  WRITE_ATT,
80  READ_ATT,
81  READ_ATT_ALLSTEPS,
82  LIST_ATTS,
83 
84  ADVANCE,
85  AVAILABLE_CHUNKS,
86  DEREGISTER,
87  TOUCH,
88  SET_WRITTEN
89 }; // note: if you change the enum members here, please update
90  // docs/source/dev/design.rst
91 
92 namespace internal
93 {
94  /*
95  * The returned strings are compile-time constants, so no worries about
96  * pointer validity.
97  */
98  OPENPMDAPI_EXPORT std::string operationAsString(Operation);
99 } // namespace internal
100 
101 struct OPENPMDAPI_EXPORT AbstractParameter
102 {
103  virtual ~AbstractParameter() = default;
104  AbstractParameter() = default;
105 
106  virtual std::unique_ptr<AbstractParameter> to_heap() && = 0;
107 
114  template <typename TracingJSON>
115  static void warnUnusedParameters(
116  TracingJSON &,
117  std::string const &currentBackendName,
118  std::string const &warningMessage);
119 
120  // Used as a tag in some constructors to make callsites explicitly
121  // acknowledge that joined dimensions will not be automatically resolved
123  {};
125  I_dont_want_to_use_joined_dimensions{};
126 
127 protected:
128  // avoid object slicing
129  // by allow only child classes to use these things for defining their own
130  // copy/move constructors/assignment operators
131  AbstractParameter(const AbstractParameter &) = default;
132  AbstractParameter &operator=(const AbstractParameter &) = default;
133  AbstractParameter(AbstractParameter &&) = default;
134  AbstractParameter &operator=(AbstractParameter &&) = default;
135 };
136 
146 template <Operation>
147 struct OPENPMDAPI_EXPORT Parameter : public AbstractParameter
148 {
149  Parameter() = delete;
150  Parameter(Parameter const &) = delete;
151  Parameter(Parameter &&) = delete;
152 };
153 
154 template <>
155 struct OPENPMDAPI_EXPORT
156  Parameter<Operation::CREATE_FILE> : public AbstractParameter
157 {
158  Parameter() = default;
159  Parameter(Parameter &&) = default;
160  Parameter(Parameter const &) = default;
161  Parameter &operator=(Parameter &&) = default;
162  Parameter &operator=(Parameter const &) = default;
163 
164  std::unique_ptr<AbstractParameter> to_heap() && override
165  {
166  return std::unique_ptr<AbstractParameter>(
167  new Parameter<Operation::CREATE_FILE>(std::move(*this)));
168  }
169 
170  std::string name = "";
171 };
172 
173 template <>
174 struct OPENPMDAPI_EXPORT
175  Parameter<Operation::CHECK_FILE> : public AbstractParameter
176 {
177  Parameter() = default;
178  Parameter(Parameter &&) = default;
179  Parameter(Parameter const &) = default;
180  Parameter &operator=(Parameter &&) = default;
181  Parameter &operator=(Parameter const &) = default;
182 
183  std::unique_ptr<AbstractParameter> to_heap() && override
184  {
185  return std::unique_ptr<AbstractParameter>(
186  new Parameter<Operation::CHECK_FILE>(std::move(*this)));
187  }
188 
189  std::string name = "";
190  enum class FileExists
191  {
192  DontKnow,
193  Yes,
194  No
195  };
196  std::shared_ptr<FileExists> fileExists =
197  std::make_shared<FileExists>(FileExists::DontKnow);
198 };
199 
200 template <>
201 struct OPENPMDAPI_EXPORT
202  Parameter<Operation::OPEN_FILE> : public AbstractParameter
203 {
204  Parameter() = default;
205  Parameter(Parameter &&) = default;
206  Parameter(Parameter const &) = default;
207  Parameter &operator=(Parameter &&) = default;
208  Parameter &operator=(Parameter const &) = default;
209 
210  std::unique_ptr<AbstractParameter> to_heap() && override
211  {
212  return std::unique_ptr<AbstractParameter>(
213  new Parameter<Operation::OPEN_FILE>(std::move(*this)));
214  }
215 
216  // Needed for reopening files in file-based Iteration encoding when using
217  // R/W-mode in ADIOS2. Files can only be opened for reading XOR writing,
218  // so R/W mode in file-based encoding can only operate at the granularity
219  // of files in ADIOS2. The frontend needs to tell us if we should reopen
220  // a file for continued reading (WasFoundOnDisk) or for continued writing
221  // (WasCreatedByUs).
222  enum class Reopen
223  {
224  WasCreatedByUs,
225  WasFoundOnDisk,
226  NoReopen
227  };
228 
229  std::string name = "";
230  Reopen reopen = Reopen::NoReopen;
231  using ParsePreference = internal::ParsePreference;
232  std::shared_ptr<ParsePreference> out_parsePreference =
233  std::make_shared<ParsePreference>(ParsePreference::UpFront);
234 };
235 
236 template <>
237 struct OPENPMDAPI_EXPORT
238  Parameter<Operation::CLOSE_FILE> : public AbstractParameter
239 {
240  Parameter() = default;
241  Parameter(Parameter &&) = default;
242  Parameter(Parameter const &) = default;
243  Parameter &operator=(Parameter &&) = default;
244  Parameter &operator=(Parameter const &) = default;
245 
246  std::unique_ptr<AbstractParameter> to_heap() && override
247  {
248  return std::unique_ptr<AbstractParameter>(
249  new Parameter<Operation::CLOSE_FILE>(std::move(*this)));
250  }
251 };
252 
253 template <>
254 struct OPENPMDAPI_EXPORT
255  Parameter<Operation::DELETE_FILE> : public AbstractParameter
256 {
257  Parameter() = default;
258  Parameter(Parameter &&) = default;
259  Parameter(Parameter const &) = default;
260  Parameter &operator=(Parameter &&) = default;
261  Parameter &operator=(Parameter const &) = default;
262 
263  std::unique_ptr<AbstractParameter> to_heap() && override
264  {
265  return std::unique_ptr<AbstractParameter>(
266  new Parameter<Operation::DELETE_FILE>(std::move(*this)));
267  }
268 
269  std::string name = "";
270 };
271 
272 template <>
273 struct OPENPMDAPI_EXPORT
274  Parameter<Operation::CREATE_PATH> : public AbstractParameter
275 {
276  Parameter() = default;
277  Parameter(Parameter &&) = default;
278  Parameter(Parameter const &) = default;
279  Parameter &operator=(Parameter &&) = default;
280  Parameter &operator=(Parameter const &) = default;
281 
282  std::unique_ptr<AbstractParameter> to_heap() && override
283  {
284  return std::unique_ptr<AbstractParameter>(
285  new Parameter<Operation::CREATE_PATH>(std::move(*this)));
286  }
287 
288  std::string path = "";
289 };
290 
291 template <>
292 struct OPENPMDAPI_EXPORT
293  Parameter<Operation::CLOSE_PATH> : public AbstractParameter
294 {
295  Parameter() = default;
296  Parameter(Parameter &&) = default;
297  Parameter(Parameter const &) = default;
298  Parameter &operator=(Parameter &&) = default;
299  Parameter &operator=(Parameter const &) = default;
300 
301  std::unique_ptr<AbstractParameter> to_heap() && override
302  {
303  return std::unique_ptr<AbstractParameter>(
304  new Parameter<Operation::CLOSE_PATH>(std::move(*this)));
305  }
306 };
307 
308 template <>
309 struct OPENPMDAPI_EXPORT
310  Parameter<Operation::OPEN_PATH> : public AbstractParameter
311 {
312  Parameter() = default;
313  Parameter(Parameter &&) = default;
314  Parameter(Parameter const &) = default;
315  Parameter &operator=(Parameter &&) = default;
316  Parameter &operator=(Parameter const &) = default;
317 
318  std::unique_ptr<AbstractParameter> to_heap() && override
319  {
320  return std::unique_ptr<AbstractParameter>(
321  new Parameter<Operation::OPEN_PATH>(std::move(*this)));
322  }
323 
324  std::string path = "";
325 };
326 
327 template <>
328 struct OPENPMDAPI_EXPORT
329  Parameter<Operation::DELETE_PATH> : public AbstractParameter
330 {
331  Parameter() = default;
332  Parameter(Parameter &&) = default;
333  Parameter(Parameter const &) = default;
334  Parameter &operator=(Parameter &&) = default;
335  Parameter &operator=(Parameter const &) = default;
336 
337  std::unique_ptr<AbstractParameter> to_heap() && override
338  {
339  return std::unique_ptr<AbstractParameter>(
340  new Parameter<Operation::DELETE_PATH>(std::move(*this)));
341  }
342 
343  std::string path = "";
344 };
345 
346 template <>
347 struct OPENPMDAPI_EXPORT
348  Parameter<Operation::LIST_PATHS> : public AbstractParameter
349 {
350  Parameter() = default;
351  Parameter(Parameter &&) = default;
352  Parameter(Parameter const &) = default;
353  Parameter &operator=(Parameter &&) = default;
354  Parameter &operator=(Parameter const &) = default;
355 
356  std::unique_ptr<AbstractParameter> to_heap() && override
357  {
358  return std::unique_ptr<AbstractParameter>(
359  new Parameter<Operation::LIST_PATHS>(std::move(*this)));
360  }
361 
362  std::shared_ptr<std::vector<std::string>> paths =
363  std::make_shared<std::vector<std::string>>();
364 };
365 
366 template <>
367 struct OPENPMDAPI_EXPORT
368  Parameter<Operation::CREATE_DATASET> : public AbstractParameter
369 {
370  Parameter(Dataset const &ds)
371  : extent(ds.extent)
372  , dtype(ds.dtype)
373  , options(ds.options)
374  , joinedDimension(ds.joinedDimension())
375  {}
376 
377  // default constructor, but callsites need to explicitly acknowledge that
378  // joined dimensions will not be automatically configured when using it
380  {}
381  Parameter(Parameter &&) = default;
382  Parameter(Parameter const &) = default;
383  Parameter &operator=(Parameter &&) = default;
384  Parameter &operator=(Parameter const &) = default;
385 
386  std::unique_ptr<AbstractParameter> to_heap() && override
387  {
388  return std::unique_ptr<AbstractParameter>(
389  new Parameter<Operation::CREATE_DATASET>(std::move(*this)));
390  }
391 
392  std::string name = "";
393  Extent extent = {};
394  Datatype dtype = Datatype::UNDEFINED;
395  std::string options = "{}";
396  std::optional<size_t> joinedDimension;
397 
398  template <typename TracingJSON>
399  TracingJSON compileJSONConfig(
400  Writable const *writable,
402  std::string const &backendName) const;
403 };
404 
405 template <>
406 struct OPENPMDAPI_EXPORT
407  Parameter<Operation::EXTEND_DATASET> : public AbstractParameter
408 {
409  Parameter(Extent e) : joinedDimension(Dataset::joinedDimension(e))
410  {
411  this->extent = std::move(e);
412  }
413 
414  // default constructor, but callsites need to explicitly acknowledge that
415  // joined dimensions will not be automatically configured when using it
417  {}
418  Parameter(Parameter &&) = default;
419  Parameter(Parameter const &) = default;
420  Parameter &operator=(Parameter &&) = default;
421  Parameter &operator=(Parameter const &) = default;
422 
423  std::unique_ptr<AbstractParameter> to_heap() && override
424  {
425  return std::unique_ptr<AbstractParameter>(
426  new Parameter<Operation::EXTEND_DATASET>(std::move(*this)));
427  }
428 
429  Extent extent = {};
430  std::optional<size_t> joinedDimension;
431 };
432 
433 template <>
434 struct OPENPMDAPI_EXPORT
435  Parameter<Operation::OPEN_DATASET> : public AbstractParameter
436 {
437  Parameter() = default;
438  Parameter(Parameter &&) = default;
439  Parameter(Parameter const &) = default;
440  Parameter &operator=(Parameter &&) = default;
441  Parameter &operator=(Parameter const &) = default;
442 
443  std::unique_ptr<AbstractParameter> to_heap() && override
444  {
445  return std::unique_ptr<AbstractParameter>(
446  new Parameter<Operation::OPEN_DATASET>(std::move(*this)));
447  }
448 
449  template <typename TracingJSON>
450  static TracingJSON compileJSONConfig(
451  Writable const *writable,
453  std::string const &backendName);
454 
455  std::string name = "";
456  std::shared_ptr<Datatype> dtype = std::make_shared<Datatype>();
457  std::shared_ptr<Extent> extent = std::make_shared<Extent>();
458 };
459 
460 template <>
461 struct OPENPMDAPI_EXPORT
462  Parameter<Operation::DELETE_DATASET> : public AbstractParameter
463 {
464  Parameter() = default;
465  Parameter(Parameter &&) = default;
466  Parameter(Parameter const &) = default;
467  Parameter &operator=(Parameter &&) = default;
468  Parameter &operator=(Parameter const &) = default;
469 
470  std::unique_ptr<AbstractParameter> to_heap() && override
471  {
472  return std::unique_ptr<AbstractParameter>(
473  new Parameter<Operation::DELETE_DATASET>(std::move(*this)));
474  }
475 
476  std::string name = "";
477 };
478 
479 template <>
480 struct OPENPMDAPI_EXPORT
481  Parameter<Operation::WRITE_DATASET> : public AbstractParameter
482 {
483  Parameter() = default;
484 
485  Parameter(Parameter &&) = default;
486  Parameter(Parameter const &) = delete;
487  Parameter &operator=(Parameter &&) = default;
488  Parameter &operator=(Parameter const &) = delete;
489 
490  std::unique_ptr<AbstractParameter> to_heap() && override
491  {
492  return std::unique_ptr<AbstractParameter>(
493  new Parameter<Operation::WRITE_DATASET>(std::move(*this)));
494  }
495 
496  Extent extent = {};
497  Offset offset = {};
498  Datatype dtype = Datatype::UNDEFINED;
500 };
501 
502 template <>
503 struct OPENPMDAPI_EXPORT
504  Parameter<Operation::READ_DATASET> : public AbstractParameter
505 {
506  Parameter() = default;
507  Parameter(Parameter &&) = default;
508  Parameter(Parameter const &) = default;
509  Parameter &operator=(Parameter &&) = default;
510  Parameter &operator=(Parameter const &) = default;
511 
512  std::unique_ptr<AbstractParameter> to_heap() && override
513  {
514  return std::unique_ptr<AbstractParameter>(
515  new Parameter<Operation::READ_DATASET>(std::move(*this)));
516  }
517 
518  Extent extent = {};
519  Offset offset = {};
520  Datatype dtype = Datatype::UNDEFINED;
521  std::shared_ptr<void> data = nullptr;
522 };
523 
524 template <>
525 struct OPENPMDAPI_EXPORT
526  Parameter<Operation::LIST_DATASETS> : public AbstractParameter
527 {
528  Parameter() = default;
529  Parameter(Parameter &&) = default;
530  Parameter(Parameter const &) = default;
531  Parameter &operator=(Parameter &&) = default;
532  Parameter &operator=(Parameter const &) = default;
533 
534  std::unique_ptr<AbstractParameter> to_heap() && override
535  {
536  return std::unique_ptr<AbstractParameter>(
537  new Parameter<Operation::LIST_DATASETS>(std::move(*this)));
538  }
539 
540  std::shared_ptr<std::vector<std::string>> datasets =
541  std::make_shared<std::vector<std::string>>();
542 };
543 
544 template <>
545 struct OPENPMDAPI_EXPORT
546  Parameter<Operation::GET_BUFFER_VIEW> : public AbstractParameter
547 {
548  Parameter() = default;
549  Parameter(Parameter &&) = default;
550  Parameter(Parameter const &) = default;
551  Parameter &operator=(Parameter &&) = default;
552  Parameter &operator=(Parameter const &) = default;
553 
554  std::unique_ptr<AbstractParameter> to_heap() && override
555  {
556  return std::unique_ptr<AbstractParameter>(
557  new Parameter<Operation::GET_BUFFER_VIEW>(std::move(*this)));
558  }
559 
560  // in parameters
561  Offset offset;
562  Extent extent;
563  Datatype dtype = Datatype::UNDEFINED;
564  bool update = false;
565  // out parameters
566  struct OutParameters
567  {
568  bool backendManagedBuffer = false;
569  unsigned viewIndex = 0;
570  void *ptr = nullptr;
571  };
572  std::shared_ptr<OutParameters> out = std::make_shared<OutParameters>();
573 };
574 
575 template <>
576 struct OPENPMDAPI_EXPORT
577  Parameter<Operation::DELETE_ATT> : public AbstractParameter
578 {
579  Parameter() = default;
580  Parameter(Parameter &&) = default;
581  Parameter(Parameter const &) = default;
582  Parameter &operator=(Parameter &&) = default;
583  Parameter &operator=(Parameter const &) = default;
584 
585  std::unique_ptr<AbstractParameter> to_heap() && override
586  {
587  return std::unique_ptr<AbstractParameter>(
588  new Parameter<Operation::DELETE_ATT>(std::move(*this)));
589  }
590 
591  std::string name = "";
592 };
593 
594 template <>
595 struct OPENPMDAPI_EXPORT
596  Parameter<Operation::WRITE_ATT> : public AbstractParameter
597 {
598  Parameter() = default;
599  Parameter(Parameter &&) = default;
600  Parameter(Parameter const &) = default;
601  Parameter &operator=(Parameter &&) = default;
602  Parameter &operator=(Parameter const &) = default;
603 
604  std::unique_ptr<AbstractParameter> to_heap() && override
605  {
606  return std::unique_ptr<AbstractParameter>(
607  new Parameter<Operation::WRITE_ATT>(std::move(*this)));
608  }
609 
610  std::string name = "";
611  Datatype dtype = Datatype::UNDEFINED;
612  /*
613  * If true, this attribute changes across IO steps.
614  * It should only be written in backends that support IO steps,
615  * otherwise writing should be skipped.
616  * The frontend is responsible for handling both situations.
617  */
618  enum class ChangesOverSteps
619  {
620  No,
621  Yes,
622  IfPossible
623  };
624  ChangesOverSteps changesOverSteps = ChangesOverSteps::No;
625  // attribute_types
626  std::any m_resource;
627  template <typename T>
628  void setResource(T val);
629  template <typename variant_t>
630  variant_t const &resource() const;
631 };
632 
633 template <>
634 struct OPENPMDAPI_EXPORT
635  Parameter<Operation::READ_ATT> : public AbstractParameter
636 {
637  Parameter() = default;
638  Parameter(Parameter &&) = default;
639  Parameter(Parameter const &) = default;
640  Parameter &operator=(Parameter &&) = default;
641  Parameter &operator=(Parameter const &) = default;
642 
643  std::unique_ptr<AbstractParameter> to_heap() && override
644  {
645  return std::unique_ptr<AbstractParameter>(
646  new Parameter<Operation::READ_ATT>(std::move(*this)));
647  }
648 
649  std::string name = "";
650  std::shared_ptr<Datatype> dtype = std::make_shared<Datatype>();
651 
652  // attribute_types
653  std::shared_ptr<std::any> m_resource = std::make_shared<std::any>();
654  template <typename variant_t>
655  variant_t const &resource() const;
656  template <typename T>
657  void setResource(T val);
658 };
659 
660 template <>
661 struct OPENPMDAPI_EXPORT
662  Parameter<Operation::READ_ATT_ALLSTEPS> : public AbstractParameter
663 {
664  Parameter() = default;
665  Parameter(Parameter &&) = default;
666  Parameter(Parameter const &) = default;
667  Parameter &operator=(Parameter &&) = default;
668  Parameter &operator=(Parameter const &) = default;
669 
670  std::unique_ptr<AbstractParameter> to_heap() && override
671  {
672  return std::unique_ptr<AbstractParameter>(
673  new Parameter<Operation::READ_ATT_ALLSTEPS>(std::move(*this)));
674  }
675 
676  std::string name = "";
677  std::shared_ptr<Datatype> dtype = std::make_shared<Datatype>();
678 
679  // vector_of_attributes_type
680  std::shared_ptr<std::any> m_resource = std::make_shared<std::any>();
681  template <typename variant_t>
682  variant_t const &resource() const;
683  template <typename variant_t>
684  variant_t &resource();
685  template <typename T>
686  void setResource(std::vector<T> val);
687 };
688 
689 template <>
690 struct OPENPMDAPI_EXPORT
691  Parameter<Operation::LIST_ATTS> : public AbstractParameter
692 {
693  Parameter() = default;
694  Parameter(Parameter &&) = default;
695  Parameter(Parameter const &) = default;
696  Parameter &operator=(Parameter &&) = default;
697  Parameter &operator=(Parameter const &) = default;
698 
699  std::unique_ptr<AbstractParameter> to_heap() && override
700  {
701  return std::unique_ptr<AbstractParameter>(
702  new Parameter<Operation::LIST_ATTS>(std::move(*this)));
703  }
704 
705  std::shared_ptr<std::vector<std::string>> attributes =
706  std::make_shared<std::vector<std::string>>();
707 };
708 
709 template <>
710 struct OPENPMDAPI_EXPORT
711  Parameter<Operation::ADVANCE> : public AbstractParameter
712 {
713  Parameter() = default;
714  Parameter(Parameter &&) = default;
715  Parameter(Parameter const &) = default;
716  Parameter &operator=(Parameter &&) = default;
717  Parameter &operator=(Parameter const &) = default;
718 
719  std::unique_ptr<AbstractParameter> to_heap() && override
720  {
721  return std::unique_ptr<AbstractParameter>(
722  new Parameter<Operation::ADVANCE>(std::move(*this)));
723  }
724 
725  struct StepSelection
726  {
727  std::optional<size_t> step;
728  };
729 
730  // input parameters
739  std::variant<AdvanceMode, StepSelection> mode;
740  bool isThisStepMandatory = false;
741  // output parameter
742  std::shared_ptr<AdvanceStatus> status =
743  std::make_shared<AdvanceStatus>(AdvanceStatus::OK);
744 };
745 
746 template <>
747 struct OPENPMDAPI_EXPORT
748  Parameter<Operation::AVAILABLE_CHUNKS> : public AbstractParameter
749 {
750  Parameter() = default;
751  Parameter(Parameter &&) = default;
752  Parameter(Parameter const &) = default;
753  Parameter &operator=(Parameter &&) = default;
754  Parameter &operator=(Parameter const &) = default;
755 
756  std::unique_ptr<AbstractParameter> to_heap() && override
757  {
758  return std::unique_ptr<AbstractParameter>(
759  new Parameter<Operation::AVAILABLE_CHUNKS>(std::move(*this)));
760  }
761 
762  // output parameter
763  std::shared_ptr<ChunkTable> chunks = std::make_shared<ChunkTable>();
764 };
765 
766 template <>
767 struct OPENPMDAPI_EXPORT
768  Parameter<Operation::DEREGISTER> : public AbstractParameter
769 {
770  Parameter(void const *ptr_in) : former_parent(ptr_in)
771  {}
772 
773  Parameter(Parameter const &) = default;
774  Parameter(Parameter &&) = default;
775 
776  Parameter &operator=(Parameter const &) = default;
777  Parameter &operator=(Parameter &&) = default;
778 
779  std::unique_ptr<AbstractParameter> to_heap() && override
780  {
781  return std::make_unique<Parameter<Operation::DEREGISTER>>(
782  std::move(*this));
783  }
784 
785  // Just for verbose logging.
786  void const *former_parent = nullptr;
787 };
788 
789 template <>
790 struct OPENPMDAPI_EXPORT Parameter<Operation::TOUCH> : public AbstractParameter
791 {
792  explicit Parameter() = default;
793 
794  Parameter(Parameter const &) = default;
795  Parameter(Parameter &&) = default;
796 
797  Parameter &operator=(Parameter const &) = default;
798  Parameter &operator=(Parameter &&) = default;
799 
800  std::unique_ptr<AbstractParameter> to_heap() && override
801  {
802  return std::make_unique<Parameter<Operation::TOUCH>>(std::move(*this));
803  }
804 };
805 
806 template <>
807 struct OPENPMDAPI_EXPORT
808  Parameter<Operation::SET_WRITTEN> : public AbstractParameter
809 {
810  explicit Parameter() = default;
811 
812  Parameter(Parameter const &) = default;
813  Parameter(Parameter &&) = default;
814 
815  Parameter &operator=(Parameter const &) = default;
816  Parameter &operator=(Parameter &&) = default;
817 
818  std::unique_ptr<AbstractParameter> to_heap() && override
819  {
820  return std::make_unique<Parameter<Operation::SET_WRITTEN>>(
821  std::move(*this));
822  }
823 
824  bool target_status = false;
825 };
826 
835 class OPENPMDAPI_EXPORT IOTask
836 {
837 public:
846  template <Operation op>
847  explicit IOTask(Writable *w, Parameter<op> p)
848  : writable{w}, operation{op}, parameter{std::move(p).to_heap()}
849  {}
850 
851  template <Operation op>
852  explicit IOTask(Attributable *a, Parameter<op> p)
853  : writable{getWritable(a)}
854  , operation{op}
855  , parameter{std::move(p).to_heap()}
856  {}
857 
858  IOTask(IOTask const &other);
859  IOTask(IOTask &&other) noexcept;
860  IOTask &operator=(IOTask const &other);
861  IOTask &operator=(IOTask &&other) noexcept;
862 
863  Writable *writable;
864  Operation operation;
865  std::shared_ptr<AbstractParameter> parameter;
866 }; // IOTask
867 } // namespace openPMD
Layer to manage storage of attributes associated with file objects.
Definition: Attributable.hpp:222
Definition: Dataset.hpp:38
std::string options
backend-dependent JSON configuration
Definition: Dataset.hpp:96
Self-contained description of a single IO operation.
Definition: IOTask.hpp:836
IOTask(Writable *w, Parameter< op > p)
Constructor for self-contained description of single IO operation.
Definition: IOTask.hpp:847
Layer to mirror structure of logical data and persistent data in file.
Definition: Writable.hpp:76
Class to handle default and dataset-specific JSON configurations.
Definition: JSONMatcher.hpp:89
Public definitions of openPMD-api.
Definition: Date.cpp:29
@ OK
stream goes on
Datatype
Concrete datatype of an object available at runtime.
Definition: Datatype.hpp:51
OPENPMDAPI_EXPORT_ENUM_CLASS(Operation)
Type of IO operation between logical and persistent data.
Definition: IOTask.hpp:56
Definition: IOTask.hpp:102
static void warnUnusedParameters(TracingJSON &, std::string const &currentBackendName, std::string const &warningMessage)
Warn about unused JSON paramters.
std::variant< AdvanceMode, StepSelection > mode
AdvanceMode: Is one of BeginStep/EndStep.
Definition: IOTask.hpp:739
Typesafe description of all required arguments for a specified Operation.
Definition: IOTask.hpp:148
Definition: Memory.hpp:48