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 + -
显示快捷键?