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 (
0 commit comments