aboutsummaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2017-07-27 15:11:57 +0200
committerHenning Baldersheim <balder@yahoo-inc.com>2017-07-31 17:27:04 +0200
commit5ae19bb21b3a93dcb1f1d207ff3d73f5edb2e27e (patch)
tree192057d48caeda78297af20bd0b04e8e50d0c276 /document
parent60d5aaa6087b9092153e82466206e598124c3c24 (diff)
Avoid copying
Diffstat (limited to 'document')
-rw-r--r--document/src/vespa/document/base/fieldpath.cpp6
-rw-r--r--document/src/vespa/document/base/fieldpath.h22
-rw-r--r--document/src/vespa/document/datatype/arraydatatype.cpp4
-rw-r--r--document/src/vespa/document/datatype/mapdatatype.cpp8
-rw-r--r--document/src/vespa/document/datatype/structureddatatype.cpp2
-rw-r--r--document/src/vespa/document/update/fieldpathupdate.cpp2
6 files changed, 24 insertions, 20 deletions
diff --git a/document/src/vespa/document/base/fieldpath.cpp b/document/src/vespa/document/base/fieldpath.cpp
index 7d861dc782b..b173d393316 100644
--- a/document/src/vespa/document/base/fieldpath.cpp
+++ b/document/src/vespa/document/base/fieldpath.cpp
@@ -183,8 +183,10 @@ FieldPath::FieldPath(const FieldPath &) = default;
FieldPath & FieldPath::operator=(const FieldPath &) = default;
FieldPath::~FieldPath() { }
-FieldPath::iterator FieldPath::insert(iterator pos, FieldPathEntry && entry) { return _path.insert(pos, std::move(entry)); }
-void FieldPath::push_back(FieldPathEntry && entry) { _path.push_back(std::move(entry)); }
+FieldPath::iterator FieldPath::insert(iterator pos, std::unique_ptr<FieldPathEntry> entry) {
+ return _path.insert(pos, vespalib::CloneablePtr<FieldPathEntry>(entry.release()));
+}
+void FieldPath::push_back(std::unique_ptr<FieldPathEntry> entry) { _path.emplace_back(entry.release()); }
void FieldPath::pop_back() { _path.pop_back(); }
void FieldPath::clear() { _path.clear(); }
void FieldPath::reserve(size_t sz) { _path.reserve(sz); }
diff --git a/document/src/vespa/document/base/fieldpath.h b/document/src/vespa/document/base/fieldpath.h
index 00dad12581a..d2a60ebfbed 100644
--- a/document/src/vespa/document/base/fieldpath.h
+++ b/document/src/vespa/document/base/fieldpath.h
@@ -67,6 +67,8 @@ public:
*/
FieldPathEntry(const DataType & dataType, const vespalib::stringref & variableName);
+ FieldPathEntry * clone() const { return new FieldPathEntry(*this); }
+
Type getType() const { return _type; }
const vespalib::string & getName() const { return _name; }
@@ -106,7 +108,7 @@ private:
//typedef std::deque<FieldPathEntry> FieldPath;
// Facade over FieldPathEntry container that exposes cloneability
class FieldPath {
- typedef std::vector<FieldPathEntry> Container;
+ typedef std::vector<vespalib::CloneablePtr<FieldPathEntry>> Container;
public:
typedef Container::reference reference;
typedef Container::const_reference const_reference;
@@ -128,8 +130,8 @@ public:
: _path(first, last)
{ }
- iterator insert(iterator pos, FieldPathEntry && entry);
- void push_back(FieldPathEntry && entry);
+ iterator insert(iterator pos, std::unique_ptr<FieldPathEntry> entry);
+ void push_back(std::unique_ptr<FieldPathEntry> entry);
iterator begin() { return _path.begin(); }
iterator end() { return _path.end(); }
@@ -140,10 +142,10 @@ public:
const_reverse_iterator rbegin() const { return _path.rbegin(); }
const_reverse_iterator rend() const { return _path.rend(); }
- reference front() { return _path.front(); }
- const_reference front() const { return _path.front(); }
- reference back() { return _path.back(); }
- const_reference back() const { return _path.back(); }
+ FieldPathEntry & front() { return *_path.front(); }
+ const FieldPathEntry & front() const { return *_path.front(); }
+ FieldPathEntry & back() { return *_path.back(); }
+ const FieldPathEntry & back() const { return *_path.back(); }
void pop_back();
void clear();
@@ -151,9 +153,9 @@ public:
Container::size_type size() const { return _path.size(); }
bool empty() const { return _path.empty(); }
- reference operator[](Container::size_type i) { return _path[i]; }
+ FieldPathEntry & operator[](Container::size_type i) { return *_path[i]; }
- const_reference operator[](Container::size_type i) const { return _path[i]; }
+ const FieldPathEntry & operator[](Container::size_type i) const { return *_path[i]; }
void visitMembers(vespalib::ObjectVisitor &visitor) const;
@@ -164,7 +166,7 @@ public:
Range(IT begin_, IT end_) : _begin(begin_), _end(end_) { }
Range next() const { return Range(_begin+1, _end); }
bool atEnd() const { return _begin == _end; }
- const FieldPathEntry & cur() { return *_begin; }
+ const FieldPathEntry & cur() { return **_begin; }
private:
IT _begin;
IT _end;
diff --git a/document/src/vespa/document/datatype/arraydatatype.cpp b/document/src/vespa/document/datatype/arraydatatype.cpp
index 8a4b39ecbff..5ced6053b05 100644
--- a/document/src/vespa/document/datatype/arraydatatype.cpp
+++ b/document/src/vespa/document/datatype/arraydatatype.cpp
@@ -58,9 +58,9 @@ ArrayDataType::onBuildFieldPath(FieldPath & path, const vespalib::stringref & re
getNestedType().buildFieldPath(path, remainFieldName.substr(pos));
if (remainFieldName[1] == '$') {
- path.insert(path.begin(), FieldPathEntry(getNestedType(), remainFieldName.substr(2, endPos - 2)));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(getNestedType(), remainFieldName.substr(2, endPos - 2)));
} else {
- path.insert(path.begin(), FieldPathEntry(getNestedType(), atoi(remainFieldName.substr(1, endPos - 1).c_str())));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(getNestedType(), atoi(remainFieldName.substr(1, endPos - 1).c_str())));
}
}
} else {
diff --git a/document/src/vespa/document/datatype/mapdatatype.cpp b/document/src/vespa/document/datatype/mapdatatype.cpp
index ee345040a24..6eece4e487d 100644
--- a/document/src/vespa/document/datatype/mapdatatype.cpp
+++ b/document/src/vespa/document/datatype/mapdatatype.cpp
@@ -67,11 +67,11 @@ MapDataType::buildFieldPathImpl(FieldPath & path, const DataType &dataType,
valueType.buildFieldPath(path, (rest[0] == '.') ? rest.substr(1) : rest);
if (remainFieldName[1] == '$') {
- path.insert(path.begin(), FieldPathEntry(valueType, keyValue.substr(1)));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(valueType, keyValue.substr(1)));
} else {
FieldValue::UP fv = keyType.createFieldValue();
*fv = keyValue;
- path.insert(path.begin(), FieldPathEntry(valueType, dataType, std::move(fv)));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(valueType, dataType, std::move(fv)));
}
} else if (memcmp(remainFieldName.c_str(), "key", 3) == 0) {
size_t endPos = 3;
@@ -81,7 +81,7 @@ MapDataType::buildFieldPathImpl(FieldPath & path, const DataType &dataType,
keyType.buildFieldPath(path, remainFieldName.substr(endPos));
- path.insert(path.begin(), FieldPathEntry(dataType, keyType, valueType, true, false));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(dataType, keyType, valueType, true, false));
} else if (memcmp(remainFieldName.c_str(), "value", 5) == 0) {
size_t endPos = 5;
if (remainFieldName[endPos] == '.') {
@@ -90,7 +90,7 @@ MapDataType::buildFieldPathImpl(FieldPath & path, const DataType &dataType,
valueType.buildFieldPath(path, remainFieldName.substr(endPos));
- path.insert(path.begin(), FieldPathEntry(dataType, keyType, valueType, false, true));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(dataType, keyType, valueType, false, true));
} else {
keyType.buildFieldPath(path, remainFieldName);
}
diff --git a/document/src/vespa/document/datatype/structureddatatype.cpp b/document/src/vespa/document/datatype/structureddatatype.cpp
index 748da0efa50..e054cf24706 100644
--- a/document/src/vespa/document/datatype/structureddatatype.cpp
+++ b/document/src/vespa/document/datatype/structureddatatype.cpp
@@ -79,7 +79,7 @@ StructuredDataType::onBuildFieldPath(FieldPath & path, const vespalib::stringref
const document::Field &fp = getField(currFieldName);
fp.getDataType().buildFieldPath(path, subFieldName);
- path.insert(path.begin(), FieldPathEntry(fp));
+ path.insert(path.begin(), std::make_unique<FieldPathEntry>(fp));
} else {
throw FieldNotFoundException(currFieldName, make_string("Invalid field path '%s', no field named '%s'",
remainFieldName.c_str(), currFieldName.c_str()));
diff --git a/document/src/vespa/document/update/fieldpathupdate.cpp b/document/src/vespa/document/update/fieldpathupdate.cpp
index 256439a039b..7265329d4d5 100644
--- a/document/src/vespa/document/update/fieldpathupdate.cpp
+++ b/document/src/vespa/document/update/fieldpathupdate.cpp
@@ -113,7 +113,7 @@ FieldPathUpdate::getResultingDataType(const FieldPath & path) const
if (path.empty()) {
throw vespalib::IllegalStateException("Cannot get resulting data type from an empty field path", VESPA_STRLOC);
}
- return path.rbegin()->getDataType();
+ return path.back().getDataType();
}
vespalib::string