diff options
author | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-26 11:26:35 +0200 |
---|---|---|
committer | Henning Baldersheim <balder@yahoo-inc.com> | 2017-07-31 17:04:18 +0200 |
commit | 50a275ebd8774a958418bbda4d127df1f420f1ad (patch) | |
tree | 65b36bac662cd02d4b4422fb913f8d8072935ddd /document/src | |
parent | c4f93e038fcebf234b9a77e39cf929fe5e1887c2 (diff) |
Carry the Field directly instead of in a shared_ptr.
Diffstat (limited to 'document/src')
-rw-r--r-- | document/src/vespa/document/base/field.cpp | 4 | ||||
-rw-r--r-- | document/src/vespa/document/base/field.h | 14 | ||||
-rw-r--r-- | document/src/vespa/document/base/fieldpath.cpp | 18 | ||||
-rw-r--r-- | document/src/vespa/document/base/fieldpath.h | 21 | ||||
-rw-r--r-- | document/src/vespa/document/fieldset/fieldsets.h | 2 | ||||
-rw-r--r-- | document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp | 5 | ||||
-rw-r--r-- | document/src/vespa/document/update/fieldpathupdate.cpp | 1 |
7 files changed, 34 insertions, 31 deletions
diff --git a/document/src/vespa/document/base/field.cpp b/document/src/vespa/document/base/field.cpp index 99d7b5782ae..5a3fe6c1935 100644 --- a/document/src/vespa/document/base/field.cpp +++ b/document/src/vespa/document/base/field.cpp @@ -2,13 +2,15 @@ #include "field.h" #include <vespa/document/fieldvalue/fieldvalue.h> +#include <vespa/document/datatype/datatype.h> #include <vespa/vespalib/util/exceptions.h> #include <vespa/vespalib/stllike/asciistream.h> -#include <vespa/vespalib/util/stringfmt.h> #include <vespa/vespalib/util/bobhash.h> namespace document { +Field::Field() : Field("", 0, *DataType::INT, false) { } + Field::Field(const vespalib::stringref & name, int fieldId, const DataType& dataType, bool headerField) : FieldBase(name), diff --git a/document/src/vespa/document/base/field.h b/document/src/vespa/document/base/field.h index ed4cf9ed677..47ee61c9fc0 100644 --- a/document/src/vespa/document/base/field.h +++ b/document/src/vespa/document/base/field.h @@ -11,21 +11,22 @@ */ #pragma once -#include <memory> -#include <vespa/document/datatype/datatype.h> #include <vespa/document/fieldset/fieldset.h> +#include <vespa/vespalib/objects/identifiable.h> +#include <vespa/vespalib/objects/fieldbase.h> #include <set> namespace document { class FieldValue; +class DataType; class Field final : public vespalib::FieldBase, public vespalib::Identifiable, public FieldSet { const DataType *_dataType; - int _fieldId; + int _fieldId; bool _isHeaderField; public: typedef std::shared_ptr<const Field> CSP; @@ -37,7 +38,7 @@ public: } }; - typedef std::set<const Field*, FieldPtrComparator> Set; + using Set = std::set<const Field*, FieldPtrComparator>; /** * Creates a completely specified field instance. @@ -50,7 +51,7 @@ public: Field(const vespalib::stringref & name, int fieldId, const DataType &type, bool headerField); - Field() : Field("", 0, *DataType::INT, false) { } + Field(); /** * Creates a completely specified field instance. Field ids are generated @@ -62,7 +63,7 @@ public: */ Field(const vespalib::stringref & name, const DataType &dataType, bool headerField); - FieldSet* clone() const override { return new Field(*this); } + Field* clone() const override { return new Field(*this); } std::unique_ptr<FieldValue> createValue() const; // Note that only id is checked for equality. @@ -78,6 +79,7 @@ public: vespalib::string toString(bool verbose=false) const; bool contains(const FieldSet& fields) const override; Type getType() const override { return FIELD; } + bool valid() const { return _fieldId != 0; } private: int calculateIdV7(); diff --git a/document/src/vespa/document/base/fieldpath.cpp b/document/src/vespa/document/base/fieldpath.cpp index 4911f910f1e..c7aa55caab4 100644 --- a/document/src/vespa/document/base/fieldpath.cpp +++ b/document/src/vespa/document/base/fieldpath.cpp @@ -1,7 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "fieldpath.h" -#include "field.h" #include <vespa/document/datatype/arraydatatype.h> #include <vespa/document/datatype/mapdatatype.h> #include <vespa/document/datatype/weightedsetdatatype.h> @@ -22,7 +21,7 @@ FieldPathEntry::~FieldPathEntry() { } FieldPathEntry::FieldPathEntry() : _type(NONE), _name(""), - _fieldRef(), + _field(), _dataType(0), _lookupIndex(0), _lookupKey(), @@ -33,7 +32,7 @@ FieldPathEntry::FieldPathEntry() : FieldPathEntry::FieldPathEntry(const DataType & dataType, uint32_t arrayIndex) : _type(ARRAY_INDEX), _name(""), - _fieldRef(), + _field(), _dataType(&dataType), _lookupIndex(arrayIndex), _lookupKey(), @@ -46,7 +45,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, uint32_t arrayIndex) : FieldPathEntry::FieldPathEntry(const Field &fieldRef) : _type(STRUCT_FIELD), _name(fieldRef.getName()), - _fieldRef(new Field(fieldRef)), + _field(fieldRef), _dataType(&fieldRef.getDataType()), _lookupIndex(0), _lookupKey(), @@ -58,7 +57,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, const DataType& fillTy const FieldValueCP & lookupKey) : _type(MAP_KEY), _name("value"), - _fieldRef(), + _field(), _dataType(&dataType), _lookupIndex(0), _lookupKey(lookupKey), @@ -85,7 +84,7 @@ FieldPathEntry::FieldPathEntry(const DataType&, const DataType& keyType, const DataType& valueType, bool keysOnly, bool valuesOnly) : _type(keysOnly ? MAP_ALL_KEYS : MAP_ALL_VALUES), _name(keysOnly ? "key" : "value"), - _fieldRef(), + _field(), _dataType(keysOnly ? &keyType : &valueType), _lookupIndex(0), _lookupKey(), @@ -99,7 +98,7 @@ FieldPathEntry::FieldPathEntry(const DataType&, const DataType& keyType, FieldPathEntry::FieldPathEntry(const DataType & dataType, const vespalib::stringref & variableName) : _type(VARIABLE), _name(""), - _fieldRef(), + _field(), _dataType(&dataType), _lookupIndex(0), _lookupKey(), @@ -111,8 +110,7 @@ FieldPathEntry::FieldPathEntry(const DataType & dataType, const vespalib::string const DataType &FieldPathEntry::getDataType() const { - return _fieldRef ? _fieldRef->getDataType() - : *_dataType; + return _field.valid() ? _field.getDataType() : *_dataType; } FieldValue::UP FieldPathEntry::stealFieldValueToSet() const @@ -125,7 +123,7 @@ FieldPathEntry::visitMembers(vespalib::ObjectVisitor &visitor) const { visit(visitor, "type", _type); visit(visitor, "name", _name); - visit(visitor, "fieldRef", _fieldRef); + visit(visitor, "fieldRef", _field); visit(visitor, "dataType", _dataType); visit(visitor, "lookupIndex", _lookupIndex); visit(visitor, "lookupKey", _lookupKey); diff --git a/document/src/vespa/document/base/fieldpath.h b/document/src/vespa/document/base/fieldpath.h index a1681177780..822c6971435 100644 --- a/document/src/vespa/document/base/fieldpath.h +++ b/document/src/vespa/document/base/fieldpath.h @@ -1,6 +1,7 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #pragma once +#include "field.h" #include <vespa/vespalib/objects/cloneable.h> #include <vespa/document/util/identifiableid.h> #include <memory> @@ -15,7 +16,6 @@ class DataType; class MapDataType; class WeightedSetDataType; class ArrayDataType; -class Field; class FieldPathEntry : public vespalib::Identifiable { public: @@ -29,7 +29,6 @@ public: VARIABLE, NONE }; - using FieldSP = std::shared_ptr<const Field>; using FieldValueCP = vespalib::CloneablePtr<FieldValue>; /** @@ -69,8 +68,8 @@ public: const DataType& getDataType() const; - bool hasField() const { return _fieldRef.get(); } - const Field & getFieldRef() const { return *_fieldRef; } + bool hasField() const { return _field.valid(); } + const Field & getFieldRef() const { return _field; } uint32_t getIndex() const { return _lookupIndex; } @@ -90,13 +89,13 @@ public: static vespalib::string parseKey(vespalib::string & key); private: void setFillValue(const DataType & dataType); - Type _type; - vespalib::string _name; - FieldSP _fieldRef; - const DataType * _dataType; - uint32_t _lookupIndex; - FieldValueCP _lookupKey; - vespalib::string _variableName; + Type _type; + vespalib::string _name; + Field _field; + const DataType * _dataType; + uint32_t _lookupIndex; + FieldValueCP _lookupKey; + vespalib::string _variableName; mutable FieldValueCP _fillInVal; }; diff --git a/document/src/vespa/document/fieldset/fieldsets.h b/document/src/vespa/document/fieldset/fieldsets.h index fa0c7b7721f..1ff34e2d882 100644 --- a/document/src/vespa/document/fieldset/fieldsets.h +++ b/document/src/vespa/document/fieldset/fieldsets.h @@ -5,6 +5,8 @@ namespace document { +class DocumentType; + class AllFields final : public FieldSet { public: diff --git a/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp b/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp index d2204a9ebbe..3e23619be60 100644 --- a/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp +++ b/document/src/vespa/document/fieldvalue/structuredfieldvalue.hpp @@ -3,6 +3,7 @@ #pragma once #include "structuredfieldvalue.h" +#include <vespa/document/datatype/datatype.h> #include <vespa/vespalib/util/exceptions.h> namespace document { @@ -13,8 +14,7 @@ StructuredFieldValue::getAs(const Field &field) const { FieldValue::UP val = getValue(field); T *t = Identifiable::cast<T *>(val.get()); if (val.get() && !t) { - throw vespalib::IllegalStateException("Field " + field.toString() - + " has unexpected type.", VESPA_STRLOC); + throw vespalib::IllegalStateException("Field " + field.toString() + " has unexpected type.", VESPA_STRLOC); } val.release(); return std::unique_ptr<T>(t); @@ -37,4 +37,3 @@ StructuredFieldValue::set(const vespalib::stringref & fieldName, PrimitiveType v } } // document - diff --git a/document/src/vespa/document/update/fieldpathupdate.cpp b/document/src/vespa/document/update/fieldpathupdate.cpp index c6f597f74e3..bbe38aaeac0 100644 --- a/document/src/vespa/document/update/fieldpathupdate.cpp +++ b/document/src/vespa/document/update/fieldpathupdate.cpp @@ -1,5 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. #include "fieldpathupdates.h" +#include <vespa/document/datatype/datatype.h> #include <vespa/document/fieldvalue/document.h> #include <vespa/document/fieldvalue/iteratorhandler.h> #include <vespa/document/select/parser.h> |