summaryrefslogtreecommitdiffstats
path: root/vespalib
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-06-30 16:58:50 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-07-01 11:27:51 +0000
commitc474c687512c5100c3a7aafdc72d813544904020 (patch)
treed9be88630c4b1ebaa83e3ef019fba37712060c3f /vespalib
parentc0e3cdf497db1d02f64b111d575b92e5371a8416 (diff)
Allow presizing of arrays in slime.
Diffstat (limited to 'vespalib')
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_value.cpp12
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/array_value.h7
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/cursor.h16
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/empty_value_factory.cpp4
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/empty_value_factory.h3
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inserter.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/inserter.h16
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_value.cpp8
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/object_value.h4
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/slime.h5
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value.cpp6
-rw-r--r--vespalib/src/vespa/vespalib/data/slime/value.h8
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;