test_insert.h
来自「stl的源码」· C头文件 代码 · 共 553 行 · 第 1/2 页
H
553 行
}template <class C, class SrcIter>inline void VerifyInsertion( const C& original, const C& result, const SrcIter& firstNew, const SrcIter& lastNew, size_t insPos ){ EH_ASSERT( result.size() == original.size() + CountNewItems( original, firstNew, lastNew, container_category(original) ) ); VerifyInsertion( original, result, firstNew, lastNew, insPos, container_category(original) );}template <class C, class Value>void VerifyInsertN( const C& original, const C& result, size_t insCnt, const Value& val, size_t insPos ){ typename C::const_iterator p1 = original.begin(); typename C::const_iterator p2 = result.begin(); (void)val; //*TY 02/06/2000 - to suppress unused variable warning under nondebug build for ( size_t n = 0; n < insPos; n++ ) EH_ASSERT( *p1++ == *p2++ ); while ( insCnt-- > 0 ) { EH_ASSERT(p2 != result.end()); EH_ASSERT(*p2 == val ); ++p2; } while ( p2 != result.end() ) { EH_ASSERT( *p1 == *p2 ); ++p1; ++p2; } EH_ASSERT( p1 == original.end() );}template <class C>void prepare_insert_n( C&, size_t ) {}// Metrowerks 1.8 compiler requires that specializations appear first (!!)// or it won't call them. Fixed in 1.9, though.inline void MakeRandomValue(bool& b) { b = bool(random_number(2) != 0); }template<class T>inline void MakeRandomValue(T&) {}template <class C>struct test_insert_one{ test_insert_one( const C& orig, int pos =-1 ) : original( orig ), fPos( random_number( orig.size() )) { MakeRandomValue( fInsVal ); if ( pos != -1 ) { fPos = size_t(pos); if ( pos == 0 ) gTestController.SetCurrentTestName("single insertion at begin()"); else gTestController.SetCurrentTestName("single insertion at end()"); } else gTestController.SetCurrentTestName("single insertion at random position"); } void operator()( C& c ) const { prepare_insert_n( c, (size_t)1 ); typename C::iterator pos = c.begin(); EH_STD::advance( pos, size_t(fPos) ); c.insert( pos, fInsVal ); // Prevent simulated failures during verification gTestController.CancelFailureCountdown(); // Success. Check results. VerifyInsertion( original, c, &fInsVal, 1+&fInsVal, fPos ); }private: typename C::value_type fInsVal; const C& original; size_t fPos;};template <class C>struct test_insert_n{ test_insert_n( const C& orig, size_t insCnt, int pos =-1 ) : original( orig ), fPos( random_number( orig.size() )), fInsCnt(insCnt) { MakeRandomValue( fInsVal ); if (pos!=-1) { fPos=size_t(pos); if (pos==0) gTestController.SetCurrentTestName("n-ary insertion at begin()"); else gTestController.SetCurrentTestName("n-ary insertion at end()"); } else gTestController.SetCurrentTestName("n-ary insertion at random position"); } void operator()( C& c ) const { prepare_insert_n( c, fInsCnt ); typename C::iterator pos = c.begin(); EH_STD::advance( pos, fPos ); c.insert( pos, fInsCnt, fInsVal ); // Prevent simulated failures during verification gTestController.CancelFailureCountdown(); // Success. Check results. VerifyInsertN( original, c, fInsCnt, fInsVal, fPos ); }private: typename C::value_type fInsVal; const C& original; size_t fPos; size_t fInsCnt;};template <class C>struct test_insert_value{ test_insert_value( const C& orig ) : original( orig ) { MakeRandomValue( fInsVal ); gTestController.SetCurrentTestName("insertion of random value"); } void operator()( C& c ) const { c.insert( fInsVal ); // Prevent simulated failures during verification gTestController.CancelFailureCountdown(); // Success. Check results. VerifyInsertion( original, c, &fInsVal, 1+&fInsVal, size_t(0) ); }private: typename C::value_type fInsVal; const C& original;};template <class C>struct test_insert_noresize{ test_insert_noresize( const C& orig ) : original( orig ) { MakeRandomValue( fInsVal ); gTestController.SetCurrentTestName("insertion of random value without resize"); } void operator()( C& c ) const { c.insert_noresize( fInsVal ); // Prevent simulated failures during verification gTestController.CancelFailureCountdown(); // Success. Check results. VerifyInsertion( original, c, &fInsVal, 1+&fInsVal, size_t(0) ); }private: typename C::value_type fInsVal; const C& original;};template <class C, class Position, class Iter>void do_insert_range( C& c_inst, Position offset, Iter first, Iter last, sequence_container_tag ){ typedef typename C::iterator CIter; CIter pos = c_inst.begin(); EH_STD::advance( pos, offset ); c_inst.insert( pos, first, last );}template <class C, class Position, class Iter>void do_insert_range( C& c, Position, Iter first, Iter last, associative_container_tag ){ c.insert( first, last );}template <class C, class Position, class Iter>void do_insert_range( C& c, Position, Iter first, Iter last, multiset_tag ){ c.insert( first, last );}template <class C, class Position, class Iter>void do_insert_range( C& c, Position, Iter first, Iter last, multimap_tag ){ c.insert( first, last );}template <class C, class Position, class Iter>void do_insert_range( C& c, Position, Iter first, Iter last, set_tag ){ c.insert( first, last );}template <class C, class Position, class Iter>void do_insert_range( C& c, Position, Iter first, Iter last, map_tag ){ c.insert( first, last );}/*template <class C, class Iter>void prepare_insert_range( C&, size_t, Iter, Iter) {}*/template <class C, class Iter>struct test_insert_range{ test_insert_range( const C& orig, Iter first, Iter last, int pos=-1 ) : fFirst( first ), fLast( last ), original( orig ), fPos( random_number( orig.size() )) { gTestController.SetCurrentTestName("range insertion"); if ( pos != -1 ) { fPos = size_t(pos); if ( pos == 0 ) gTestController.SetCurrentTestName("range insertion at begin()"); else gTestController.SetCurrentTestName("range insertion at end()"); } else gTestController.SetCurrentTestName("range insertion at random position"); } void operator()( C& c ) const {// prepare_insert_range( c, fPos, fFirst, fLast ); do_insert_range( c, fPos, fFirst, fLast, container_category(c) ); // Prevent simulated failures during verification gTestController.CancelFailureCountdown(); // Success. Check results. VerifyInsertion( original, c, fFirst, fLast, fPos ); }private: Iter fFirst, fLast; const C& original; size_t fPos;};template <class C, class Iter>test_insert_range<C, Iter> insert_range_tester( const C& orig, const Iter& first, const Iter& last ){ return test_insert_range<C, Iter>( orig, first, last );}template <class C, class Iter>test_insert_range<C, Iter> insert_range_at_begin_tester( const C& orig, const Iter& first, const Iter& last ){ return test_insert_range<C, Iter>( orig, first, last , 0);}template <class C, class Iter>test_insert_range<C, Iter> insert_range_at_end_tester( const C& orig, const Iter& first, const Iter& last ){ return test_insert_range<C, Iter>( orig, first, last , (int)orig.size());}#endif // test_insert_H_
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?