📄 test_insert.h
字号:
}
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 + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -