From 586b4486f4661681b8fe0c639830bd9db3986d5a Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Wed, 15 Apr 2015 20:42:01 +0200 Subject: Simplify resolution callback, move NullResolveCallback to ResolutionCallbacks.cpp --- src/core/model/ResolutionCallbacks.cpp | 5 ++++- src/core/model/ResolutionCallbacks.hpp | 19 +++++++++---------- src/core/model/Typesystem.cpp | 25 +++++++------------------ 3 files changed, 20 insertions(+), 29 deletions(-) (limited to 'src/core/model') diff --git a/src/core/model/ResolutionCallbacks.cpp b/src/core/model/ResolutionCallbacks.cpp index 8c920f1..88f0aa8 100644 --- a/src/core/model/ResolutionCallbacks.cpp +++ b/src/core/model/ResolutionCallbacks.cpp @@ -19,5 +19,8 @@ #include "ResolutionCallbacks.hpp" namespace ousia { - // Do nothing here, just make sure the header compiles +Rooted NullResolveCallback(const Rtti *, const std::vector &) +{ + return nullptr; +} } diff --git a/src/core/model/ResolutionCallbacks.hpp b/src/core/model/ResolutionCallbacks.hpp index 2d9465d..2ac78a6 100644 --- a/src/core/model/ResolutionCallbacks.hpp +++ b/src/core/model/ResolutionCallbacks.hpp @@ -57,20 +57,19 @@ using ResolutionResultCallback = std::function< /** * The ResolveCallback can be used to trigger the resolution of a certain node. * - * @param async if true, the resolution may be deferred. In this case the - * resultCallback may be called at any later point in the program. * @param type is the type of node that should be resolved. * @param path is the path for which a node should be resolved. - * @param resultCallback is the callback function to which the result of - * the resolution process is passed. This function is called once the - * resolution was successful. - * @return true if the resolution was immediately successful. This does not - * mean, that the resolved object does not exist, as it may be resolved - * later. + * @return a the resolved node or nullptr if the resolution was not successful. */ using ResolveCallback = std::function< - bool(bool async, const Rtti *type, const std::vector &path, - ResolutionResultCallback resultCallback)>; + Rooted(const Rtti *type, const std::vector &path)>; + +/** + * Empty implementation of the ResolveCallback, always returns nullptr. + */ +Rooted NullResolveCallback(const Rtti *, + const std::vector &); + } #endif /* _OUSIA_RESOLUTION_CALLBACKS_HPP_ */ diff --git a/src/core/model/Typesystem.cpp b/src/core/model/Typesystem.cpp index 48e8d90..86ee811 100644 --- a/src/core/model/Typesystem.cpp +++ b/src/core/model/Typesystem.cpp @@ -25,15 +25,6 @@ namespace ousia { -/* Static helper functions */ - -static bool NullResolveCallback(bool, const Rtti *, - const std::vector &, - ResolutionResultCallback) -{ - return false; -} - /* Class Type */ bool Type::build(Variant &data, Logger &logger, @@ -41,15 +32,13 @@ bool Type::build(Variant &data, Logger &logger, { // If the given variant is marked as "magic", try to resolve the real value if (data.isMagic()) { - Rooted constant; - if (resolveCallback( - false, &RttiTypes::Constant, Utils::split(data.asMagic(), '.'), - [&constant](Handle resolved, Handle owner, - Logger &logger) mutable { - // Copy the resolution result out of this function - constant = resolved.cast(); - })) { - // Check whether the inner type of the constant is correct + // Try to resolve a constant + Rooted constant = + resolveCallback(&RttiTypes::Constant, + Utils::split(data.asMagic(), '.')).cast(); + + // Check whether the inner type of the constant is correct + if (constant != nullptr) { Rooted constantType = constant->getType(); if (!constantType->checkIsa(this)) { logger.error( -- cgit v1.2.3