79 public std::conditional_t<
81 IndexContainerComponent<
90 PointerContainerComponent<
101 using Base = std::conditional_t<
122 uint size()
const {
return Base::container().size(); }
127 return elemFromParent(elementIndex(
i));
129 return Base::container().at(
i);
135 return elemFromParent(elementIndex(
i));
137 return Base::container().at(
i);
143 return Base::container().at(
i);
145 return indexFromPointer(Base::container().at(
i));
148 Elem* elementMod(
int i)
151 return elemFromParent(elementIndexMod(
i));
153 return Base::container().atMod(
i);
156 const Elem* elementMod(
int i)
const
159 return elemFromParent(elementIndexMod(
i));
161 return Base::container().atMod(
i);
164 uint elementIndexMod(
int i)
const
167 return Base::container().atMod(
i);
169 return indexFromPointer(elementMod(
i));
175 Base::container().set(
i, indexFromPointer(e));
177 Base::container().set(
i, e);
183 Base::container().set(
i,
ei);
185 Base::container().set(
i, elemFromParent(
ei));
188 void setElement(Base::ConstIterator
it,
Elem* v)
190 setElement(
it - elementBegin(), v);
193 void setElement(Base::ConstIterator
it,
uint vi)
195 setElement(
it - elementBegin(),
vi);
198 void setElement(Base::ConstIndexIterator
it,
Elem* v)
200 setElement(
it - elementBegin(), v);
203 void setElement(Base::ConstIndexIterator
it,
uint vi)
205 setElement(
it - elementBegin(),
vi);
208 void setElementMod(
int i,
Elem* e)
211 Base::container().atMod(
i) = indexFromPointer(e);
213 Base::container().atMod(
i) = e;
216 void setElementMod(
int i,
uint ei)
219 Base::container().atMod(
i) =
ei;
221 Base::container().atMod(
i) = elemFromParent(
ei);
228 auto conv = [&](
auto v) {
229 return indexFromPointer(v);
232 Base::container().set(
r | std::views::transform(
conv));
235 Base::container().set(
r);
243 Base::container().set(
r);
246 auto conv = [&](
auto i) {
247 return elemFromParent(
i);
250 Base::container().set(
r | std::views::transform(
conv));
254 bool containsElement(
const Elem* e)
const
257 return Base::container().contains(indexFromPointer(e));
259 return Base::container().contains(e);
262 bool containsElement(
uint ei)
const
265 return Base::container().contains(
ei);
267 return Base::container().contains(elemFromParent(
ei));
270 uint indexOfElement(
const Elem* e)
const
273 return Base::container().indexOf(indexFromPointer(e));
275 return Base::container().indexOf(e);
281 return Base::container().indexOf(
ei);
283 return Base::container().indexOf(elemFromParent(
ei));
286 Base::Iterator elementBegin()
289 return typename Base::Iterator(
290 Base::container().begin(), Base::parentElement());
292 return Base::container().begin();
295 Base::Iterator elementEnd()
298 return typename Base::Iterator(Base::container().end());
300 return Base::container().end();
303 Base::ConstIterator elementBegin()
const
306 return typename Base::ConstIterator(
307 Base::container().begin(), Base::parentElement());
309 return Base::container().begin();
312 Base::ConstIterator elementEnd()
const
315 return typename Base::ConstIterator(Base::container().end());
317 return Base::container().end();
320 Base::ConstIndexIterator elementIndexBegin()
const
323 return Base::container().begin();
325 return typename Base::ConstIndexIterator(elementBegin());
328 Base::ConstIndexIterator elementIndexEnd()
const
331 return Base::container().end();
333 return typename Base::ConstIndexIterator(elementEnd());
338 return View(elementBegin(), elementEnd());
343 return View(elementBegin(), elementEnd());
348 return View(elementIndexBegin(), elementIndexEnd());
353 void resize(
uint n)
requires (N < 0)
358 Base::container().resize(
n);
361 void pushBack(
Elem* e =
nullptr)
requires (N < 0)
364 Base::container().pushBack(indexFromPointer(e));
366 Base::container().pushBack(e);
369 void pushBack(
uint ei)
requires (N < 0)
372 Base::container().pushBack(
ei);
374 Base::container().pushBack(elemFromParent(
ei));
377 void insert(
uint i,
Elem* e =
nullptr)
requires (N < 0)
380 Base::container().insert(
i, indexFromPointer(e));
382 Base::container().insert(
i, e);
388 Base::container().insert(
i,
ei);
390 Base::container().insert(
i, elemFromParent(
ei));
393 void erase(
uint i)
requires (N < 0) { Base::container().erase(
i); }
395 void clear()
requires (N < 0) { Base::container().clear(); }
399 uint indexFromPointer(
const Elem* v)
const
412 return &Base::parentElement()
422 return &Base::parentElement()