diff options
author | John Wiegley <johnw@newartisans.com> | 2008-10-29 02:00:00 -0600 |
---|---|---|
committer | John Wiegley <johnw@newartisans.com> | 2008-10-29 02:00:00 -0600 |
commit | 5d41388ff3e971d47f8fb7938be49f3dca85c3d1 (patch) | |
tree | 561ffc56c58f11adf9f2a702a9a0be9ebadffa41 | |
parent | db4ee1ec72c933424be143cb57b7b3546c105293 (diff) | |
download | fork-ledger-5d41388ff3e971d47f8fb7938be49f3dca85c3d1.tar.gz fork-ledger-5d41388ff3e971d47f8fb7938be49f3dca85c3d1.tar.bz2 fork-ledger-5d41388ff3e971d47f8fb7938be49f3dca85c3d1.zip |
Corrected the way that scopes are found so that xact_t can also be found as an
item_t (which it also is).
-rw-r--r-- | src/scope.h | 48 |
1 files changed, 16 insertions, 32 deletions
diff --git a/src/scope.h b/src/scope.h index 49c77d1c..cd6fc15a 100644 --- a/src/scope.h +++ b/src/scope.h @@ -56,28 +56,8 @@ public: else return NULL_VALUE; } - - virtual optional<scope_t&> find_scope(const std::type_info&, bool = true) { - return none; - } }; -template <typename T> -inline T& find_scope(scope_t& scope, bool skip_this = true) { - optional<scope_t&> found = scope.find_scope(typeid(T), skip_this); - assert(found); - return static_cast<T&>(*found); -} - -template <typename T> -inline optional<T&> maybe_find_scope(scope_t& scope, bool skip_this = true) { - optional<scope_t&> found = scope.find_scope(typeid(T), skip_this); - if (found) - return optional<T&>(static_cast<T&>(*found)); - else - return none; -} - class child_scope_t : public noncopyable, public scope_t { public: @@ -99,20 +79,24 @@ public: return parent->lookup(name); return expr_t::ptr_op_t(); } +}; - virtual optional<scope_t&> find_scope(const std::type_info& type, - bool skip_this = true) { - for (scope_t * ptr = (skip_this ? parent : this); ptr; ) { - if (typeid(*ptr) == type) - return *ptr; - if (child_scope_t * scope = dynamic_cast<child_scope_t *>(ptr)) - ptr = scope->parent; - else - ptr = NULL; - } - return none; + +template <typename T> +inline T& find_scope(child_scope_t& scope, bool skip_this = true) +{ + for (scope_t * ptr = (skip_this ? scope.parent : &scope); ptr; ) { + T * sought = dynamic_cast<T *>(ptr); + if (sought) + return *sought; + if (child_scope_t * scope = dynamic_cast<child_scope_t *>(ptr)) + ptr = scope->parent; + else + ptr = NULL; } -}; + throw_(std::runtime_error, "Could not find scope"); + return reinterpret_cast<T&>(scope); // never executed +} class symbol_scope_t : public child_scope_t { |