summaryrefslogtreecommitdiffstats
path: root/document
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-01-25 19:17:01 +0000
committerHenning Baldersheim <balder@yahoo-inc.com>2021-01-25 19:18:24 +0000
commit4912032fc031820b9ac0ed290f38033714d3cd67 (patch)
treed1690b61652953a68781c1658d8bdc8a64bfb3c4 /document
parent8f2798309ee0bff2a2747b982bb509dab45a4a4f (diff)
Use lambda over closure.
Diffstat (limited to 'document')
-rw-r--r--document/src/tests/repo/documenttyperepo_test.cpp10
-rw-r--r--document/src/vespa/document/fieldset/fieldsetrepo.cpp4
-rw-r--r--document/src/vespa/document/repo/documenttyperepo.cpp4
-rw-r--r--document/src/vespa/document/repo/documenttyperepo.h32
-rw-r--r--document/src/vespa/document/select/bodyfielddetector.cpp4
5 files changed, 39 insertions, 15 deletions
diff --git a/document/src/tests/repo/documenttyperepo_test.cpp b/document/src/tests/repo/documenttyperepo_test.cpp
index 0bc80ebcd16..7d17a3cfa11 100644
--- a/document/src/tests/repo/documenttyperepo_test.cpp
+++ b/document/src/tests/repo/documenttyperepo_test.cpp
@@ -392,10 +392,6 @@ TEST("requireThatDocumentsCanUseOtherDocumentTypes") {
EXPECT_TRUE(dynamic_cast<const DocumentType *>(&type));
}
-void storeId(set<int> *s, const DocumentType &type) {
- s->insert(type.getId());
-}
-
TEST("requireThatDocumentTypesCanBeIterated") {
DocumenttypesConfigBuilderHelper builder;
builder.document(doc_type_id, type_name,
@@ -405,7 +401,8 @@ TEST("requireThatDocumentTypesCanBeIterated") {
DocumentTypeRepo repo(builder.config());
set<int> ids;
- repo.forEachDocumentType(*makeClosure(storeId, &ids));
+ repo.forEachDocumentType(*DocumentTypeRepo::makeLambda(
+ [&ids](const DocumentType &type) { ids.insert(type.getId()); }));
EXPECT_EQUAL(3u, ids.size());
ASSERT_TRUE(ids.count(DataType::T_DOCUMENT));
@@ -436,8 +433,7 @@ TEST("requireThatBuildFromConfigWorks") {
TEST("requireThatStructsCanBeRecursive") {
DocumenttypesConfigBuilderHelper builder;
builder.document(doc_type_id, type_name,
- Struct(header_name).setId(header_id).addField(field_name,
- header_id),
+ Struct(header_name).setId(header_id).addField(field_name, header_id),
Struct(body_name));
DocumentTypeRepo repo(builder.config());
diff --git a/document/src/vespa/document/fieldset/fieldsetrepo.cpp b/document/src/vespa/document/fieldset/fieldsetrepo.cpp
index bf9c9923572..f16387810ce 100644
--- a/document/src/vespa/document/fieldset/fieldsetrepo.cpp
+++ b/document/src/vespa/document/fieldset/fieldsetrepo.cpp
@@ -119,7 +119,9 @@ FieldSetRepo::FieldSetRepo(const DocumentTypeRepo& repo)
: _doumentTyperepo(repo),
_configuredFieldSets()
{
- repo.forEachDocumentType(*vespalib::makeClosure(this, &FieldSetRepo::configureDocumentType));
+ repo.forEachDocumentType(*DocumentTypeRepo::makeLambda([&](const DocumentType &type) {
+ configureDocumentType(type);
+ }));
}
FieldSetRepo::~FieldSetRepo() = default;
diff --git a/document/src/vespa/document/repo/documenttyperepo.cpp b/document/src/vespa/document/repo/documenttyperepo.cpp
index 578d2999038..50ab6aaa646 100644
--- a/document/src/vespa/document/repo/documenttyperepo.cpp
+++ b/document/src/vespa/document/repo/documenttyperepo.cpp
@@ -587,9 +587,9 @@ DocumentTypeRepo::getAnnotationType(const DocumentType &doc_type, int32_t id) co
}
void
-DocumentTypeRepo::forEachDocumentType(Closure1<const DocumentType &> &c) const {
+DocumentTypeRepo::forEachDocumentType(Handler & handler) const {
for (const auto & entry : *_doc_types) {
- c.call(*entry.second->doc_type);
+ handler.handle(*entry.second->doc_type);
}
}
diff --git a/document/src/vespa/document/repo/documenttyperepo.h b/document/src/vespa/document/repo/documenttyperepo.h
index fd17bd5640a..4e3a1b07619 100644
--- a/document/src/vespa/document/repo/documenttyperepo.h
+++ b/document/src/vespa/document/repo/documenttyperepo.h
@@ -19,11 +19,21 @@ struct DataTypeRepo;
class DocumentType;
class DocumentTypeRepo {
- std::unique_ptr<internal::DocumentTypeMap> _doc_types;
- const DocumentType * _default;
-
public:
using DocumenttypesConfig = const internal::InternalDocumenttypesType;
+ struct Handler {
+ virtual ~Handler() = default;
+ virtual void handle(const DocumentType & type) = 0;
+ };
+
+
+ template <class FunctionType>
+ static std::unique_ptr<Handler>
+ makeLambda(FunctionType &&function)
+ {
+ return std::make_unique<LambdaHandler<std::decay_t<FunctionType>>>
+ (std::forward<FunctionType>(function));
+ }
// This one should only be used for testing. If you do not have any config.
explicit DocumentTypeRepo(const DocumentType & docType);
@@ -39,8 +49,22 @@ public:
const DataType *getDataType(const DocumentType &doc_type, int32_t id) const;
const DataType *getDataType(const DocumentType &doc_type, vespalib::stringref name) const;
const AnnotationType *getAnnotationType(const DocumentType &doc_type, int32_t id) const;
- void forEachDocumentType(vespalib::Closure1<const DocumentType &> &c) const;
+ void forEachDocumentType(Handler & handler) const;
const DocumentType *getDefaultDocType() const { return _default; }
+private:
+ template <class FunctionType>
+ class LambdaHandler : public Handler {
+ FunctionType _func;
+ public:
+ LambdaHandler(FunctionType &&func) : _func(std::move(func)) {}
+ LambdaHandler(const LambdaHandler &) = delete;
+ LambdaHandler & operator = (const LambdaHandler &) = delete;
+ ~LambdaHandler() override = default;
+ void handle(const DocumentType & type) override { _func(type); }
+ };
+
+ std::unique_ptr<internal::DocumentTypeMap> _doc_types;
+ const DocumentType * _default;
};
} // namespace document
diff --git a/document/src/vespa/document/select/bodyfielddetector.cpp b/document/src/vespa/document/select/bodyfielddetector.cpp
index 3d32813621d..d1961810c7a 100644
--- a/document/src/vespa/document/select/bodyfielddetector.cpp
+++ b/document/src/vespa/document/select/bodyfielddetector.cpp
@@ -28,7 +28,9 @@ BodyFieldDetector::detectFieldType(const FieldValueNode *expr, const DocumentTyp
void
BodyFieldDetector::visitFieldValueNode(const FieldValueNode& expr)
{
- _repo.forEachDocumentType(*makeClosure(this, &BodyFieldDetector::detectFieldType, &expr));
+ _repo.forEachDocumentType(*DocumentTypeRepo::makeLambda([&](const DocumentType &type) {
+ detectFieldType(&expr, type);
+ }));
}