18template<
typename Spacetree>
24template<
typename TGr
id>
37template<
typename TGr
id>
43 return &parent->subtrees[0];
47 return node->getNextSibling();
53template<
typename TGr
id,
typename Derived,
typename TIterationOrder = NaturalOrder<TGr
id>>
77 auto *SELF = (Derived *)
this;
79 if (SELF->hasEmittedLast)
return false;
94 std::optional<Item>
next() {
95 auto *SELF = (Derived *)
this;
97 if (!SELF->hasNext())
return std::nullopt;
102 auto shouldRecurse = SELF->enter(SELF->cell);
103 if (shouldRecurse & (SELF->cell->subtrees !=
nullptr)) {
104 SELF->cell = SELF->iterationOrder.getFirst(SELF->cell);
112 SELF->exit(SELF->cell);
113 if (SELF->cell == SELF->iterationOrder.root) [[unlikely]] {
114 SELF->hasEmittedLast =
true;
117 }
else return std::nullopt;
119 auto *nextSibling = SELF->iterationOrder.getNext(SELF->cell);
121 SELF->cell = nextSibling;
124 SELF->cell = SELF->cell->parent;
134template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
141template<
typename Spacetree,
typename Derived,
typename TIterationOrder = NaturalOrder<Spacetree>>
168 if (!
next) [[unlikely]]
return std::nullopt;
169 if (
next->cell->subtrees)
continue;
175template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
182template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
185template<
typename Spacetree,
typename Derived,
typename TIterationOrder = NaturalOrder<Spacetree>>
195 auto *SELF = (Derived*)
this;
196 if (!SELF->boundary.sharesBoundary(spacetree->
range))
return false;
213 auto *SELF = (Derived*)
this;
217 if (!
next)
return std::nullopt;
218 if (!SELF->boundary.sharesBoundary(
next.value()->range))
continue;
224template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
230template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
233template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
236template<
typename Spacetree,
typename Derived,
typename TIterationOrder = NaturalOrder<Spacetree>>
246 auto *SELF = (Derived*)
this;
248 if (!SELF->region.overlaps(spacetree->
range))
return false;
261 auto *SELF = (Derived*)
this;
265 if (!
next) [[unlikely]]
return std::nullopt;
266 if (!SELF->region.overlaps(
next.value()->range)) [[unlikely]]
continue;
272template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
278template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
281template<
typename Spacetree,
typename Derived,
typename TIterationOrder = NaturalOrder<Spacetree>>
291 auto *SELF = (Derived*)
this;
293 if (SELF->region.contains(spacetree->
range))
return false;
306 auto *SELF = (Derived*)
this;
310 if (!
next)
return std::nullopt;
311 if (SELF->region.contains(
next.value()->range))
continue;
317template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
323template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
326template<
typename Spacetree,
int LEVEL = 4,
typename TIterationOrder = NaturalOrder<Spacetree>>
339 if (this->level <
LEVEL) {
359 if (!
next) [[unlikely]]
return std::nullopt;
360 if (this->level ==
LEVEL)
return next->cell;
361 if (
next->cell->subtrees)
continue;
367template<
typename Spacetree,
int LEVEL = 4,
typename TIterationOrder = NaturalOrder<Spacetree>>
370template<
typename Spacetree,
typename Derived,
typename TIterationOrder = NaturalOrder<Spacetree>>
397 if (!
next) [[unlikely]]
return std::nullopt;
403template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
410template<
typename Spacetree,
typename TIterationOrder = NaturalOrder<Spacetree>>
413template<
typename Spacetree,
int LEVEL = 4,
typename TIterationOrder = NaturalOrder<Spacetree>>
426 if (this->level <
LEVEL) {
446 if (!
next)
return std::nullopt;
452template<
typename Spacetree,
int LEVEL = 4,
typename TIterationOrder = NaturalOrder<Spacetree>>
455template<
typename InnerIterator>
467 std::optional<typename InnerIterator::Item>
next() {
468 this->spinLock.
lock();
469 auto next = this->iter->next();
bool enter(Spacetree *spacetree)
std::optional< Item > next()
bool exit(Spacetree *spacetree)
constexpr EventEmitFlag emitFlags()
bool exit(Spacetree *spacetree)
bool enter(Spacetree *spacetree)
constexpr EventEmitFlag emitFlags()
std::optional< Item > next()
BoundaryLeafsIteratorCRTP(Spacetree *top)
Spacetree::Geo::Region boundary
BoundaryLeafsIteratorCRTP(TIterationOrder order)
std::optional< Item > next()
BoundaryLeafsIteratorCRTP(Spacetree *top, Spacetree::Geo::Region boundary)
bool enter(Spacetree *spacetree)
BoundaryLeafsIteratorCRTP(TIterationOrder order, Spacetree::Geo::Region boundary)
DefaultIteratorCRTP()=default
DefaultIteratorCRTP(TIterationOrder order)
DefaultIteratorCRTP(Grid *top)
std::optional< Item > next()
constexpr EventEmitFlag emitFlags()
TIterationOrder iterationOrder
Spacetree::Geo::Region region
InsideRegionLeafsIteratorCRTP(Spacetree *top, Spacetree::Geo::Region region)
bool enter(Spacetree *spacetree)
std::optional< Item > next()
InsideRegionLeafsIteratorCRTP(TIterationOrder order, Spacetree::Geo::Region region)
constexpr EventEmitFlag emitFlags()
bool enter(Spacetree *spacetree)
std::optional< Item > next()
bool exit(Spacetree *spacetree)
std::optional< Item > next()
DefaultIteratorCRTP< Spacetree, Derived, TIterationOrder > Base
constexpr EventEmitFlag emitFlags()
bool enter(Spacetree *spacetree)
bool exit(Spacetree *spacetree)
Spacetree::Geo::Region region
bool enter(Spacetree *spacetree)
std::optional< Item > next()
OutsideRegionLeafsIteratorCRTP(TIterationOrder order, Spacetree::Geo::Region region)
OutsideRegionLeafsIteratorCRTP(Spacetree *top, Spacetree::Geo::Region region)
std::optional< typename InnerIterator::Item > next()
SpinlockedIterator()=default
SpinlockedIterator(InnerIterator *inner)
OutsideRegionLeafsIterator(Spacetree *, typename Spacetree::Geo::Region region) -> OutsideRegionLeafsIterator< Spacetree, TIterationOrder >
BottomUpIterator(Spacetree *) -> BottomUpIterator< Spacetree, TIterationOrder >
BottomUpLeafOrLevelIterator(Spacetree *) -> BottomUpLeafOrLevelIterator< Spacetree, LEVEL, TIterationOrder >
InsideRegionLeafsIterator(Spacetree *, typename Spacetree::Geo::Region region) -> InsideRegionLeafsIterator< Spacetree, TIterationOrder >
LeafOrLevelIterator(Spacetree *) -> LeafOrLevelIterator< Spacetree, LEVEL, TIterationOrder >
BoundaryLeafsIterator(Spacetree *) -> BoundaryLeafsIterator< Spacetree, TIterationOrder >
LeafsIterator(Spacetree *) -> LeafsIterator< Spacetree, TIterationOrder >
Grid * getFirst(Grid *parent)=delete
Grid * getNext(Grid *sibling)=delete
IterationOrder(Grid *top)
Grid * getFirst(Grid *parent)
Grid * getNext(Grid *node)