Skip to content

Commit 41d950a

Browse files
committed
Fix Attributable::containingIteration()
1 parent 957282c commit 41d950a

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

include/openPMD/backend/Attributable.hpp

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#pragma once
2222

2323
#include "openPMD/IO/AbstractIOHandler.hpp"
24+
#include "openPMD/IterationEncoding.hpp"
2425
#include "openPMD/ThrowError.hpp"
2526
#include "openPMD/auxiliary/OutOfRangeMsg.hpp"
2627
#include "openPMD/backend/Attribute.hpp"
@@ -398,10 +399,11 @@ OPENPMD_protected
398399
* Throws an error otherwise, e.g., for Series objects.
399400
* @{
400401
*/
401-
[[nodiscard]] auto containingIteration() const -> std::pair<
402-
std::optional<internal::IterationData const *>,
403-
internal::SeriesData const *>;
404-
auto containingIteration() -> std::
402+
[[nodiscard]] auto containingIteration(IterationEncoding ie) const
403+
-> std::pair<
404+
std::optional<internal::IterationData const *>,
405+
internal::SeriesData const *>;
406+
auto containingIteration(IterationEncoding ie) -> std::
405407
pair<std::optional<internal::IterationData *>, internal::SeriesData *>;
406408
/** @} */
407409

src/backend/Attributable.cpp

Lines changed: 16 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "openPMD/backend/Attributable.hpp"
2222
#include "openPMD/IO/AbstractIOHandler.hpp"
2323
#include "openPMD/Iteration.hpp"
24+
#include "openPMD/IterationEncoding.hpp"
2425
#include "openPMD/ParticleSpecies.hpp"
2526
#include "openPMD/RecordComponent.hpp"
2627
#include "openPMD/Series.hpp"
@@ -150,19 +151,19 @@ Series Attributable::retrieveSeries() const
150151
return findSeries->attributable->asInternalCopyOf<Series>();
151152
}
152153

153-
auto Attributable::containingIteration() const -> std::pair<
154+
auto Attributable::containingIteration(IterationEncoding ie) const -> std::pair<
154155
std::optional<internal::IterationData const *>,
155156
internal::SeriesData const *>
156157
{
157158
constexpr size_t search_queue_size = 3;
158-
Writable const *search_queue[search_queue_size]{nullptr};
159+
internal::AttributableData const *search_queue[search_queue_size]{nullptr};
159160
size_t search_queue_idx = 0;
160-
Writable const *findSeries = &writable();
161+
internal::AttributableData const *findSeries = m_attri.get();
161162
while (true)
162163
{
163164
search_queue[search_queue_idx] = findSeries;
164165
// we don't need to push the last Writable since it's the Series anyway
165-
findSeries = findSeries->parent;
166+
findSeries = findSeries->frontend_parent;
166167
if (!findSeries)
167168
{
168169
break;
@@ -174,15 +175,21 @@ auto Attributable::containingIteration() const -> std::pair<
174175
}
175176
// End of the queue:
176177
// Iteration -> Series.iterations -> Series
178+
// in variable-based encoding, Iteration and Series.iterations is the same
179+
// thing, hence:
180+
// Iteration -> Series
181+
size_t distance_to_iteration =
182+
ie == IterationEncoding::variableBased ? 1 : 2;
177183
auto *series = &auxiliary::deref_dynamic_cast<internal::SeriesData const>(
178-
search_queue[search_queue_idx]->attributable);
184+
search_queue[search_queue_idx]);
179185
auto maybe_iteration = search_queue
180-
[(search_queue_idx + (search_queue_size - 2)) % search_queue_size];
186+
[(search_queue_idx + (search_queue_size - distance_to_iteration)) %
187+
search_queue_size];
181188
if (maybe_iteration)
182189
{
183190
auto *iteration =
184191
&auxiliary::deref_dynamic_cast<internal::IterationData const>(
185-
maybe_iteration->attributable);
192+
maybe_iteration);
186193
return std::make_pair(std::make_optional(iteration), series);
187194
}
188195
else
@@ -191,11 +198,11 @@ auto Attributable::containingIteration() const -> std::pair<
191198
}
192199
}
193200

194-
auto Attributable::containingIteration() -> std::
201+
auto Attributable::containingIteration(IterationEncoding ie) -> std::
195202
pair<std::optional<internal::IterationData *>, internal::SeriesData *>
196203
{
197204
auto const_res =
198-
static_cast<Attributable const *>(this)->containingIteration();
205+
static_cast<Attributable const *>(this)->containingIteration(ie);
199206
return std::make_pair(
200207
const_res.first.has_value()
201208
? std::make_optional(

src/backend/BaseRecordComponent.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ ChunkTable BaseRecordComponent::availableChunks()
9191
Offset offset(rc.m_dataset.value().extent.size(), 0);
9292
return ChunkTable{{std::move(offset), rc.m_dataset.value().extent}};
9393
}
94-
if (auto iteration_data = containingIteration().first;
94+
if (auto iteration_data =
95+
containingIteration(IOHandler()->m_encoding).first;
9596
iteration_data.has_value())
9697
{
9798
(*iteration_data)->asInternalCopyOf<Iteration>().open();

src/backend/Writable.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ void Writable::seriesFlush(internal::FlushParams const &flushParams)
6060
{
6161
Attributable impl;
6262
impl.setData({attributable, [](auto const *) {}});
63-
auto [iteration_internal, series_internal] = impl.containingIteration();
63+
auto [iteration_internal, series_internal] =
64+
impl.containingIteration(impl.IOHandler()->m_encoding);
6465
if (iteration_internal)
6566
{
6667
(*iteration_internal)->asInternalCopyOf<Iteration>().touch();

0 commit comments

Comments
 (0)