diff --git a/src/common/query/mockconfigrules.hpp b/src/common/query/mockconfigrules.hpp index 5a1531cc9..f01d3268d 100644 --- a/src/common/query/mockconfigrules.hpp +++ b/src/common/query/mockconfigrules.hpp @@ -50,7 +50,6 @@ namespace lumiera { - //using std::string; namespace query @@ -114,8 +113,7 @@ namespace lumiera { const Ret& candidate (any_cast (entry)); if (! solution -// ||(solution && *solution == *candidate) // simulates a real unification -//////////////TODO: not only Assets (i.e. define comparison Operators on Assets!) + ||(solution && solution == candidate) // simulates a real unification ) return solution = candidate; } diff --git a/src/common/test/testoption.cpp b/src/common/test/testoption.cpp index aaaff32b8..8b1199887 100644 --- a/src/common/test/testoption.cpp +++ b/src/common/test/testoption.cpp @@ -1,5 +1,5 @@ /* - Suite - helper class for running collections of tests + Suite - handle cmdline for invoking Testsuite Copyright (C) Lumiera.org 2008, Hermann Vosseler @@ -45,6 +45,7 @@ namespace test * \code * --help * --group + * --describe * \endcode */ TestOption::TestOption (util::Cmdline& cmdline) diff --git a/src/proc/asset.hpp b/src/proc/asset.hpp index b9a85e5ae..7088b8324 100644 --- a/src/proc/asset.hpp +++ b/src/proc/asset.hpp @@ -59,14 +59,16 @@ #include "proc/asset/category.hpp" #include "common/error.hpp" +#include "common/p.hpp" + +#include +#include +#include #include #include #include #include -#include -#include -#include using std::string; @@ -81,6 +83,8 @@ namespace asset using std::size_t; using std::tr1::shared_ptr; using std::tr1::static_pointer_cast; + + using lumiera::P; /** @@ -109,8 +113,8 @@ namespace asset class Asset; class AssetManager; typedef const ID& IDA; - typedef shared_ptr PAsset; - typedef shared_ptr PcAsset; + typedef P PAsset; + typedef P PcAsset; @@ -135,7 +139,7 @@ namespace asset * @author Ichthyo */ class Asset - : boost::totally_ordered< Asset, + : boost::totally_ordered1< Asset, boost::noncopyable> { public: @@ -299,6 +303,9 @@ namespace asset /** ordering of Assets is based on the ordering * of Ident tuples, which are supposed to be unique. + * By using our customized lumiera::P as smart ptr, + * comparison on P ptrs will be automatically + * forwarded to the Asset comparison operators. * @note version info is irrelevant */ inline int Asset::Ident::compare (const Asset::Ident& oi) const @@ -309,6 +316,7 @@ namespace asset return name.compare (oi.name); } + /** promote subtype-ptr to PAsset, e.g. for comparing */ template inline const PcAsset @@ -316,31 +324,15 @@ namespace asset { return static_pointer_cast (subPtr); } - - /** ordering of Asset smart ptrs based on Ident tuple. - * @todo currently supporting only smart_ptr. - * @todo should better be done using boost::operator */ - inline bool operator== (PcAsset const& a1, PcAsset const& a2) { return a1 && a2 && ( (*a1) == (*a2));} - inline bool operator< (PcAsset const& a1, PcAsset const& a2) { return a1 && a2 && ( (*a1) < (*a2));} - - template - inline bool operator== (PA1 const& a1, PA2 const& a2) { return pAsset(a1) == pAsset(a2); } - - template - inline bool operator< (PA1 const& a1, PA2 const& a2) { return pAsset(a1) < pAsset(a2); } - /** build ordering of Asset shared pointers on the ordering of the pointed to assets. - * Because we can't define member operators for shared-ptrs, we explicitly instantiate - * the boost ordering concept template for all Asset kinds we want to use... - */ - template - struct asset_total_ordering : public boost::totally_ordered - { }; - - template struct asset_total_ordering; - template struct asset_total_ordering; + /** type trait for detecting a shared-ptr-to-asset */ + template + struct is_pAsset : boost::false_type {}; + template + struct is_pAsset > + : boost::is_base_of {}; /** convienient for debugging */ diff --git a/src/proc/asset/db.hpp b/src/proc/asset/db.hpp index 0f385f96d..493a188cf 100644 --- a/src/proc/asset/db.hpp +++ b/src/proc/asset/db.hpp @@ -28,6 +28,7 @@ #include "proc/asset.hpp" #include "common/error.hpp" +#include #include #include @@ -92,9 +93,9 @@ namespace asset public: template - void put (ID hash, shared_ptr& ptr) { table[hash] = static_pointer_cast (ptr); } - void put (ID hash, PAsset& ptr) { table[hash] = ptr; } - bool del (ID hash) { return table.erase (hash); } + void put (ID hash, P& ptr) { table[hash] = static_pointer_cast (ptr); } + void put (ID hash, PAsset& ptr) { table[hash] = ptr; } + bool del (ID hash) { return table.erase (hash); } template shared_ptr diff --git a/src/proc/assetmanager.cpp b/src/proc/assetmanager.cpp index 47b11f52e..fcdf45dc0 100644 --- a/src/proc/assetmanager.cpp +++ b/src/proc/assetmanager.cpp @@ -112,14 +112,13 @@ namespace asset AssetManager::reg (KIND* obj, const Asset::Ident& idi) throw(lumiera::error::Invalid) { - typedef shared_ptr PType; AssetManager& _aMang (AssetManager::instance()); TODO ("check validity of Ident Category"); ID asset_id (getID (idi)); Thread::Lock guard SIDEEFFECT; TODO ("handle duplicate Registrations"); - PType smart_ptr (obj, &destroy); + P smart_ptr (obj, &destroy); _aMang.registry.put (asset_id, smart_ptr); return asset_id; diff --git a/src/proc/mobject/session/defsregistry.hpp b/src/proc/mobject/session/defsregistry.hpp index 5a2328867..2bfec09ca 100644 --- a/src/proc/mobject/session/defsregistry.hpp +++ b/src/proc/mobject/session/defsregistry.hpp @@ -85,7 +85,7 @@ namespace mobject operator() (const Record& rec) { shared_ptr storedObj (rec.objRef.lock()); - return storedObj && pAsset(storedObj)==pAsset(obj_); //////////////TODO: not only Assets (i.e. define comparison Operators on Assets!) + return storedObj && (storedObj == obj_); } }; @@ -261,7 +261,7 @@ namespace mobject { shared_ptr storedObj (pos->objRef.lock()); if (storedObj) - return (pAsset(storedObj) == pAsset(obj)); //////////////TODO: not only Assets (i.e. define comparison Operators on Assets!) + return (storedObj == obj); else // use the opportunity and purge the expired entry registry.erase(pos); diff --git a/src/tool/SConscript b/src/tool/SConscript index bf069ebfb..6f4e796a6 100644 --- a/src/tool/SConscript +++ b/src/tool/SConscript @@ -8,6 +8,6 @@ Import('env','artifacts','core') # build the ubiquitous Hello World application (note: C source) artifacts['tools'] = [ env.Program('#$BINDIR/hello-world','hello.c') - + env.Program('#$BINDIR/try', ['try.cpp'] + core) #### to try out some feature: + + env.Program('#$BINDIR/try', 'try.cpp') #### to try out some feature... ] diff --git a/src/tool/try.cpp b/src/tool/try.cpp index 2151f4e84..90bdfadf8 100644 --- a/src/tool/try.cpp +++ b/src/tool/try.cpp @@ -14,83 +14,12 @@ #include #include -#include "proc/asset/media.hpp" using std::string; using std::cout; -namespace lumiera - { - using std::tr1::shared_ptr; - using std::tr1::weak_ptr; - - template > - class P - : public BASE - { - public: - P() : BASE() {} - template explicit P (Y* p) : BASE(p) {} - template P (Y* p, D d) : BASE(p,d) {} - - P (P const& r) : BASE(r) {} - template P (shared_ptr const& r) : BASE(r) {} - template explicit P (weak_ptr const& wr) : BASE(wr) {} - template explicit P (std::auto_ptr & ar) : BASE(ar) {} - - private: - // friend operators injected into enclosing namespace and found by ADL: - template - friend inline bool - operator== (P const& p, P<_O_> const& q) { return (p && q)? (*p == *q) : (!p && !q); } - - template - friend inline bool - operator!= (P const& p, P<_O_> const& q) { return (p && q)? (*p != *q) : !(!p && !q); } - - template - friend inline bool - operator< (P const& p, P<_O_> const& q) { return (p && q) && (*p < *q); } - - template - friend inline bool - operator> (P const& p, P<_O_> const& q) { return (p && q) && (*q < *p); } - - template - friend inline bool - operator<= (P const& p, P<_O_> const& q) { return (p && q)? (*p <= *q) : (!p && !q); } - - template - friend inline bool - operator>= (P const& p, P<_O_> const& q) { return (p && q)? (*p >= *q) : (!p && !q); } - - }; -} - -namespace asset - { - using lumiera::P; - - - void - doIt() - { - Asset::Ident key2("Try-1", Category(VIDEO)); - P a1 = asset::Media::create(key2, "Name-1"); - - Asset::Ident key3("Try-2", Category(VIDEO)); - P a2 = asset::Media::create(key3, "Name-2"); - - cout << "a1 = " << str(a1); - - bool yes = (a1 >= a2); - enable_if, string>::type yup; - - cout << "\n yes=" << yes << " yup=" << typeid(*a1).name(); - } -} int main (int argc, char* argv[]) @@ -98,8 +27,6 @@ int main (int argc, char* argv[]) NOBUG_INIT; - asset::doIt(); - cout << "\ngulp\n"; diff --git a/tests/components/proc/asset/assetdiagnostics.hpp b/tests/components/proc/asset/assetdiagnostics.hpp index 199338599..c7a698db6 100644 --- a/tests/components/proc/asset/assetdiagnostics.hpp +++ b/tests/components/proc/asset/assetdiagnostics.hpp @@ -71,14 +71,14 @@ namespace asset } - template + template inline bool - dependencyCheck (C child, P parent) + dependencyCheck (P child, P parent) { - return (pAsset(child) == pAsset(parent)) + return (child == parent) || (0 < child->getParents().size() && (parent == child->getParents()[0]) - && (contains (parent->getDependant(), child))); + && (contains (parent->getDependant(), child))) ; } diff --git a/tests/components/proc/asset/basicpipetest.cpp b/tests/components/proc/asset/basicpipetest.cpp index fb2541f20..d085f22d4 100644 --- a/tests/components/proc/asset/basicpipetest.cpp +++ b/tests/components/proc/asset/basicpipetest.cpp @@ -154,6 +154,9 @@ namespace asset void dependProcPatt(string pID) { + typedef P PPipe; /////TODO: transition to P<> + typedef P PProcPatt; + PPipe thePipe = Pipe::query ("pipe("+pID+")"); ASSERT (thePipe); PProcPatt thePatt = thePipe->getProcPatt(); @@ -186,11 +189,13 @@ namespace asset ASSERT (!aMang.known (thePipe->getID())); // has been unlinked too, because dependant on pattern2 ASSERT (thePipe); + PProcPatt pattern3 = thePipe->getProcPatt(); /////TODO: transition to P<> ASSERT (thePipe->getProcPatt()); - ASSERT (thePipe->getProcPatt() == pattern2); // but is still valid, as long as the ref is alive.... + ASSERT ( pattern3 == pattern2); // but is still valid, as long as the ref is alive.... PPipe pipe3x = Pipe::query ("pattern(another)"); - ASSERT (pipe3x->getProcPatt() != pattern2); // because pattern2 is already unlinked... + pattern3 = pipe3x->getProcPatt(); /////TODO: transition to P<> + ASSERT (pattern3 != pattern2); // because pattern2 is already unlinked... ASSERT (pipe3x == Session::current->defaults (Query("pattern(another)"))); ASSERT (pipe3x != pipe2x); // ..we got a new default pipe for "pattern(another)" too! diff --git a/tests/components/proc/asset/createassettest.cpp b/tests/components/proc/asset/createassettest.cpp index d9302fc7c..530cb1413 100644 --- a/tests/components/proc/asset/createassettest.cpp +++ b/tests/components/proc/asset/createassettest.cpp @@ -60,7 +60,7 @@ namespace asset - typedef shared_ptr PM; + typedef P PM; /////TODO: transition to P<> /** @test Creating and automatically registering Asset instances. * Re-Retrieving the newly created objects from AssetManager. @@ -78,12 +78,26 @@ namespace asset // Assets have been registered and can be retrieved by ID AssetManager& aMang = AssetManager::instance(); + PM registered; /////TODO: transition to P<> + registered = aMang.getAsset (mm1->getID()); + ASSERT (registered == mm1); + registered = aMang.getAsset (mm2->getID()); + ASSERT (registered == mm2); + registered = aMang.getAsset (mm3->getID()); + ASSERT (registered == mm3); + + registered = aMang.getAsset (mm1->getID()); + ASSERT (registered != mm2); +/* + * TODO: switch back to original version + * once the transition to P ist done... + * ASSERT (aMang.getAsset (mm1->getID()) == mm1); ASSERT (aMang.getAsset (mm2->getID()) == mm2); ASSERT (aMang.getAsset (mm3->getID()) == mm3); ASSERT (aMang.getAsset (mm1->getID()) != mm2); - +*/ PAsset aa1 = aMang.getAsset (ID(mm1->getID())); // note we get an Asset ref ASSERT (aa1 == mm1); PM mX1 = aMang.getAsset (mm1->getID()); // ..and now we get a Media ref diff --git a/tests/components/proc/asset/dependantassetstest.cpp b/tests/components/proc/asset/dependantassetstest.cpp index c9125b5d3..63ea2f57e 100644 --- a/tests/components/proc/asset/dependantassetstest.cpp +++ b/tests/components/proc/asset/dependantassetstest.cpp @@ -194,8 +194,8 @@ namespace asset void checkRealAssetDependencyRegistration () { // -----Media and Clip-------------------------------- - typedef Media::PMedia PM; - typedef Media::PClip PC; + typedef P PM; + typedef P PC; PM mm = asset::Media::create("test-1", VIDEO); PC cc = mm->createClip()->findClipAsset(); ASSERT (dependencyCheck (cc,mm)); diff --git a/tests/components/proc/asset/makecliptest.cpp b/tests/components/proc/asset/makecliptest.cpp index 83702d7c5..136abf05d 100644 --- a/tests/components/proc/asset/makecliptest.cpp +++ b/tests/components/proc/asset/makecliptest.cpp @@ -50,7 +50,7 @@ namespace asset */ class MakeClip_test : public Test { - typedef shared_ptr PM; + typedef P PM; typedef asset::Media::PClipMO PC; virtual void run (Arg arg) diff --git a/tests/components/proc/asset/orderingofassetstest.cpp b/tests/components/proc/asset/orderingofassetstest.cpp index 26d6aa50a..783770348 100644 --- a/tests/components/proc/asset/orderingofassetstest.cpp +++ b/tests/components/proc/asset/orderingofassetstest.cpp @@ -59,22 +59,20 @@ namespace asset { virtual void run(Arg arg) { - typedef shared_ptr PA; - Asset::Ident key1("Au-1", Category(AUDIO), "ichthyo", 5); - PA mm1 = asset::Media::create(key1, "Name-1"); + PAsset mm1 = asset::Media::create(key1, "Name-1"); Asset::Ident key2("Au-1", Category(AUDIO), "ichthyo", 7); - PA mm2 = asset::Media::create(key2, "Name-2"); + PAsset mm2 = asset::Media::create(key2, "Name-2"); Asset::Ident key3("Au-2", Category(AUDIO), "ichthyo", 5); - PA mm3 = asset::Media::create(key3, "Name-3"); + PAsset mm3 = asset::Media::create(key3, "Name-3"); Asset::Ident key4("Au-2", Category(AUDIO), "stega", 5); - PA mm4 = asset::Media::create(key4, "Name-4"); + PAsset mm4 = asset::Media::create(key4, "Name-4"); Asset::Ident key5("Au-1", Category(VIDEO), "ichthyo", 5); - PA mm5 = asset::Media::create(key5, "Name-5"); + PAsset mm5 = asset::Media::create(key5, "Name-5"); // ordering of keys diff --git a/tests/components/proc/asset/testasset.cpp b/tests/components/proc/asset/testasset.cpp index b48b64da1..42ddff7ad 100644 --- a/tests/components/proc/asset/testasset.cpp +++ b/tests/components/proc/asset/testasset.cpp @@ -79,7 +79,7 @@ namespace asset * within AssetManager by the Asset base class ctor */ template - shared_ptr > + P > TestAsset::ptrFromThis () { return static_pointer_cast,Asset> @@ -113,8 +113,8 @@ namespace asset template TestAsset::TestAsset (PAsset& pRef); template TestAsset::TestAsset (PAsset& pRef); - template shared_ptr > TestAsset::ptrFromThis (); - template shared_ptr > TestAsset::ptrFromThis (); + template P > TestAsset::ptrFromThis (); + template P > TestAsset::ptrFromThis (); diff --git a/tests/components/proc/asset/testasset.hpp b/tests/components/proc/asset/testasset.hpp index 05f82c79e..e1abc57d2 100644 --- a/tests/components/proc/asset/testasset.hpp +++ b/tests/components/proc/asset/testasset.hpp @@ -58,7 +58,7 @@ namespace asset static void deleter (TestAsset* aa) { delete aa; } public: - typedef shared_ptr > PA; + typedef P > PA; static PA create () { return (new TestAsset )->ptrFromThis(); } static PA create (PAsset& pRef) { return (new TestAsset (pRef))->ptrFromThis(); }