diff options
Diffstat (limited to 'document')
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 |