template< typename CONTAINER > std::clock_t geminate( CONTAINER& cntr ) { const auto start = std::clock() ; for( auto iter = cntr.begin() ; iter != cntr.end() ; ++iter, ++iter ) iter = cntr.insert( iter, *iter ) ; return std::clock() - start ; }
void MapTestDriver<CONTAINER>::testCase1() { // ------------------------------------------------------------------------ // SUPPORT REFERENCES AS 'mapped_type' // // Concerns: //: 1 All bsl map-like containers (map, multimap, unordered_map, //: unordered_multimap) accept references as 'mapped_type'. //: //: 2 Container does not make a copy of the referenced object on insertion. //: //: 3 The mapped value copy-assignment operator assigns to the original //: object and does not rebind the reference. //: //: 4 The container copy-assignment operator does not copy mapped values. //: //: 5 The container copy constructor does not copy mapped values. //: //: 6 The erase operation does not destroy the referenced object. // // Plan: //: 1 Create the value type containing a reference as a 'mapped_type' and //: insert it into the container. (C-1) //: //: 2 Verify that the container inserts the reference and does not make a //: copy of the referenced object. (C-2) //: //: 3 Assign diffenent value to the mapped value and verify that the //: referenced object is changed. (C-3) //: //: 4 Copy-construct new container and verify that the mapped value in the //: new container references original object. (C-4) //: //: 5 Assign the original container to a different container and verify //: that the mapped value in the new container references original //: object. (C-4) //: //: 5 Erase the container entry and verify that the original object is not //: destroyed. (C-4) // // Testing: // CONCERN: Support references as 'mapped_type' in map-like containers. // ------------------------------------------------------------------------ if (verbose) { cout << "\tTesting with: " << bsls::NameOf<ValueType>().name() << endl; } BSLMF_ASSERT(false == bsl::is_reference<KeyType>::value); BSLMF_ASSERT(true == bsl::is_reference<MappedType>::value); bslma::TestAllocator scratch("scratch", veryVeryVeryVerbose); bsls::ObjectBuffer<typename bsl::remove_const<KeyType>::type> tempKey; TTF::emplace(tempKey.address(), 1, &scratch); bslma::DestructorGuard<typename bsl::remove_const<KeyType>::type> keyGuard(tempKey.address()); bsls::ObjectBuffer<typename bsl::remove_reference<MappedType>::type> tempMapped; TTF::emplace(tempMapped.address(), 2, &scratch); bslma::DestructorGuard<typename bsl::remove_reference<MappedType>::type> mappedGuard(tempMapped.address()); bsls::ObjectBuffer<typename bsl::remove_reference<MappedType>::type> tempMapped2; TTF::emplace(tempMapped2.address(), 18, &scratch); bslma::DestructorGuard<typename bsl::remove_reference<MappedType>::type> mappedGuard2(tempMapped2.address()); CONTAINER mX; const CONTAINER& X = mX; ValueType tempPair(tempKey.object(), tempMapped.object()); mX.insert(MoveUtil::move(tempPair)); Iter ret = mX.find(tempKey.object()); ASSERT(ret != mX.end()); // Reference still refers to the original object. ASSERT(bsls::Util::addressOf(ret->second) == tempMapped.address()); // Assign different value to the mapped. ret->second = tempMapped2.object(); // Reference still refers to the original object. ASSERT(bsls::Util::addressOf(ret->second) == tempMapped.address()); ASSERT(tempMapped.object() == tempMapped2.object()); // Copy-construct container. { CONTAINER mY(X); const CONTAINER& Y = mY; CIter ret = Y.find(tempKey.object()); ASSERT(ret != Y.end()); // Reference still refers to the original object. ASSERT(bsls::Util::addressOf(ret->second) == tempMapped.address()); } // Copy-assign container. { CONTAINER mY; const CONTAINER& Y = mY; mY = X; CIter ret = Y.find(tempKey.object()); ASSERT(ret != Y.end()); // Reference still refers to the original object. ASSERT(bsls::Util::addressOf(ret->second) == tempMapped.address()); } // Erasing the value. mX.erase(tempKey.object()); ret = mX.find(tempKey.object()); ASSERT(ret == mX.end()); ASSERT(tempMapped.object() == tempMapped2.object()); cout<< "here3\n"; }