From 884e3600bda324cbc7afd8b29e503b333d58a561 Mon Sep 17 00:00:00 2001 From: Ichthyostega Date: Sun, 17 Oct 2010 06:30:56 +0200 Subject: [PATCH] experimental: allow implicit converisons to/from Placement-ID --- src/proc/mobject/mobject-ref.hpp | 14 ++++++++++++-- src/proc/mobject/session/scope.cpp | 4 ++++ src/proc/mobject/session/scope.hpp | 3 +++ src/proc/mobject/session/session-impl.hpp | 8 +++++++- .../session/session-service-explore-scope.hpp | 1 + src/proc/mobject/session/session-services.cpp | 7 +++++++ .../session/session-element-query-test.cpp | 15 ++++++++------- 7 files changed, 42 insertions(+), 10 deletions(-) diff --git a/src/proc/mobject/mobject-ref.hpp b/src/proc/mobject/mobject-ref.hpp index 3820a3e21..01e861482 100644 --- a/src/proc/mobject/mobject-ref.hpp +++ b/src/proc/mobject/mobject-ref.hpp @@ -93,7 +93,8 @@ namespace mobject { : public lib::Handle { typedef lib::Handle _Handle; - + typedef PlacementMO::Id _Id; + PlacementRef pRef_; using _Handle::smPtr_; @@ -126,13 +127,22 @@ namespace mobject { /** allow to use a MObjectRef like a (bare) PlacementRef - * @note not test if this MObjectRef is NIL */ + * @note no test if this MObjectRef is NIL */ PlacementRef const& getRef() const { return pRef_; } + /** allow to use MObjectRef instead of a Placement-ID (hash) + * @todo not sure if that leads to unexpected conversions, + * because the underlying implementation can be + * converted to size_t */ //////////////////////////TICKET #682 revisit that decision later + operator _Id const&() const + { + return pRef_; + } + /** resolves the referred placement to an diff --git a/src/proc/mobject/session/scope.cpp b/src/proc/mobject/session/scope.cpp index 30fab781c..2143cb4f5 100644 --- a/src/proc/mobject/session/scope.cpp +++ b/src/proc/mobject/session/scope.cpp @@ -68,6 +68,10 @@ namespace session { : anchor_(constitutingPlacement) { } + Scope::Scope (PlacementMO::ID const& constitutingPlacement) + : anchor_(constitutingPlacement) + { } + Scope::Scope () : anchor_() diff --git a/src/proc/mobject/session/scope.hpp b/src/proc/mobject/session/scope.hpp index c9806ddce..a4b9ca3fd 100644 --- a/src/proc/mobject/session/scope.hpp +++ b/src/proc/mobject/session/scope.hpp @@ -72,6 +72,9 @@ namespace session { Scope (PlacementMO const& constitutingPlacement); Scope (); ///< unlocated NIL scope + explicit + Scope (PlacementMO::ID const& constitutingPlacement); + Scope (Scope const&); Scope& operator= (Scope const&); diff --git a/src/proc/mobject/session/session-impl.hpp b/src/proc/mobject/session/session-impl.hpp index 247450bba..e0bec4767 100644 --- a/src/proc/mobject/session/session-impl.hpp +++ b/src/proc/mobject/session/session-impl.hpp @@ -179,13 +179,19 @@ namespace session { { return resolvingWrapper_; } - + PlacementMO& getScope (PlacementMO const& placement2locate) { return IMPL::getPlacementIndex().getScope(placement2locate); } + PlacementMO& + getScope (PlacementMO::ID const& placement2locate) + { + return IMPL::getPlacementIndex().getScope(placement2locate); + } + PlacementMO& getScopeRoot() { diff --git a/src/proc/mobject/session/session-service-explore-scope.hpp b/src/proc/mobject/session/session-service-explore-scope.hpp index 580389d63..98d998a2f 100644 --- a/src/proc/mobject/session/session-service-explore-scope.hpp +++ b/src/proc/mobject/session/session-service-explore-scope.hpp @@ -70,6 +70,7 @@ namespace session { static QueryResolver const& getResolver(); static PlacementMO& getScope (PlacementMO const&); + static PlacementMO& getScope (PlacementMO::ID const&); static PlacementMO& getScopeRoot(); }; diff --git a/src/proc/mobject/session/session-services.cpp b/src/proc/mobject/session/session-services.cpp index f3b0a5d81..76ebe2d58 100644 --- a/src/proc/mobject/session/session-services.cpp +++ b/src/proc/mobject/session/session-services.cpp @@ -162,6 +162,13 @@ namespace session { } + PlacementMO& + SessionServiceExploreScope::getScope (PlacementMO::ID const& placementToLocate) + { + return SessionImplAPI::current->getScope(placementToLocate); + } + + /** @return root scope of the current model (session datastructure) */ PlacementMO& SessionServiceExploreScope::getScopeRoot() diff --git a/tests/components/proc/mobject/session/session-element-query-test.cpp b/tests/components/proc/mobject/session/session-element-query-test.cpp index 3c5a9d96c..9215b97fa 100644 --- a/tests/components/proc/mobject/session/session-element-query-test.cpp +++ b/tests/components/proc/mobject/session/session-element-query-test.cpp @@ -100,7 +100,8 @@ namespace test { MORef dummy1 = queryAPI.pick (elementID_contains("MO2")); CHECK (dummy1); CHECK (dummy1->isValid()); - INFO (test, "Location in Tree: %s", cStr(ScopePath(dummy1.getPlacement()))); + INFO (test, "Location in Tree: %s", cStr(ScopePath(dummy1.getPlacement()))); + string elementID = dummy1->operator string(); CHECK (contains (elementID, "MO2")); @@ -115,12 +116,12 @@ namespace test { // put aside a new handle holding onto the MObject PDum newPlacement(dummy1.getPlacement()); - CHECK (testSession->contains(dummy1.getRef())); + CHECK (testSession->contains(dummy1)); CHECK (!testSession->contains(newPlacement)); // and now remove the placement and all contained elements - testSession->clear (dummy1.getRef()); - CHECK (!testSession->contains(dummy1.getRef())); + testSession->clear (dummy1); + CHECK (!testSession->contains(dummy1)); MORef findAgain = queryAPI.pick (elementID_contains(specificID)); CHECK (!findAgain); // empty result because searched element was removed from session... @@ -128,14 +129,14 @@ namespace test { MORef otherElm = queryAPI.pick (elementID_contains("MO1")); CHECK (otherElm); // now pick just some other arbitrary element - testSession->insert(newPlacement, otherElm.getRef()); + testSession->insert(newPlacement, otherElm); dummy2 = queryAPI.pick (elementID_contains(specificID)); CHECK (dummy2); CHECK (dummy2 != dummy1); CHECK (dummy2 != newPlacement); CHECK (isSharedPointee(newPlacement, dummy2.getPlacement())); - CHECK (Scope::containing(dummy2.getPlacement()) == Scope(otherElm.getPlacement())); - INFO (test, "New treelocation: %s", cStr(ScopePath(dummy2.getPlacement()))); + CHECK (Scope::containing (dummy2.getRef()) == Scope (otherElm)); + INFO (test, "New treelocation: %s", cStr(ScopePath(dummy2.getPlacement()))); } };