From 4284cda04b3a1b1f4c5d4368cc8663d01b6925c6 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Tue, 3 Feb 2015 02:28:20 +0100 Subject: Some refactoring, added function for extracting current type signature --- src/core/parser/ParserScope.cpp | 70 ++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 28 deletions(-) (limited to 'src/core/parser/ParserScope.cpp') diff --git a/src/core/parser/ParserScope.cpp b/src/core/parser/ParserScope.cpp index efd07d1..42225ca 100644 --- a/src/core/parser/ParserScope.cpp +++ b/src/core/parser/ParserScope.cpp @@ -61,6 +61,38 @@ Rooted ParserScopeBase::resolve(const Rtti &type, return nullptr; } +bool ParserScopeBase::isEmpty() const { return nodes.empty(); } + +Rooted ParserScopeBase::getRoot() const { return nodes.front(); } + +Rooted ParserScopeBase::getLeaf() const { return nodes.back(); } + +const NodeVector &ParserScopeBase::getStack() const { return nodes; } + +std::vector ParserScopeBase::getStackTypeSignature() const +{ + std::vector res; + res.reserve(nodes.size()); + for (size_t i = 0; i < nodes.size(); i++) { + res.push_back(&(nodes[i]->type())); + } + return res; +} + +Rooted ParserScopeBase::select(RttiSet types, int maxDepth) +{ + ssize_t minDepth = 0; + if (maxDepth >= 0) { + minDepth = static_cast(nodes.size()) - (maxDepth + 1); + } + for (ssize_t i = nodes.size() - 1; i >= minDepth; i--) { + if (nodes[i]->type().isOneOf(types)) { + return nodes[i]; + } + } + return nullptr; +} + /* Class DeferredResolution */ DeferredResolution::DeferredResolution(const NodeVector &nodes, @@ -190,24 +222,6 @@ void ParserScope::pop() NodeVector ParserScope::getTopLevelNodes() const { return topLevelNodes; } -Rooted ParserScope::getRoot() const { return nodes.front(); } - -Rooted ParserScope::getLeaf() const { return nodes.back(); } - -Rooted ParserScope::select(RttiSet types, int maxDepth) -{ - ssize_t minDepth = 0; - if (maxDepth >= 0) { - minDepth = static_cast(nodes.size()) - (maxDepth + 1); - } - for (ssize_t i = nodes.size() - 1; i >= minDepth; i--) { - if (nodes[i]->type().isOneOf(types)) { - return nodes[i]; - } - } - return nullptr; -} - void ParserScope::setFlag(ParserFlag flag, bool value) { // Fetch the current stack depth @@ -368,17 +382,17 @@ bool ParserScope::resolveTypeWithValue(const std::vector &path, ParserScope scope = fork(); Variant *valuePtr = &value; - return resolveType(path, owner, logger, - [=](Handle resolved, Handle owner, - Logger &logger) mutable { - if (resolved != nullptr) { - Rooted type = resolved.cast(); - scope.resolveValue(*valuePtr, type, owner, logger); - } + return resolveType( + path, owner, logger, + [=](Handle resolved, Handle owner, Logger &logger) mutable { + if (resolved != nullptr) { + Rooted type = resolved.cast(); + scope.resolveValue(*valuePtr, type, owner, logger); + } - // Call the result callback with the type - resultCallback(resolved, owner, logger); - }); + // Call the result callback with the type + resultCallback(resolved, owner, logger); + }); } bool ParserScope::resolveTypeWithValue(const std::string &name, -- cgit v1.2.3