combine instance management with both code paths

for assignable / not assignable types
This commit is contained in:
Fischlurch 2017-01-12 08:41:58 +01:00
parent b6e0497f8b
commit 625787fbba

View file

@ -53,6 +53,7 @@ namespace test{
// using std::vector; // using std::vector;
using std::string; using std::string;
using std::rand; using std::rand;
using std::swap;
@ -66,6 +67,7 @@ namespace test{
Tracker() : i_(rand() % 500) { ++cntTracker; } Tracker() : i_(rand() % 500) { ++cntTracker; }
Tracker(Tracker const& ot) : i_(ot.i_) { ++cntTracker; } Tracker(Tracker const& ot) : i_(ot.i_) { ++cntTracker; }
Tracker(uint i) : i_() { ++cntTracker; }
~Tracker() { --cntTracker; } ~Tracker() { --cntTracker; }
}; };
@ -186,6 +188,8 @@ namespace test{
/** @test verify that ctor and dtor calls are balanced, /** @test verify that ctor and dtor calls are balanced,
* even when assigning and self-assigning. * even when assigning and self-assigning.
* @note Tracker uses the simple implementation for assignable values,
* while NonAssign uses the embedded-buffer implementation
*/ */
void void
verifySaneInstanceHandling() verifySaneInstanceHandling()
@ -197,11 +201,19 @@ namespace test{
verifyWrapper<Tracker> (t1, t2); verifyWrapper<Tracker> (t1, t2);
verifyWrapper<Tracker*> (&t1, &t2); verifyWrapper<Tracker*> (&t1, &t2);
verifyWrapper<Tracker> (t1, t2.i_);
verifyWrapper<Tracker, Tracker&> (t1, t2); verifyWrapper<Tracker, Tracker&> (t1, t2);
NonAssign u1;
NonAssign u2;
verifyWrapper<NonAssign> (u1, u2);
verifyWrapper<NonAssign*> (&u1, &u2);
verifyWrapper<NonAssign> (u1, u2.i_);
verifyWrapper<NonAssign, NonAssign&> (u1, u2);
verifyWrapper<Tracker> (u1, u2);
} }
CHECK (1 == cntTracker); // one singleton instance in NullValue<Tracker> survives CHECK (2 == cntTracker); // surviving singleton instances
} } // NullValue<Tracker> and NullValue<NonAssign>
/** @test verify especially that we can handle and re-"assign" an embedded pointer */ /** @test verify especially that we can handle and re-"assign" an embedded pointer */