openPMD-api
 
Loading...
Searching...
No Matches
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
43namespace openPMD
44{
45class Attributable;
46class Writable;
47namespace json
48{
49 class JsonMatcher;
50}
51
52Writable *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
92namespace 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
101struct 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>
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
125 I_dont_want_to_use_joined_dimensions{};
126
127protected:
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;
134 AbstractParameter &operator=(AbstractParameter &&) = default;
135};
136
146template <Operation>
147struct OPENPMDAPI_EXPORT Parameter : public AbstractParameter
148{
149 Parameter() = delete;
150 Parameter(Parameter const &) = delete;
151 Parameter(Parameter &&) = delete;
152};
153
154template <>
155struct 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
173template <>
174struct 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
200template <>
201struct 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
236template <>
237struct 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
253template <>
254struct 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
272template <>
273struct 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
291template <>
292struct 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
308template <>
309struct 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
327template <>
328struct 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
346template <>
347struct 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
366template <>
367struct 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
405template <>
406struct 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
433template <>
434struct 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
460template <>
461struct 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
479template <>
480struct 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
502template <>
503struct 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
524template <>
525struct 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
544template <>
545struct 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
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
575template <>
576struct 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
594template <>
595struct 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
633template <>
634struct 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
660template <>
661struct 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
689template <>
690struct 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
709template <>
710struct 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
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
746template <>
747struct 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
766template <>
767struct 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
789template <>
790struct 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
806template <>
807struct 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
835class OPENPMDAPI_EXPORT IOTask
836{
837public:
846 template <Operation op>
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
Definition Streaming.hpp:33
@ T
time
Definition UnitDimension.hpp:41
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
STL namespace.
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