xo-alloc2: work on alloc_range + operator++ for alloc iterators [WIP]

This commit is contained in:
Roland Conybeare 2025-12-19 13:55:19 -05:00
commit 5c7a2e1ad5
9 changed files with 165 additions and 48 deletions

View file

@ -91,7 +91,7 @@ namespace xo {
cmpresult
DArenaIterator::compare(const DArenaIterator & other_ix) const noexcept
{
scope log(XO_DEBUG(false),
scope log(XO_DEBUG(true),
xtag("arena", arena_),
xtag("pos", pos_),
xtag("other.arena", other_ix.arena_),

View file

@ -5,6 +5,7 @@
#include "arena/IAllocIterator_DArenaIterator.hpp"
#include "AllocIterator.hpp"
#include <xo/indentlog/scope.hpp>
#include <cassert>
namespace xo {
@ -21,6 +22,10 @@ namespace xo {
IAllocIterator_DArenaIterator::compare(const DArenaIterator & ix,
const obj<AAllocIterator> & other_arg) noexcept
{
scope log(XO_DEBUG(true),
xtag("&ix", &ix),
xtag("ix.arena", ix.arena_), xtag("ix.pos", ix.pos_));
/* downcast from variant */
auto other = obj<AAllocIterator, DArenaIterator>::from(other_arg);
@ -29,6 +34,10 @@ namespace xo {
DArenaIterator & other_ix = *other;
log && log(xtag("&other_ix", &other_ix),
xtag("other_ix.arena", other_ix.arena_),
xtag("other_ix.pos", other_ix.pos_));
return ix.compare(other_ix);
}

View file

@ -74,13 +74,46 @@ namespace xo {
IAllocator_DArena::alloc_range(const DArena & s,
DArena & ialloc) noexcept -> range_type
{
scope log(XO_DEBUG(true));
DArenaIterator * begin_ix = construct_with<DArenaIterator>(ialloc, &s, s.begin_header());
DArenaIterator * end_ix = construct_with<DArenaIterator>(ialloc, &s, s.end_header());
obj<AAllocIterator> begin_obj = with_facet<AAllocIterator>::mkobj(begin_ix);
obj<AAllocIterator> end_obj = with_facet<AAllocIterator>::mkobj( end_ix);
obj<AAllocIterator,DArenaIterator> begin_obj = with_facet<AAllocIterator>::mkobj(begin_ix);
obj<AAllocIterator,DArenaIterator> end_obj = with_facet<AAllocIterator>::mkobj( end_ix);
return std::make_pair(begin_obj, end_obj);
log && log(xtag("begin_obj.typeseq", begin_obj._typeseq()));
obj<AAllocIterator> begin_vt = begin_obj;
obj<AAllocIterator> end_vt = end_obj;
log && log(xtag("begin_vt.typeseq", begin_vt._typeseq()));
log && log(xtag("begin_ix", begin_ix),
xtag("begin_ix.arena", begin_ix->arena_),
xtag("begin_ix.pos", begin_ix->pos_));
range_type retval = std::make_pair(begin_vt, end_vt);
log && log(xtag("1.retval.first.typeseq", retval.first._typeseq()));
retval.first.from_obj(begin_vt);
retval.second.from_obj(end_vt);
// this gets correct typeseq. so first.from_obj() works
log && log(xtag("2.retval.first.typeseq", retval.first._typeseq()));
obj<AAllocIterator> begin_vt2;
begin_vt2 = retval.first;
log && log(xtag("3.begin_vt2.typeseq", begin_vt2._typeseq()));
retval = std::make_pair(begin_vt2, begin_vt2);
log && log(xtag("4.retval.first.typeseq", retval.first._typeseq()));
return retval;
}
bool