diff --git a/CMakeLists.txt b/CMakeLists.txt index dba77d38be..f741d524e7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -426,6 +426,7 @@ set(CORE_SOURCE src/backend/PatchRecord.cpp src/backend/PatchRecordComponent.cpp src/backend/Writable.cpp + src/backend/ScientificDefaults.cpp src/auxiliary/OneDimensionalBlockSlicer.cpp src/helper/list_series.cpp src/snapshots/ContainerImpls.cpp diff --git a/include/openPMD/Iteration.hpp b/include/openPMD/Iteration.hpp index c66199c46f..4aed643472 100644 --- a/include/openPMD/Iteration.hpp +++ b/include/openPMD/Iteration.hpp @@ -27,6 +27,7 @@ #include "openPMD/auxiliary/Variant.hpp" #include "openPMD/backend/Attributable.hpp" #include "openPMD/backend/Container.hpp" +#include "openPMD/backend/ScientificDefaults.hpp" #include #include @@ -142,7 +143,9 @@ namespace internal * @see * https://github.com/openPMD/openPMD-standard/blob/latest/STANDARD.md#required-attributes-for-the-basepath */ -class Iteration : public Attributable +class Iteration + : public Attributable + , internal::ScientificDefaults { template friend class Container; @@ -153,6 +156,7 @@ class Iteration : public Attributable friend class Writable; friend class StatefulIterator; friend class StatefulSnapshotsContainer; + friend class internal::ScientificDefaults; public: Iteration(Iteration const &) = default; diff --git a/include/openPMD/Mesh.hpp b/include/openPMD/Mesh.hpp index d0bf81ddef..4ff5d3749d 100644 --- a/include/openPMD/Mesh.hpp +++ b/include/openPMD/Mesh.hpp @@ -23,7 +23,9 @@ #include "openPMD/UnitDimension.hpp" #include "openPMD/backend/Attributable.hpp" #include "openPMD/backend/BaseRecord.hpp" +#include "openPMD/backend/Container.hpp" #include "openPMD/backend/MeshRecordComponent.hpp" +#include "openPMD/backend/ScientificDefaults.hpp" #include #include @@ -37,10 +39,14 @@ namespace openPMD * @see * https://github.com/openPMD/openPMD-standard/blob/latest/STANDARD.md#mesh-based-records */ -class Mesh : public BaseRecord +class Mesh + : public BaseRecord + , internal::ScientificDefaults { friend class Container; friend class Iteration; + template + friend class internal::ScientificDefaults; public: Mesh(Mesh const &) = default; @@ -328,8 +334,14 @@ class Mesh : public BaseRecord void flush_impl(std::string const &, internal::FlushParams const &) override; void read(); + auto retrieveDimensionality() const -> uint64_t; }; // Mesh +static_assert(internal::IsContainer_v); +static_assert(std::is_same_v< + Container, + internal::AsContainer_t>); + template inline std::vector Mesh::gridSpacing() const { diff --git a/include/openPMD/ParticleSpecies.hpp b/include/openPMD/ParticleSpecies.hpp index 4f309c0f2a..075d5bb8cd 100644 --- a/include/openPMD/ParticleSpecies.hpp +++ b/include/openPMD/ParticleSpecies.hpp @@ -24,19 +24,24 @@ #include "openPMD/Record.hpp" #include "openPMD/backend/Attributable.hpp" #include "openPMD/backend/Container.hpp" +#include "openPMD/backend/ScientificDefaults.hpp" #include namespace openPMD { -class ParticleSpecies : public Container +class ParticleSpecies + : public Container + , internal::ScientificDefaults { friend class Container; friend class Container; friend class Iteration; template friend T &internal::makeOwning(T &self, Series); + template + friend class internal::ScientificDefaults; public: ParticlePatches particlePatches; diff --git a/include/openPMD/Record.hpp b/include/openPMD/Record.hpp index 2bb070365f..618a246c83 100644 --- a/include/openPMD/Record.hpp +++ b/include/openPMD/Record.hpp @@ -23,17 +23,22 @@ #include "openPMD/RecordComponent.hpp" #include "openPMD/UnitDimension.hpp" #include "openPMD/backend/BaseRecord.hpp" +#include "openPMD/backend/ScientificDefaults.hpp" #include #include namespace openPMD { -class Record : public BaseRecord +class Record + : public BaseRecord + , internal::ScientificDefaults { friend class Container; friend class Iteration; friend class ParticleSpecies; + template + friend class internal::ScientificDefaults; public: Record(Record const &) = default; @@ -57,6 +62,8 @@ class Record : public BaseRecord [[nodiscard]] internal::HomogenizeExtents read(); }; // Record +static_assert(internal::HasScientificDefaults_v); + template inline T Record::timeOffset() const { diff --git a/include/openPMD/RecordComponent.hpp b/include/openPMD/RecordComponent.hpp index d06b4213f4..3d62d476c3 100644 --- a/include/openPMD/RecordComponent.hpp +++ b/include/openPMD/RecordComponent.hpp @@ -27,6 +27,7 @@ #include "openPMD/auxiliary/UniquePtr.hpp" #include "openPMD/backend/Attributable.hpp" #include "openPMD/backend/BaseRecordComponent.hpp" +#include "openPMD/backend/ScientificDefaults.hpp" // comment to prevent this include from being moved by clang-format #include "openPMD/DatatypeMacros.hpp" @@ -110,7 +111,9 @@ namespace internal template class BaseRecord; -class RecordComponent : public BaseRecordComponent +class RecordComponent + : public BaseRecordComponent + , internal::ScientificDefaults { template friend class Container; @@ -128,6 +131,8 @@ class RecordComponent : public BaseRecordComponent friend class MeshRecordComponent; template friend T &internal::makeOwning(T &self, Series); + template + friend class internal::ScientificDefaults; public: enum class Allocation diff --git a/include/openPMD/auxiliary/TypeTraits.hpp b/include/openPMD/auxiliary/TypeTraits.hpp index faf2b29472..150875d92e 100644 --- a/include/openPMD/auxiliary/TypeTraits.hpp +++ b/include/openPMD/auxiliary/TypeTraits.hpp @@ -203,6 +203,34 @@ namespace detail // little trick to avoid trailing commas in the macro expansions below template using variant_tail_t = std::variant; + + template