diff --git a/src/dataencode.cpp b/src/dataencode.cpp index 811eb67..ec10bc8 100644 --- a/src/dataencode.cpp +++ b/src/dataencode.cpp @@ -90,12 +90,7 @@ void from_wire(Buffer& buf, std::vector& descs, TypeStore& cache, uns return; } else { - auto& entry = cache[key]; - // copy new node, and any descendants into cache - entry.resize(descs.size()-index); - std::copy(descs.begin()+index, - descs.end(), - entry.begin()); + cache.emplace(key, descs); // copies descs descs[index].parent_index = 0u; // our caller will set if actually is a parent. } @@ -115,10 +110,9 @@ void from_wire(Buffer& buf, std::vector& descs, TypeStore& cache, uns } else { // copy from cache - descs.resize(index+it->second.size()); - std::copy(it->second.begin(), - it->second.end(), - descs.begin()+index); + descs.reserve(index+it->second.size()); + for(const auto& d : it->second) + descs.emplace_back(d); } } else if(code.code!=0xff && code.code&0x10) { @@ -128,12 +122,7 @@ void from_wire(Buffer& buf, std::vector& descs, TypeStore& cache, uns } else { // actual field - descs.emplace_back(); - { - auto& fld = descs.back(); - - fld.code = code; - } + descs.emplace_back(code); switch(code.code) { case TypeCode::StructA: diff --git a/src/dataimpl.h b/src/dataimpl.h index cbbca86..cc7c93b 100644 --- a/src/dataimpl.h +++ b/src/dataimpl.h @@ -74,7 +74,9 @@ struct FieldDesc { // For UnionA/StructA containing a single Union/Struct std::vector members; - TypeCode code{TypeCode::Null}; + const TypeCode code{TypeCode::Null}; + + explicit FieldDesc(TypeCode code) :code{code} {} // number of FieldDesc nodes which describe this node. Inclusive. always size()>=1 inline size_t size() const { return 1u + (members.empty() ? mlookup.size() : 0u); } diff --git a/src/type.cpp b/src/type.cpp index a316ed7..46d2282 100644 --- a/src/type.cpp +++ b/src/type.cpp @@ -235,9 +235,7 @@ void Member::Helper::build_tree(std::vector& desc, const Member& node auto code = node.code; if(node.code==TypeCode::StructA || node.code==TypeCode::UnionA) { - desc.emplace_back(); - auto& fld = desc.back(); - fld.code = node.code; + desc.emplace_back(node.code); // struct/union array have no ID Member next{code.scalarOf(), node.name}; @@ -249,11 +247,10 @@ void Member::Helper::build_tree(std::vector& desc, const Member& node } const auto index = desc.size(); - desc.emplace_back(); + desc.emplace_back(code); { auto& fld = desc.back(); - fld.code = code; fld.id = node.id; }