diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2021-06-30 16:58:50 +0000 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2021-07-01 11:27:51 +0000 |
commit | c474c687512c5100c3a7aafdc72d813544904020 (patch) | |
tree | d9be88630c4b1ebaa83e3ef019fba37712060c3f /vespalib/src | |
parent | c0e3cdf497db1d02f64b111d575b92e5371a8416 (diff) |
Allow presizing of arrays in slime.
Diffstat (limited to 'vespalib/src')
12 files changed, 63 insertions, 34 deletions
diff --git a/vespalib/src/vespa/vespalib/data/slime/array_value.cpp b/vespalib/src/vespa/vespalib/data/slime/array_value.cpp index edcc5a8eb85..e34c352b4fd 100644 --- a/vespalib/src/vespa/vespalib/data/slime/array_value.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/array_value.cpp @@ -7,6 +7,14 @@ namespace vespalib::slime { +ArrayValue::ArrayValue(SymbolTable &table, Stash & stash) + : _symbolTable(table), + _stash(stash), + _values() +{} + +ArrayValue::~ArrayValue() = default; + void ArrayValue::traverse(ArrayTraverser &at) const { for (size_t i = 0; i < _values.size(); ++i) { @@ -16,8 +24,8 @@ ArrayValue::traverse(ArrayTraverser &at) const { Cursor & -ArrayValue::addArray() { - return addLeaf(ArrayValueFactory(_symbolTable)); +ArrayValue::addArray(size_t reserve) { + return addLeaf(ArrayValueFactory(_symbolTable, reserve)); } Cursor & diff --git a/vespalib/src/vespa/vespalib/data/slime/array_value.h b/vespalib/src/vespa/vespalib/data/slime/array_value.h index 19f93c3eeec..02bd730275b 100644 --- a/vespalib/src/vespa/vespalib/data/slime/array_value.h +++ b/vespalib/src/vespa/vespalib/data/slime/array_value.h @@ -28,7 +28,7 @@ protected: } public: - ArrayValue(SymbolTable &table, Stash & stash) : _symbolTable(table), _stash(stash), _values() {} + ArrayValue(SymbolTable &table, Stash & stash); ArrayValue(const ArrayValue &) = delete; ArrayValue &operator=(const ArrayValue &) = delete; @@ -36,6 +36,7 @@ public: size_t children() const override { return _values.size(); } size_t entries() const override { return _values.size(); } void traverse(ArrayTraverser &at) const override; + void reserve(size_t sz) { _values.reserve(sz); } Cursor &operator[](size_t idx) const override { if (idx < _values.size()) { @@ -44,11 +45,11 @@ public: return *NixValue::invalid(); } - Cursor &addArray() override; + Cursor &addArray(size_t reserve) override; Cursor &addObject() override; Symbol resolve(Memory symbol_name) override; - ~ArrayValue() override = default; + ~ArrayValue() override; }; } // namespace vespalib::slime diff --git a/vespalib/src/vespa/vespalib/data/slime/cursor.h b/vespalib/src/vespa/vespalib/data/slime/cursor.h index 34d7028a027..6f926de85b6 100644 --- a/vespalib/src/vespa/vespalib/data/slime/cursor.h +++ b/vespalib/src/vespa/vespalib/data/slime/cursor.h @@ -19,7 +19,7 @@ struct Cursor : public Inspector { virtual Cursor &addString(Memory str) = 0; virtual Cursor &addData(Memory data) = 0; virtual Cursor &addData(ExternalMemory::UP data) = 0; - virtual Cursor &addArray() = 0; + virtual Cursor &addArray(size_t reserved_size) = 0; virtual Cursor &addObject() = 0; virtual Cursor &setNix(Symbol sym) = 0; @@ -29,7 +29,7 @@ struct Cursor : public Inspector { virtual Cursor &setString(Symbol sym, Memory str) = 0; virtual Cursor &setData(Symbol sym, Memory data) = 0; virtual Cursor &setData(Symbol sym, ExternalMemory::UP data) = 0; - virtual Cursor &setArray(Symbol sym) = 0; + virtual Cursor &setArray(Symbol sym, size_t reserved_size) = 0; virtual Cursor &setObject(Symbol sym) = 0; virtual Cursor &setNix(Memory name) = 0; @@ -39,10 +39,20 @@ struct Cursor : public Inspector { virtual Cursor &setString(Memory name, Memory str) = 0; virtual Cursor &setData(Memory name, Memory data) = 0; virtual Cursor &setData(Memory name, ExternalMemory::UP data) = 0; - virtual Cursor &setArray(Memory name) = 0; + virtual Cursor &setArray(Memory name, size_t reserved_size) = 0; virtual Cursor &setObject(Memory name) = 0; virtual Symbol resolve(Memory symbol_name) = 0; + + Cursor &addArray() { + return addArray(0); + } + Cursor &setArray(Memory name) { + return setArray(name, 0); + } + Cursor &setArray(Symbol sym) { + return setArray(sym, 0); + } }; } diff --git a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp index 95be18f57ae..f6573ad26c4 100644 --- a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp @@ -9,7 +9,9 @@ namespace vespalib::slime { Value * ArrayValueFactory::create(Stash & stash) const { - return & stash.create<ArrayValue>(symbolTable, stash); + ArrayValue & arr = stash.create<ArrayValue>(symbolTable, stash); + arr.reserve(_reserve); + return &arr; } Value * diff --git a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h index 4046a838ef3..ab50aad0709 100644 --- a/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h +++ b/vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h @@ -13,7 +13,8 @@ struct NixValueFactory : public ValueFactory { struct ArrayValueFactory : public ValueFactory { SymbolTable &symbolTable; - ArrayValueFactory(SymbolTable &table) : symbolTable(table) {} + size_t _reserve; + ArrayValueFactory(SymbolTable &table, size_t reserve) : symbolTable(table), _reserve(reserve) {} Value *create(Stash & stash) const override; }; diff --git a/vespalib/src/vespa/vespalib/data/slime/inserter.cpp b/vespalib/src/vespa/vespalib/data/slime/inserter.cpp index 0042319d8a1..7e64800eefc 100644 --- a/vespalib/src/vespa/vespalib/data/slime/inserter.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/inserter.cpp @@ -14,7 +14,7 @@ Cursor &SlimeInserter::insertDouble(double value) const { return slime.setDouble Cursor &SlimeInserter::insertString(Memory value) const { return slime.setString(value); } Cursor &SlimeInserter::insertData(Memory value) const { return slime.setData(value); } Cursor &SlimeInserter::insertData(ExtMemUP value) const { return slime.setData(std::move(value)); } -Cursor &SlimeInserter::insertArray() const { return slime.setArray(); } +Cursor &SlimeInserter::insertArray(size_t resv) const { return slime.setArray(resv); } Cursor &SlimeInserter::insertObject() const { return slime.setObject(); } Cursor &ArrayInserter::insertNix() const { return cursor.addNix(); } @@ -24,7 +24,7 @@ Cursor &ArrayInserter::insertDouble(double value) const { return cursor.addDoubl Cursor &ArrayInserter::insertString(Memory value) const { return cursor.addString(value); } Cursor &ArrayInserter::insertData(Memory value) const { return cursor.addData(value); } Cursor &ArrayInserter::insertData(ExtMemUP value) const { return cursor.addData(std::move(value)); } -Cursor &ArrayInserter::insertArray() const { return cursor.addArray(); } +Cursor &ArrayInserter::insertArray(size_t resv) const { return cursor.addArray(resv); } Cursor &ArrayInserter::insertObject() const { return cursor.addObject(); } Cursor &ObjectSymbolInserter::insertNix() const { return cursor.setNix(symbol); } @@ -34,7 +34,7 @@ Cursor &ObjectSymbolInserter::insertDouble(double value) const { return cursor.s Cursor &ObjectSymbolInserter::insertString(Memory value) const { return cursor.setString(symbol, value); } Cursor &ObjectSymbolInserter::insertData(Memory value) const { return cursor.setData(symbol, value); } Cursor &ObjectSymbolInserter::insertData(ExtMemUP value) const { return cursor.setData(symbol, std::move(value)); } -Cursor &ObjectSymbolInserter::insertArray() const { return cursor.setArray(symbol); } +Cursor &ObjectSymbolInserter::insertArray(size_t resv) const { return cursor.setArray(symbol, resv); } Cursor &ObjectSymbolInserter::insertObject() const { return cursor.setObject(symbol); } Cursor &ObjectInserter::insertNix() const { return cursor.setNix(name); } @@ -44,7 +44,7 @@ Cursor &ObjectInserter::insertDouble(double value) const { return cursor.setDoub Cursor &ObjectInserter::insertString(Memory value) const { return cursor.setString(name, value); } Cursor &ObjectInserter::insertData(Memory value) const { return cursor.setData(name, value); } Cursor &ObjectInserter::insertData(ExtMemUP value) const { return cursor.setData(name, std::move(value)); } -Cursor &ObjectInserter::insertArray() const { return cursor.setArray(name); } +Cursor &ObjectInserter::insertArray(size_t resv) const { return cursor.setArray(name, resv); } Cursor &ObjectInserter::insertObject() const { return cursor.setObject(name); } } // namespace vespalib::slime diff --git a/vespalib/src/vespa/vespalib/data/slime/inserter.h b/vespalib/src/vespa/vespalib/data/slime/inserter.h index 8206e67a79a..deddb5671c3 100644 --- a/vespalib/src/vespa/vespalib/data/slime/inserter.h +++ b/vespalib/src/vespa/vespalib/data/slime/inserter.h @@ -27,9 +27,13 @@ struct Inserter { virtual Cursor &insertString(Memory value) const = 0; virtual Cursor &insertData(Memory value) const = 0; virtual Cursor &insertData(ExternalMemory::UP value) const = 0; - virtual Cursor &insertArray() const = 0; + virtual Cursor &insertArray(size_t reserved) const = 0; virtual Cursor &insertObject() const = 0; - virtual ~Inserter() {} + virtual ~Inserter() = default; + + Cursor &insertArray() const { + return insertArray(0); + } }; //----------------------------------------------------------------------------- @@ -45,7 +49,7 @@ struct SlimeInserter : Inserter { Cursor &insertString(Memory value) const override; Cursor &insertData(Memory value) const override; Cursor &insertData(ExternalMemory::UP value) const override; - Cursor &insertArray() const override; + Cursor &insertArray(size_t reserved) const override; Cursor &insertObject() const override; }; @@ -60,7 +64,7 @@ struct ArrayInserter : Inserter { Cursor &insertString(Memory value) const override; Cursor &insertData(Memory value) const override; Cursor &insertData(ExternalMemory::UP value) const override; - Cursor &insertArray() const override; + Cursor &insertArray(size_t reserved) const override; Cursor &insertObject() const override; }; @@ -76,7 +80,7 @@ struct ObjectSymbolInserter : Inserter { Cursor &insertString(Memory value) const override; Cursor &insertData(Memory value) const override; Cursor &insertData(ExternalMemory::UP value) const override; - Cursor &insertArray() const override; + Cursor &insertArray(size_t reserved) const override; Cursor &insertObject() const override; }; @@ -92,7 +96,7 @@ struct ObjectInserter : Inserter { Cursor &insertString(Memory value) const override; Cursor &insertData(Memory value) const override; Cursor &insertData(ExternalMemory::UP value) const override; - Cursor &insertArray() const override; + Cursor &insertArray(size_t reserved) const override; Cursor &insertObject() const override; }; diff --git a/vespalib/src/vespa/vespalib/data/slime/object_value.cpp b/vespalib/src/vespa/vespalib/data/slime/object_value.cpp index f3436ac0978..094869f36ad 100644 --- a/vespalib/src/vespa/vespalib/data/slime/object_value.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/object_value.cpp @@ -53,8 +53,8 @@ ObjectValue::operator[](Memory name) const { Cursor & -ObjectValue::setArray(Symbol symbol) { - return setLeaf(symbol, ArrayValueFactory(_symbolTable)); +ObjectValue::setArray(Symbol symbol, size_t reserve) { + return setLeaf(symbol, ArrayValueFactory(_symbolTable, reserve)); } Cursor & @@ -63,8 +63,8 @@ ObjectValue::setObject(Symbol symbol) { } Cursor & -ObjectValue::setArray(Memory name) { - return setLeaf(name, ArrayValueFactory(_symbolTable)); +ObjectValue::setArray(Memory name, size_t reserve) { + return setLeaf(name, ArrayValueFactory(_symbolTable, reserve)); } Cursor & diff --git a/vespalib/src/vespa/vespalib/data/slime/object_value.h b/vespalib/src/vespa/vespalib/data/slime/object_value.h index 7f8a809a482..159a1431d29 100644 --- a/vespalib/src/vespa/vespalib/data/slime/object_value.h +++ b/vespalib/src/vespa/vespalib/data/slime/object_value.h @@ -72,10 +72,10 @@ public: Cursor &operator[](Symbol sym) const override; Cursor &operator[](Memory name) const override; - Cursor &setArray(Symbol sym) override; + Cursor &setArray(Symbol sym, size_t reserve) override; Cursor &setObject(Symbol sym) override; - Cursor &setArray(Memory name) override; + Cursor &setArray(Memory name, size_t reserve) override; Cursor &setObject(Memory name) override; Symbol resolve(Memory symbol_name) override; diff --git a/vespalib/src/vespa/vespalib/data/slime/slime.h b/vespalib/src/vespa/vespalib/data/slime/slime.h index 9959d8e7fc8..ee3222b2e8d 100644 --- a/vespalib/src/vespa/vespalib/data/slime/slime.h +++ b/vespalib/src/vespa/vespalib/data/slime/slime.h @@ -155,7 +155,10 @@ public: return _root.set(slime::ExternalDataValueFactory(std::move(data))); } Cursor &setArray() { - return _root.set(slime::ArrayValueFactory(*_names)); + return setArray(0); + } + Cursor &setArray(size_t reserve) { + return _root.set(slime::ArrayValueFactory(*_names, reserve)); } Cursor &setObject() { return _root.set(slime::ObjectValueFactory(*_names)); diff --git a/vespalib/src/vespa/vespalib/data/slime/value.cpp b/vespalib/src/vespa/vespalib/data/slime/value.cpp index 300eeba47e5..f7c37d73652 100644 --- a/vespalib/src/vespa/vespalib/data/slime/value.cpp +++ b/vespalib/src/vespa/vespalib/data/slime/value.cpp @@ -130,16 +130,16 @@ Value::setData(Memory name, ExternalMemory::UP data) { return setLeaf(name, Exte // nop defaults for array/objects Cursor & -Value::addArray() { return *NixValue::invalid(); } +Value::addArray(size_t) { return *NixValue::invalid(); } Cursor & Value::addObject() { return *NixValue::invalid(); } Cursor & -Value::setArray(Symbol) { return *NixValue::invalid(); } +Value::setArray(Symbol, size_t) { return *NixValue::invalid(); } Cursor & Value::setObject(Symbol) { return *NixValue::invalid(); } Cursor & -Value::setArray(Memory) { return *NixValue::invalid(); } +Value::setArray(Memory, size_t) { return *NixValue::invalid(); } Cursor & Value::setObject(Memory) { return *NixValue::invalid(); } diff --git a/vespalib/src/vespa/vespalib/data/slime/value.h b/vespalib/src/vespa/vespalib/data/slime/value.h index 786f2bede91..930c182924e 100644 --- a/vespalib/src/vespa/vespalib/data/slime/value.h +++ b/vespalib/src/vespa/vespalib/data/slime/value.h @@ -21,7 +21,7 @@ struct ObjectTraverser; class Value : public Cursor { protected: - virtual ~Value() {} + virtual ~Value() = default; virtual Cursor &addLeaf(const ValueFactory &input); virtual Cursor &setLeaf(Symbol symbol, const ValueFactory &input); @@ -57,7 +57,7 @@ public: Cursor &addString(Memory str) override; Cursor &addData(Memory data) override; Cursor &addData(ExternalMemory::UP data) override; - Cursor &addArray() override; + Cursor &addArray(size_t reserved_size) override; Cursor &addObject() override; Cursor &setNix(Symbol sym) override; @@ -67,7 +67,7 @@ public: Cursor &setString(Symbol sym, Memory str) override; Cursor &setData(Symbol sym, Memory data) override; Cursor &setData(Symbol sym, ExternalMemory::UP data) override; - Cursor &setArray(Symbol sym) override; + Cursor &setArray(Symbol sym, size_t reserved_size) override; Cursor &setObject(Symbol sym) override; Cursor &setNix(Memory name) override; @@ -77,7 +77,7 @@ public: Cursor &setString(Memory name, Memory str) override; Cursor &setData(Memory name, Memory str) override; Cursor &setData(Memory name, ExternalMemory::UP data) override; - Cursor &setArray(Memory name) override; + Cursor &setArray(Memory name, size_t reserved_size) override; Cursor &setObject(Memory name) override; Symbol resolve(Memory symbol_name) override; |