diff --git a/src/lib/wrapper.hpp b/src/lib/wrapper.hpp index 04f6f42cd..b37f79ce7 100644 --- a/src/lib/wrapper.hpp +++ b/src/lib/wrapper.hpp @@ -217,6 +217,65 @@ namespace wrapper { } }; + /** + * Specialisation of the ItemWrapper to deal with references, + * as if they were pointer values. Allows the reference value + * to be default constructed to \c NULL and to be re-assigned. + */ + template + class ItemWrapper + : public BoolCheckable > + { +// mutable + TY * content_; + + + public: + ItemWrapper() + : content_() + { } + + explicit + ItemWrapper(TY& o) + : content_( &o ) + { } + + + /* using default copy and assignment */ + + /** allowing to re-bind the reference */ + ItemWrapper& + operator= (TY& otherRef) + { + content_ = &otherRef; + return *this; + } + + + + /* == value access == */ + TY& + operator* () const + { + if (!content_) + throw lumiera::error::State ("accessing uninitialised reference wrapper" + , LUMIERA_ERROR_BOTTOM_VALUE); + return *content_; + } + + bool + isValid () const + { + return bool(content_); + } + + void + reset () + { + content_ = 0; + } + }; + }} // namespace lib::wrap diff --git a/tests/lib/item-wrapper-test.cpp b/tests/lib/item-wrapper-test.cpp index 28226bd7e..1bdf37e89 100644 --- a/tests/lib/item-wrapper-test.cpp +++ b/tests/lib/item-wrapper-test.cpp @@ -79,28 +79,31 @@ namespace test{ virtual void run (Arg) { - UNIMPLEMENTED ("check ItemWrapper"); + ulong l1 (rand() % 1000); + ulong l2 (rand() % 1000); + string s1 (randStr(50)); + string s2 (randStr(50)); + const char* cp (s1.c_str()); +// Tracker t1; +// Tracker t2; - ulong ll (rand() % 1000); - string ss (randStr(50)); - const char* cp (ss.c_str()); -// Tracker tt; - - verifyWrapper (ItemWrapper (ll), ll, -123); + verifyWrapper (l1, l2); + verifyWrapper (l1, l2); #if false //////////////////////////////////////////////////////////////////////////////////////////////////////////TICKET 475 !!!!!!!!! - verifyWrapper (ItemWrapper (ll), ll, 45678 ); - verifyWrapper (ItemWrapper (ll), ll, 0 ); - verifyWrapper (ItemWrapper (&ll), &ll, (ulong*) 0 ); + verifyWrapper (&l1, &l2); + verifyWrapper ((0), &l2); + verifyWrapper (&l1, (0)); + verifyWrapper (l1, l2); - verifyWrapper (ItemWrapper (ss), ss, "Lumiera"); - verifyWrapper (ItemWrapper (ss), ssl, string() ); - verifyWrapper (ItemWrapper (&ss), &ss, randStr(12)); + verifyWrapper (s1, s2); + verifyWrapper (s1, s2); + verifyWrapper (&s1, &s2); - verifyWrapper (ItemWrapper (tt), tt, Tracker()); - verifyWrapper (ItemWrapper (tt), tt, Tracker()); - verifyWrapper (ItemWrapper (&tt), &tt, (Tracker*) 0 ); + verifyWrapper (t1, t2); + verifyWrapper (t1, t2); + verifyWrapper (&t1, &t2); - verifyWrapper (ItemWrapper (cp), cp, "Lumiera"); + verifyWrapper (cp, "Lumiera"); #endif //////////////////////////////////////////////////////////////////////////////////////TODO using yet undefined facilities.....!!!!! verifyWrappedRef (); @@ -109,8 +112,9 @@ namespace test{ template void - verifyWrapper (ItemWrapper const& wrap, X const& val, X const& otherVal) + verifyWrapper (X val, X otherVal) { + const ItemWrapper wrap(val); ASSERT (wrap); ItemWrapper copy1 (wrap);