diff --git a/test/unordered/unnecessary_copy_tests.cpp b/test/unordered/unnecessary_copy_tests.cpp index 284dd56b..8cb66049 100644 --- a/test/unordered/unnecessary_copy_tests.cpp +++ b/test/unordered/unnecessary_copy_tests.cpp @@ -20,8 +20,17 @@ namespace unnecessary_copy_tests public: static int copies; static int moves; - count_copies() : tag_(0) { ++copies; } - explicit count_copies(int tag) : tag_(tag) { ++copies; } + static int id_count; + + count_copies() : tag_(0), id_(++id_count) { + ++copies; + trace_op("Default construct"); + } + + explicit count_copies(int tag) : tag_(tag), id_(++id_count) { + ++copies; + trace_op("Tag construct"); + } // This bizarre constructor is an attempt to confuse emplace. // @@ -33,17 +42,30 @@ namespace unnecessary_copy_tests // The second emplace should use the single argument contructor for // the key, and this constructor for the value. count_copies(count_copies const&, count_copies const& x) - : tag_(x.tag_) { ++copies; } + : tag_(x.tag_), id_(++id_count) + { + ++copies; + trace_op("Pair construct"); + } - count_copies(count_copies const& x) : tag_(x.tag_) { ++copies; } - count_copies(BOOST_RV_REF(count_copies) x) : tag_(x.tag_) { + count_copies(count_copies const& x) : tag_(x.tag_), id_(++id_count) + { + ++copies; + trace_op("Copy construct"); + } + + count_copies(BOOST_RV_REF(count_copies) x) : + tag_(x.tag_), id_(++id_count) + { x.tag_ = -1; ++moves; + trace_op("Move construct"); } count_copies& operator=(BOOST_COPY_ASSIGN_REF(count_copies) p) // Copy assignment { tag_ = p.tag_; ++copies; + trace_op("Copy assign"); return *this; } @@ -51,10 +73,21 @@ namespace unnecessary_copy_tests { tag_ = p.tag_; ++moves; + trace_op("Move assign"); return *this; } + ~count_copies() { + trace_op("Destruct"); + } + + void trace_op(char const* str) { + BOOST_LIGHTWEIGHT_TEST_OSTREAM << str << ": " << tag_ + << " (#" << id_ << ")" < void unnecessary_copy_insert_test(T*)