From c7cb92f43f97ef5558eee0d7be6f18192134f3ec Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sun, 12 Apr 2015 02:50:18 +0200 Subject: Replace NodeVector by ManagedVector where NodeVector functionality is not needed. Reduces calls to "Manager.registerEvent" to <10% of original value --- src/core/model/Document.cpp | 9 +++++---- src/core/model/Ontology.cpp | 48 +++++++++++++++++++++++---------------------- src/core/model/Ontology.hpp | 17 ++++++++-------- 3 files changed, 39 insertions(+), 35 deletions(-) (limited to 'src/core/model') diff --git a/src/core/model/Document.cpp b/src/core/model/Document.cpp index 894330b..411a755 100644 --- a/src/core/model/Document.cpp +++ b/src/core/model/Document.cpp @@ -93,7 +93,8 @@ bool DocumentEntity::doValidate(Logger &logger) const * gather all fields of superclasses as well, that have not been * overridden in the subclasses. */ - NodeVector fieldDescs = descriptor->getFieldDescriptors(); + ManagedVector fieldDescs = + descriptor->getFieldDescriptors(); // iterate over every field for (unsigned int f = 0; f < fields.size(); f++) { // we have a special check for primitive fields. @@ -137,9 +138,9 @@ bool DocumentEntity::doValidate(Logger &logger) const std::unordered_set childClasses; { - NodeVector tmp = + ManagedVector tmp = fieldDescs[f]->getChildrenWithSubclasses(); - for (auto s : tmp) { + for (const auto &s : tmp) { childClasses.insert(s.get()); } } @@ -999,4 +1000,4 @@ const Rtti AnnotationEntity = .parent(&Node) .composedOf({&StructuredEntity, &DocumentPrimitive, &Anchor}); } -} \ No newline at end of file +} diff --git a/src/core/model/Ontology.cpp b/src/core/model/Ontology.cpp index d63c5e7..89710d3 100644 --- a/src/core/model/Ontology.cpp +++ b/src/core/model/Ontology.cpp @@ -67,7 +67,7 @@ static NodeVector pathTo(const Node *start, Logger &logger, if (start->isa(&RttiTypes::Descriptor)) { const Descriptor *desc = static_cast(start); // initially put every field descriptor on the queue. - NodeVector fields = desc->getFieldDescriptors(); + ManagedVector fields = desc->getFieldDescriptors(); for (auto fd : fields) { if (fd == target) { @@ -115,7 +115,7 @@ static NodeVector pathTo(const Node *start, Logger &logger, static_cast(current->node); // look through all fields. - NodeVector fields = strct->getFieldDescriptors(); + ManagedVector fields = strct->getFieldDescriptors(); for (auto fd : fields) { // if we found our target, break off the search in this branch. if (fd == target) { @@ -182,9 +182,9 @@ struct CollectState { * TODO: @Benjmin Documentation! */ template -static NodeVector collect(const Node *start, F match) +static ManagedVector collect(const Node *start, F match) { - NodeVector res; + ManagedVector res; // Queue and set for breadth-first search of the document graph std::queue q; @@ -205,7 +205,7 @@ static NodeVector collect(const Node *start, F match) Rooted strct{static_cast(state.n)}; // look through all fields. - NodeVector fields = strct->getFieldDescriptors(); + ManagedVector fields = strct->getFieldDescriptors(); for (auto fd : fields) { // Store all matching items if (match(fd, state.depth)) { @@ -403,7 +403,7 @@ bool FieldDescriptor::doValidate(Logger &logger) const static void gatherSubclasses( std::unordered_set &visited, - NodeVector &res, Handle strct) + ManagedVector &res, Handle strct) { // this check is to prevent cycles. if (!visited.insert(strct.get()).second) { @@ -419,10 +419,11 @@ static void gatherSubclasses( } } -NodeVector FieldDescriptor::getChildrenWithSubclasses() const +ManagedVector FieldDescriptor::getChildrenWithSubclasses() + const { std::unordered_set visited; - NodeVector res; + ManagedVector res; for (auto c : children) { res.push_back(c); gatherSubclasses(visited, res, c); @@ -455,10 +456,11 @@ NodeVector FieldDescriptor::pathTo(Handle field, bool success = false; return ousia::pathTo(this, logger, field, success); } -NodeVector FieldDescriptor::getDefaultFields() const + +ManagedVector FieldDescriptor::getDefaultFields() const { // TODO: In principle a cast would be nicer here, but for now we copy. - NodeVector nodes = collect(this, [](Handle n, size_t depth) { + ManagedVector nodes = collect(this, [](Handle n, size_t depth) { if (!n->isa(&RttiTypes::FieldDescriptor)) { return false; } @@ -466,7 +468,7 @@ NodeVector FieldDescriptor::getDefaultFields() const return f->getFieldType() == FieldDescriptor::FieldType::TREE && f->isPrimitive(); }); - NodeVector res; + ManagedVector res; for (auto n : nodes) { res.push_back(n.cast()); } @@ -584,10 +586,10 @@ std::pair, bool> Descriptor::pathTo( return std::make_pair(path, success); } -NodeVector Descriptor::getDefaultFields() const +ManagedVector Descriptor::getDefaultFields() const { // TODO: In principle a cast would be nicer here, but for now we copy. - NodeVector nodes = collect(this, [](Handle n, size_t depth) { + ManagedVector nodes = collect(this, [](Handle n, size_t depth) { if (!n->isa(&RttiTypes::FieldDescriptor)) { return false; } @@ -595,7 +597,7 @@ NodeVector Descriptor::getDefaultFields() const return f->getFieldType() == FieldDescriptor::FieldType::TREE && f->isPrimitive(); }); - NodeVector res; + ManagedVector res; for (auto n : nodes) { res.push_back(n.cast()); } @@ -605,7 +607,7 @@ NodeVector Descriptor::getDefaultFields() const NodeVector Descriptor::getPermittedChildren() const { // TODO: In principle a cast would be nicer here, but for now we copy. - NodeVector nodes = collect(this, [](Handle n, size_t depth) { + ManagedVector nodes = collect(this, [](Handle n, size_t depth) { return n->isa(&RttiTypes::StructuredClass); }); NodeVector res; @@ -615,7 +617,7 @@ NodeVector Descriptor::getPermittedChildren() const return res; } -static ssize_t getFieldDescriptorIndex(const NodeVector &fds, +static ssize_t getFieldDescriptorIndex(const ManagedVector &fds, const std::string &name) { if (fds.empty()) { @@ -644,7 +646,7 @@ static ssize_t getFieldDescriptorIndex(const NodeVector &fds, ssize_t Descriptor::getFieldDescriptorIndex(const std::string &name) const { - NodeVector fds = getFieldDescriptors(); + ManagedVector fds = getFieldDescriptors(); return ousia::getFieldDescriptorIndex(fds, name); } @@ -663,7 +665,7 @@ ssize_t Descriptor::getFieldDescriptorIndex(Handle fd) const Rooted Descriptor::getFieldDescriptor( const std::string &name) const { - NodeVector fds = getFieldDescriptors(); + ManagedVector fds = getFieldDescriptors(); ssize_t idx = ousia::getFieldDescriptorIndex(fds, name); if (idx != -1) { return fds[idx]; @@ -673,7 +675,7 @@ Rooted Descriptor::getFieldDescriptor( Rooted Descriptor::getFieldDescriptor(size_t idx) const { - NodeVector fds = getFieldDescriptors(); + ManagedVector fds = getFieldDescriptors(); if (idx < fds.size()) { return fds[idx]; } @@ -925,7 +927,7 @@ void StructuredClass::removeSubclass(Handle sc, Logger &logger) } Rooted StructuredClass::gatherFieldDescriptors( - NodeVector ¤t, + ManagedVector ¤t, std::unordered_set &visited, std::set &overriddenFields, bool hasTREE) const { @@ -934,7 +936,7 @@ Rooted StructuredClass::gatherFieldDescriptors( return nullptr; } Rooted mainField; - NodeVector tmp; + ManagedVector tmp; // first gather the non-overridden fields. for (auto f : Descriptor::getFieldDescriptors()) { if (overriddenFields.insert(f->getName()).second) { @@ -965,10 +967,10 @@ Rooted StructuredClass::gatherFieldDescriptors( return mainField; } -NodeVector StructuredClass::getFieldDescriptors() const +ManagedVector StructuredClass::getFieldDescriptors() const { // in this case we return a NodeVector of Rooted entries without owner. - NodeVector vec; + ManagedVector vec; std::unordered_set visited; std::set overriddenFields; Rooted mainField = diff --git a/src/core/model/Ontology.hpp b/src/core/model/Ontology.hpp index 3ef3b65..2533b9d 100644 --- a/src/core/model/Ontology.hpp +++ b/src/core/model/Ontology.hpp @@ -300,7 +300,7 @@ public: * the Structure Tree of instances of this field including subclasses of * children, which are allowed directly. */ - NodeVector getChildrenWithSubclasses() const; + ManagedVector getChildrenWithSubclasses() const; /** * Adds a StructuredClass whose instances shall be allowed as children in @@ -449,7 +449,7 @@ public: * @return a vector of all TREE fields that are allowed as structure tree * children of an instance of this Descriptor. */ - NodeVector getDefaultFields() const; + ManagedVector getDefaultFields() const; /** * Returns the name of this FieldDescriptor or the default field name @@ -643,9 +643,10 @@ public: * * @return the NodeVector of all FieldDescriptors of this Descriptor. */ - virtual NodeVector getFieldDescriptors() const + virtual ManagedVector getFieldDescriptors() const { - return fieldDescriptors; + return ManagedVector(const_cast(this), fieldDescriptors.begin(), + fieldDescriptors.end()); } /** @@ -856,7 +857,7 @@ public: * @return a vector of all TREE fields that are allowed as structure tree * children of an instance of this Descriptor. */ - NodeVector getDefaultFields() const; + ManagedVector getDefaultFields() const; /** * Returns a vector of all StructuredClasses that are allowed as children @@ -1035,7 +1036,7 @@ private: * Helper method for getFieldDescriptors. */ Rooted gatherFieldDescriptors( - NodeVector ¤t, + ManagedVector ¤t, std::unordered_set &visited, std::set &overriddenFields, bool hasTREE) const; @@ -1170,7 +1171,7 @@ public: * * @return a NodeVector of all FieldDescriptors of this StructuredClass. */ - NodeVector getFieldDescriptors() const override; + ManagedVector getFieldDescriptors() const override; bool isTransparent() const { return transparent; } @@ -1483,4 +1484,4 @@ extern const Rtti Ontology; } } -#endif /* _OUSIA_MODEL_ONTOLOGY_HPP_ */ \ No newline at end of file +#endif /* _OUSIA_MODEL_ONTOLOGY_HPP_ */ -- cgit v1.2.3