From 9aaaccaf2a50ce19168068a58cbcc254ab255665 Mon Sep 17 00:00:00 2001 From: Michael Davidsaver Date: Thu, 12 Dec 2019 11:08:32 -0800 Subject: [PATCH] track StructTop::member_indicies needed to allow iteration by storage offset --- src/data.cpp | 5 ++++- src/dataimpl.h | 2 ++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/data.cpp b/src/data.cpp index db27b4f..a7a7cc4 100644 --- a/src/data.cpp +++ b/src/data.cpp @@ -30,11 +30,13 @@ Value::Value(const std::shared_ptr& desc) top->desc = desc; top->valid.resize(desc->next_offset-desc->offset); - top->members.resize(desc->next_offset-desc->offset); + top->member_indicies.resize(top->valid.size()); + top->members.resize(top->valid.size()); { auto& root = top->members[0]; root.init(desc.get()); root.top = top.get(); + top->member_indicies[0u] = 0u; } for(auto& pair : desc->mlookup) { @@ -42,6 +44,7 @@ Value::Value(const std::shared_ptr& desc) auto& mem = top->members.at(cfld->offset-desc->offset); mem.top = top.get(); mem.init(cfld); + top->member_indicies[cfld->offset] = pair.second; } this->desc = desc.get(); diff --git a/src/dataimpl.h b/src/dataimpl.h index 2721e12..b8ea0de 100644 --- a/src/dataimpl.h +++ b/src/dataimpl.h @@ -108,6 +108,8 @@ struct StructTop { // type of first top level struct. always !NULL. // Actually the first element of a vector std::shared_ptr desc; + // map from FieldStorage offsets to FieldDesc offsets. inverse of FieldDesc::offset + std::vector member_indicies; // our members (inclusive). always size()>=1 std::vector members; };