Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
147 commits
Select commit Hold shift + click to select a range
ead1538
Base structure for scientific defaults
franzpoeschel Jan 12, 2026
b47a523
Start adding defaults
franzpoeschel Jan 12, 2026
466fd6b
debugging output
franzpoeschel Jan 12, 2026
b40f72d
Fixes
franzpoeschel Jan 12, 2026
4455407
BaseRecord --> unitDimension
franzpoeschel Jan 12, 2026
6b7c067
nunja hehe
franzpoeschel Jan 12, 2026
f109fe4
Fixes
franzpoeschel Jan 12, 2026
af02f70
Further fixes
franzpoeschel Jan 13, 2026
4a6f59f
further fixes
franzpoeschel Jan 13, 2026
c324adb
tests temporarily passing :D
franzpoeschel Jan 13, 2026
5a5bb23
Cleanup
franzpoeschel Jan 13, 2026
1ab164d
UnitDimension for position/positionOffset
franzpoeschel Jan 13, 2026
78d3fe8
WIP: RecordComponent stuff
franzpoeschel Jan 13, 2026
4f0fab2
Fix coretests
franzpoeschel Jan 14, 2026
9bbf9bb
Clean up Iteration finalizing logic
franzpoeschel Jan 14, 2026
500b180
Add defaults for Iteration class
franzpoeschel Jan 14, 2026
a1ce9c6
Fix variadic template template parameters
franzpoeschel Jan 15, 2026
07900f3
Remove flush-time check for populized components
franzpoeschel Jan 16, 2026
7cac3f6
Make the default specification more flexible
franzpoeschel Jan 16, 2026
0c75d70
WIP
franzpoeschel Jan 20, 2026
bca7adf
continue
franzpoeschel Jan 20, 2026
7475bb9
Split this into internal and public header
franzpoeschel Jan 21, 2026
1672e7d
Distinguish writing from reading
franzpoeschel Jan 21, 2026
c355532
Tests now working again
franzpoeschel Jan 21, 2026
de4c6e5
Mostly move Mesh reading to ScientificDefaults
franzpoeschel Jan 21, 2026
a90620c
Fix type conversions between char and string
franzpoeschel Jan 21, 2026
bea68bf
Somewhat working Mesh reading
franzpoeschel Jan 21, 2026
ae095e8
Fix little parent call bug
franzpoeschel Jan 22, 2026
f874f35
Mention expected datatypes in attribute reading error messages
franzpoeschel Jan 22, 2026
3e47cce
Move Iteration reading to ScientificDefaults class
franzpoeschel Jan 22, 2026
2030f7f
Introduce genericsetter, use for unitDimension
franzpoeschel Jan 22, 2026
edb658b
Record / BaseRecord Reading
franzpoeschel Jan 22, 2026
2413bad
Readers for everything now except version-dependent stuff
franzpoeschel Jan 22, 2026
cc659a9
Add gridUnitDimension in ScientificDefaults
franzpoeschel Jan 23, 2026
381c5b0
Do not use templates for defaults setter
franzpoeschel Jan 26, 2026
d2d0323
Wew NewAttributeReader
franzpoeschel Jan 27, 2026
1468650
Fixes
franzpoeschel Jan 27, 2026
31cc55f
Fixes
franzpoeschel Jan 27, 2026
f1e57bc
Defaults for patchRecord
franzpoeschel Jan 27, 2026
41fbd85
Adapt PatchRecordComponent
franzpoeschel Jan 27, 2026
70cd8fe
Fixes
franzpoeschel Jan 27, 2026
84d6670
Cleanup
franzpoeschel Jan 28, 2026
8ed1589
Cleanup
franzpoeschel Jan 28, 2026
7c92e50
Avoid overcomplex attribute type conversions
franzpoeschel Jan 28, 2026
0bf2125
reduce binary size a bit
franzpoeschel Jan 28, 2026
9318ec6
Try further reducing amount of lambdas...
franzpoeschel Jan 28, 2026
ed0903c
Annotate MB sizes
franzpoeschel Jan 28, 2026
7238096
Reduce implementation sizes for RequireScalar / RequireVector
franzpoeschel Jan 29, 2026
6088d4f
vibe-coded suggestions for size optimization
franzpoeschel Jan 29, 2026
3787df7
Avoid using lambdas for require_type
franzpoeschel Jan 29, 2026
e220218
Change code order
franzpoeschel Jan 29, 2026
f0a072c
Replace if constexpr with SFINAE
franzpoeschel Jan 30, 2026
271ff08
Fix nvhpc/msvc builds
franzpoeschel Jan 30, 2026
f6f7eca
doxygen fix
franzpoeschel Feb 2, 2026
99258a3
Cleanup
franzpoeschel Feb 4, 2026
82546ec
scientificdefaults_internal.cpp
franzpoeschel Feb 24, 2026
20ec8a0
Add visitor pattern
franzpoeschel Feb 24, 2026
cacc211
wip: ScientificDefaults without CRT
franzpoeschel Feb 24, 2026
f164cbd
Move defaults impl to classes
franzpoeschel Feb 24, 2026
5586297
Fix visitHierarchy
franzpoeschel Feb 24, 2026
94adc70
Fix visithierarchy
franzpoeschel Feb 24, 2026
7b83855
Compiles
franzpoeschel Feb 24, 2026
a85c082
Fix inheritance issue
franzpoeschel Feb 25, 2026
d5c3af5
Cleanup
franzpoeschel Mar 3, 2026
94701e6
Move files
franzpoeschel Mar 3, 2026
d414164
Split files
franzpoeschel Mar 3, 2026
26c1d90
Cleanup, documentation
franzpoeschel Mar 3, 2026
92a5908
Fix JSON backend bug when missing attributes
franzpoeschel Mar 3, 2026
97cf8e1
Fix bug with metadata set too late
franzpoeschel Mar 20, 2026
4434d70
Write defaults upon flush, thats good enough actually
franzpoeschel Mar 25, 2026
7b92e74
... wip visitor without templates ...
franzpoeschel Mar 20, 2026
cb39019
somewhat compiles
franzpoeschel Mar 20, 2026
74f37cc
Clean up visitHierarchy API
franzpoeschel Mar 20, 2026
97cf733
Further cleanup
franzpoeschel Mar 20, 2026
fa9e501
Implement lambda visitor in terms of explicit visitor
franzpoeschel Mar 20, 2026
3a30d96
Fix Python bindings
franzpoeschel Mar 20, 2026
3318fa9
populateDefaultMetadata -> commitStructuralSetup
franzpoeschel Mar 25, 2026
acb4568
Cleanup
franzpoeschel Mar 25, 2026
3e9502c
Documentation
franzpoeschel Mar 25, 2026
11267e4
Postfix traversal, document visitHierarchy
franzpoeschel Mar 25, 2026
e40cfc2
commitStructuralSetup --> populateMissingMetadata(bool recursive)
franzpoeschel Apr 7, 2026
0a763ef
CI fixes
franzpoeschel Apr 8, 2026
6e3af81
Default values only upon ::close
franzpoeschel Apr 14, 2026
fee2db1
Documentation and cleanup
franzpoeschel Apr 28, 2026
54c2a15
Review fixes
franzpoeschel Apr 29, 2026
711bdc0
Review fixes
franzpoeschel Apr 29, 2026
ed7e1b5
Fix dirty handling
franzpoeschel Apr 29, 2026
367219d
Fix forward declaration
franzpoeschel Apr 29, 2026
790357a
Fix dirty handling
franzpoeschel Apr 30, 2026
c7299f5
Review fixes
franzpoeschel May 12, 2026
6370611
Flush structural info of resetDataset() to backend immediately
franzpoeschel Mar 11, 2026
0456523
Erase flushMeshes/ParticlesPath
franzpoeschel Mar 11, 2026
2207b9d
Move flushing from storeChunk to resetDataset
franzpoeschel Mar 11, 2026
0ee0b9b
Hmm, move CREATE_DATASET task back to storeChunk
franzpoeschel Mar 12, 2026
730a5d9
Fix attribute flushing logic
franzpoeschel Mar 12, 2026
60776e7
flush mode helpers
franzpoeschel Jan 14, 2026
880df2e
Fix dirty handling
franzpoeschel Jan 14, 2026
25bbcb4
Add TODO comment
franzpoeschel Mar 12, 2026
9993cb8
WIP Runtime verification of flush level
franzpoeschel Mar 12, 2026
69101ee
dont flush to IO handler yet in resetDataset
franzpoeschel Mar 13, 2026
8d60acb
Revert "dont flush to IO handler yet in resetDataset"
franzpoeschel Mar 13, 2026
250c775
Continue fixing and breaking things..
franzpoeschel Mar 13, 2026
8e8c8ed
Fix API call after rebase
franzpoeschel Mar 16, 2026
aa5f0de
Fix dirty handling filebased
franzpoeschel Mar 16, 2026
e3726d2
TMP REVERT ME: deactivate span table tests
franzpoeschel Mar 16, 2026
5c7f010
TMP REVERT ME take out hanging parallel test
franzpoeschel Mar 16, 2026
d305103
Fix ranktable logic
franzpoeschel Mar 27, 2026
5a9c8ef
Take out the next hanging parallel test
franzpoeschel Mar 27, 2026
cb18cac
Separate MPI tests by MPI barriers
franzpoeschel Mar 27, 2026
88b69d2
Fix wrong MPI_COMM_WORLD
franzpoeschel Mar 27, 2026
c159a28
wip: debugging state
franzpoeschel Mar 27, 2026
b9d3fe1
deactivate malicious tests
franzpoeschel Mar 30, 2026
0c9ff64
Revert "deactivate malicious tests"
franzpoeschel Mar 30, 2026
e444012
Revert "wip: debugging state"
franzpoeschel Mar 30, 2026
cbb465c
Revert "TMP REVERT ME take out hanging parallel test"
franzpoeschel Mar 30, 2026
73d6e84
Revert some WIPs
franzpoeschel Mar 30, 2026
cf6f5bb
Use an Attributable per Iteration for rankTable in filebased encoding
franzpoeschel May 19, 2026
9701449
fix nompi builds
franzpoeschel May 20, 2026
5e5b25b
CI fixes
franzpoeschel May 20, 2026
239f731
Keep a list of children per Attributable
franzpoeschel Apr 30, 2026
9504dcd
Steal CustomHierarchy.hpp from old branch
franzpoeschel May 5, 2026
90e1174
Add DeferredInitPolicy
franzpoeschel May 6, 2026
479404a
Derive CustomHierarchy from Container<CustomHierarchy>
franzpoeschel May 6, 2026
ca736f7
Untested: reopening as custom hierarchy might work now
franzpoeschel May 6, 2026
db41e01
little test
franzpoeschel May 6, 2026
a4dfd74
Emplace custom classes into backend hierarchy
franzpoeschel May 6, 2026
e7c381f
wip: reading
franzpoeschel May 7, 2026
cefca9b
Seem like CustomHierarchy::read() is now somewhat working lmao
franzpoeschel May 7, 2026
a082073
Sync state more carefully
franzpoeschel May 8, 2026
8c5cd6a
Recursive reading
franzpoeschel May 8, 2026
9f51ed5
TODO comments
franzpoeschel May 8, 2026
c9fb781
object storage for custom hierarchies
franzpoeschel May 11, 2026
bef672b
Fix object storage
franzpoeschel May 11, 2026
7bd28ed
Add preferCurrentBackpointer
franzpoeschel May 11, 2026
83393ac
TMP: example changes
franzpoeschel May 11, 2026
2a24475
WIP customHierarchyFlush
franzpoeschel May 11, 2026
1567392
Guard against unset meshes/particles path
franzpoeschel May 12, 2026
66d45bb
Fix custom hierarchy flushing
franzpoeschel May 18, 2026
429da2a
Cleanup
franzpoeschel May 18, 2026
5f14b95
Rename
franzpoeschel May 18, 2026
9c4d7f7
Add custom hierarchy flush at series level
franzpoeschel May 18, 2026
b075748
Rudimentary test, to be extended
franzpoeschel May 18, 2026
d2bd48d
Fix ADIOS2 path creation relative to /
franzpoeschel May 18, 2026
e8cb31c
Reading test
franzpoeschel May 18, 2026
d9cd9b5
Add more CustomHierarchyFlush operations
franzpoeschel May 18, 2026
96307f3
Add series.iterations to test
franzpoeschel May 18, 2026
233aab3
explain that nonsense lmao
franzpoeschel May 20, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -394,6 +394,7 @@ include(${openPMD_SOURCE_DIR}/cmake/dependencies/pybind11.cmake)
set(CORE_SOURCE
src/config.cpp
src/ChunkInfo.cpp
src/CustomHierarchy.cpp
src/Dataset.cpp
src/Datatype.cpp
src/Error.cpp
Expand Down Expand Up @@ -426,6 +427,11 @@ set(CORE_SOURCE
src/backend/PatchRecord.cpp
src/backend/PatchRecordComponent.cpp
src/backend/Writable.cpp
src/backend/scientific_defaults/ScientificDefaults.cpp
src/backend/scientific_defaults/ScientificDefaults_auxiliary.cpp
src/backend/scientific_defaults/ProcessParsedAttribute.cpp
src/backend/scientific_defaults/AttributeReader.cpp
src/backend/scientific_defaults/ConfigAttribute.cpp
src/auxiliary/OneDimensionalBlockSlicer.cpp
src/helper/list_series.cpp
src/snapshots/ContainerImpls.cpp
Expand Down Expand Up @@ -827,6 +833,7 @@ if(openPMD_BUILD_TESTING)
list(APPEND ${out_list}
test/Files_Core/automatic_variable_encoding.cpp
test/Files_Core/read_nonexistent_attribute.cpp
test/Files_Core/custom_hierarchy.cpp
)
endif()
endmacro()
Expand Down
2 changes: 2 additions & 0 deletions examples/10_streaming_write.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,8 @@ int main()
pos.resetDataset(dataset);
pos.storeChunk(local_data, Offset{0}, global_extent);
}
auto ch = iteration.customHierarchies();
ch["rabimmel"].setAttribute("rabammel", "rabumm");
iteration.close();
}

Expand Down
18 changes: 17 additions & 1 deletion examples/2_read_serial.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ using namespace openPMD;
int main()
{
Series series = Series(
"../samples/git-sample/data%T.h5",
// "../samples/git-sample/data%T.h5",
"data.h5",
Access::READ_ONLY,
R"({"defer_iteration_parsing": true})");
cout << "Read a Series with openPMD standard version " << series.openPMD()
Expand Down Expand Up @@ -99,9 +100,24 @@ int main()

auto all_data = E_x.loadChunk<double>();

auto ch = series.customHierarchies();
ch.printRecursively();
std::cout << "READING 200/fields" << std::endl;
ch["data"]["200"]["fields"].read();
std::cout << "READING 200/particles" << std::endl;
ch["data"]["200"]["particles"].read();
std::cout << "READING 300" << std::endl;
ch["data"]["300"].read(0);
ch.printRecursively();

// The iteration can be closed in order to help free up resources.
// The iteration's content will be flushed automatically.
i.close();
std::cout << "OPENING 200" << std::endl;
i = series.snapshots()[200].open();
ch.printRecursively();
series.snapshots()[300].open();

cout << "Full E/x starts with:\n\t{";
for (size_t col = 0; col < extent[1] && col < 5; ++col)
cout << all_data.get()[col] << ", ";
Expand Down
206 changes: 206 additions & 0 deletions include/openPMD/CustomHierarchy.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,206 @@
/* Copyright 2023 Franz Poeschel
*
* This file is part of openPMD-api.
*
* openPMD-api is free software: you can redistribute it and/or modify
* it under the terms of of either the GNU General Public License or
* the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* openPMD-api is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License and the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU General Public License
* and the GNU Lesser General Public License along with openPMD-api.
* If not, see <http://www.gnu.org/licenses/>.
*/
#pragma once

#include "openPMD/IO/AbstractIOHandler.hpp"
#include "openPMD/Mesh.hpp"
#include "openPMD/ParticleSpecies.hpp"
#include "openPMD/RecordComponent.hpp"
#include "openPMD/backend/Attributable.hpp"
#include "openPMD/backend/Container.hpp"

#include <stdexcept>
#include <string>
#include <type_traits>
#include <vector>

namespace openPMD
{
class CustomHierarchy;
namespace internal
{
using CustomHierarchyData = ContainerData<Attributable>;
} // namespace internal

class CustomHierarchy;

/*
* This is its own class, so the return value of asContainerOf() is also
* convsersible again.
*/
template <typename MappedType>
class ConvertibleContainer : public Container<MappedType>
{
template <typename>
friend class ConversibleContainer;
friend class CustomHierarchy;

protected:
using Container_t = Container<MappedType>;
using Data_t = internal::ContainerData<MappedType>;
static_assert(
std::is_base_of_v<typename Container_t::ContainerData, Data_t>);

using Container_t::Container_t;

private:
explicit ConvertibleContainer() = default;

public:
template <typename TargetType>
auto asContainerOf() -> ConvertibleContainer<TargetType>
{
if constexpr (
std::is_same_v<TargetType, CustomHierarchy> ||
std::is_same_v<TargetType, Mesh> ||
std::is_same_v<TargetType, ParticleSpecies> ||
std::is_same_v<TargetType, RecordComponent>)
{
// TODO: If Mesh or ParticleSpecies, create Container on the fly by
// evaluating the meshes/particles path. If RecordComponent, maybe
// use dynamic casting to check if children are datasets?
throw std::runtime_error("UNIMPLEMENTED");
}
else
{
static_assert(
auxiliary::dependent_false_v<TargetType>,
"[CustomHierarchy::asContainerOf] Type parameter must be "
"one of: CustomHierarchy, RecordComponent, Mesh, "
"ParticleSpecies.");
}
}
};

namespace traits
{
template <>
struct DeferredInitPolicy<Container<CustomHierarchy>>
{
template <typename Container_const_or_not>
static void call(Container_const_or_not &);
};

template <>
struct GenerationPolicy<CustomHierarchy>
{
constexpr static bool is_noop = false;
template <typename Container, typename Iterator>
void operator()(Container &cont, Iterator &it)
{
auto &writable = it->second.writable();

// These should be different
auto child_shared_data = &it->second.Attributable::get();
auto parent_shared_data = &cont.Attributable::get();
if (child_shared_data == parent_shared_data)
{
throw std::runtime_error(
"Trying to emplace object as its own child");
}

// These might be different, but might also be the same
//
// For an explanation, ref. the documentation of
// Writable::attributable: This is a pointer back to the first
// created Attributable instance linking this Writable. There might
// be multiple Attributable objects linking the same backend
// Writable object when opening multiple "views" on the same backend
// object, e.g. when a scalar Record is at the same time a
// RecordComponent, or when reopening an object as a
// CustomHierarchy.
//
// Since CustomHierarchy performs no memory management by default,
// we must ensure that the backpointer in Writable::attributable
// remains valid when the frontend instance pointed by
// Writable::attributable *is* the CustomHierarchy instance (happens
// when it is the first frontend object created for that backend
// object).
auto backpointer = writable.attributable;
auto emplaced_pointer = it->second.m_attri.get();
if (backpointer == emplaced_pointer)
{
(**cont.m_attri)
.m_children_managed_as_custom_hierarchy[it->first] =
it->second;
}
}
};
} // namespace traits

// TODO: Use Container<Attributable> internally, but otherwise override members
// such that we have:
//
// operator[](key) -> CustomHierarchy
//
// Or find a better solution for having this automatically..
class CustomHierarchy : public ConvertibleContainer<CustomHierarchy>
{
friend class Iteration;
friend class Container<CustomHierarchy>;
friend class Attributable;
friend struct traits::DeferredInitPolicy<Container<CustomHierarchy>>;

private:
using Parent_t = ConvertibleContainer<CustomHierarchy>;
using Container_t = typename Parent_t::Container_t;
using Data_t = typename Parent_t::Data_t;

protected:
CustomHierarchy(NoInit);
CustomHierarchy(std::shared_ptr<internal::SharedAttributableData> other);
CustomHierarchy(Attributable const &other);

void read(std::vector<std::string> &currentPath);

void flush_internal(
internal::FlushParams const &, std::vector<std::string> currentPath);
void flush(std::string const &path, internal::FlushParams const &) override;

/**
* @brief Link with parent.
*
* @param w The Writable representing the parent.
*/
void linkHierarchy(Writable &w) override;

public:
CustomHierarchy();

CustomHierarchy(CustomHierarchy const &other) = default;
CustomHierarchy(CustomHierarchy &&other) = default;

CustomHierarchy &operator=(CustomHierarchy const &) = default;
CustomHierarchy &operator=(CustomHierarchy &&) = default;

// TODO maybe make this automatic somehow
// set max_recursion_depth = 0 for infinite cycling
// recursion depth includes the current object
// recursion will not continue expanding into regions that are already known
// (hence not transitively expand into unknown subregions of known regions)
void read(size_t max_recursion_depth = 1);

void printRecursively();

private:
void printRecursively(std::string indent);
};
} // namespace openPMD
62 changes: 62 additions & 0 deletions include/openPMD/IO/AbstractIOHandler.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include "openPMD/IterationEncoding.hpp"
#include "openPMD/config.hpp"
#include "openPMD/version.hpp"
#include <ostream>

#if openPMD_HAVE_MPI
#include <mpi.h>
Expand Down Expand Up @@ -81,6 +82,66 @@ enum class FlushLevel
CreateOrOpenFiles
};

std::ostream &operator<<(std::ostream &, FlushLevel);

namespace flush_level
{
inline constexpr auto global_flushpoint(FlushLevel fl)
{
switch (fl)
{
case FlushLevel::UserFlush:
return true;
case FlushLevel::InternalFlush:
case FlushLevel::SkeletonOnly:
case FlushLevel::CreateOrOpenFiles:
return false;
}
return false; // unreachable
}
// same as global_flushpoint for now, but we will soon introduce
// immediate_flush
inline constexpr auto write_datasets(FlushLevel fl)
{
switch (fl)
{
case FlushLevel::UserFlush:
return true;
case FlushLevel::InternalFlush:
case FlushLevel::SkeletonOnly:
case FlushLevel::CreateOrOpenFiles:
return false;
}
return false; // unreachable
}
inline constexpr auto write_attributes(FlushLevel fl)
{
switch (fl)
{
case FlushLevel::UserFlush:
case FlushLevel::InternalFlush:
return true;
case FlushLevel::SkeletonOnly:
case FlushLevel::CreateOrOpenFiles:
return false;
}
return false; // unreachable
}
inline constexpr auto flush_hierarchy(FlushLevel fl)
{
switch (fl)
{
case FlushLevel::UserFlush:
case FlushLevel::InternalFlush:
case FlushLevel::SkeletonOnly:
return true;
case FlushLevel::CreateOrOpenFiles:
return false;
}
return false; // unreachable
}
} // namespace flush_level

enum class OpenpmdStandard
{
v_1_0_0,
Expand Down Expand Up @@ -121,6 +182,7 @@ namespace internal
* To be used for reading
*/
FlushParams const defaultFlushParams{};
FlushParams const publicFlush{FlushLevel::UserFlush};

struct ParsedFlushParams;

Expand Down
2 changes: 1 addition & 1 deletion include/openPMD/IO/AbstractIOHandlerImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class AbstractIOHandlerImpl

virtual ~AbstractIOHandlerImpl() = default;

std::future<void> flush();
std::future<void> flush(FlushLevel);

/**
* Close the file corresponding with the writable and release file handles.
Expand Down
3 changes: 3 additions & 0 deletions include/openPMD/IO/IOTask.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include <cstddef>
#include <memory>
#include <optional>
#include <ostream>
#include <string>
#include <utility>
#include <variant>
Expand Down Expand Up @@ -89,6 +90,8 @@ OPENPMDAPI_EXPORT_ENUM_CLASS(Operation){
}; // note: if you change the enum members here, please update
// docs/source/dev/design.rst

std::ostream &operator<<(std::ostream &os, Operation op);

namespace internal
{
/*
Expand Down
2 changes: 1 addition & 1 deletion include/openPMD/IO/JSON/JSONIOHandlerImpl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,7 +241,7 @@ class JSONIOHandlerImpl : public AbstractIOHandlerImpl

void touch(Writable *, Parameter<Operation::TOUCH> const &) override;

std::future<void> flush();
std::future<void> flush(internal::ParsedFlushParams &params);

private:
#if openPMD_HAVE_MPI
Expand Down
Loading
Loading