blob: 14a8b90cb4c2540f4801a731990150a94180b3c5 [file] [log] [blame]
/************************************************************************
*
* 23.list.h - definitions of helpers used in clause 23.list tests
*
* $Id$
*
***************************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed
* with this work for additional information regarding copyright
* ownership. The ASF licenses this file to you under the Apache
* License, Version 2.0 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
**************************************************************************/
#ifndef RW_23_LIST_H_INCLUDED
#define RW_23_LIST_H_INCLUDED
#include <rw_containers.h>
#include <rw_driver.h> // for rw_assert()
#include <rw_sigdefs.h> // for helper macros
/**************************************************************************/
// defines enumerations identifying list template arguments,
// sets of overloaded functions, member types used in the declarations
// of their signatures, and specific overloads of such member functions
struct ListIds : ContainerIds
{
// unique identifiers for all overloads of each member function
// 6 bits for FuncId
// 6 * 4 bits for ArgId (at most 6 arguments including this)
// 1 bit for membership
enum OverloadId {
//////////////////////////////////////////////////////////////
// list ()
MEMBER_0 (ctor, cont),
// list (const allocator_type&)
MEMBER_1 (ctor, cont, alloc),
// list (const list&)
MEMBER_1 (ctor, cont, ccont),
// list (size_type)
MEMBER_1 (ctor, cont, size),
// list (size_type, const value_type&)
MEMBER_2 (ctor, cont, size, cref),
// list (size_type, const value_type&, const allocator_type&)
MEMBER_3 (ctor, cont, size, cref, alloc),
// list (InputIterator, InputIterator)
MEMBER_1 (ctor, cont, range),
// list (InputIterator, InputIterator, const allocator&)
MEMBER_2 (ctor, cont, range, alloc),
//////////////////////////////////////////////////////////////
// operator= (const list&)
MEMBER_1 (op_set, cont, ccont),
//////////////////////////////////////////////////////////////
// assign (size_type, const value_type&)
MEMBER_2 (assign, cont, size, cref),
// assign (InputIterator, InputIterator)
MEMBER_1 (assign, cont, range),
//////////////////////////////////////////////////////////////
// get_allocator () const
MEMBER_0 (get_allocator, ccont),
//////////////////////////////////////////////////////////////
// begin ()
MEMBER_0 (begin, cont),
// begin () const
MEMBER_0 (begin_const, ccont),
// end ()
MEMBER_0 (end, cont),
// end () const
MEMBER_0 (end_const, ccont),
//////////////////////////////////////////////////////////////
// rbegin ()
MEMBER_0 (rbegin, cont),
// rbegin () const
MEMBER_0 (rbegin_const, ccont),
// rend ()
MEMBER_0 (rend, cont),
// rend () const
MEMBER_0 (rend_const, ccont),
//////////////////////////////////////////////////////////////
// empty ()
MEMBER_0 (empty, ccont),
//////////////////////////////////////////////////////////////
// size ()
MEMBER_0 (size, ccont),
//////////////////////////////////////////////////////////////
// max_size ()
MEMBER_0 (max_size, ccont),
//////////////////////////////////////////////////////////////
// resize (size_type)
MEMBER_1 (resize, cont, size),
// resize (size_type, value_type)
MEMBER_2 (resize, cont, size, val),
//////////////////////////////////////////////////////////////
// front ()
MEMBER_0 (front, cont),
// front () const
MEMBER_0 (front_const, ccont),
// back ()
MEMBER_0 (back, cont),
// back () const
MEMBER_0 (back_const, ccont),
//////////////////////////////////////////////////////////////
// push_front (const value_type&)
MEMBER_1 (push_front, cont, cref),
// pop_front ()
MEMBER_0 (pop_front, cont),
// push_back (const value_type&)
MEMBER_1 (push_back, cont, cref),
// pop_back ()
MEMBER_0 (pop_back, cont),
//////////////////////////////////////////////////////////////
// insert (iterator, const value_type&)
MEMBER_2 (insert, cont, iter, cref),
// insert (iterator, size_type, const value_type&)
MEMBER_3 (insert, cont, iter, size, cref),
// insert (iterator, InputIterator, InputIterator)
MEMBER_2 (insert, cont, iter, range),
//////////////////////////////////////////////////////////////
// erase (iterator)
MEMBER_1 (erase, cont, iter),
// erase (iterator, iterator)
MEMBER_2 (erase, cont, iter, iter),
//////////////////////////////////////////////////////////////
// swap (list&)
MEMBER_1 (swap, cont, cont),
// swap (list&, list&)
NON_MEMBER_2 (swap, cont, cont),
//////////////////////////////////////////////////////////////
// clear ()
MEMBER_0 (clear, cont),
//////////////////////////////////////////////////////////////
// splice (iterator, list&)
MEMBER_2 (splice, cont, iter, cont),
// splice (iterator, list&, iterator)
MEMBER_3 (splice, cont, iter, cont, iter),
// splice (iterator, list&, iterator, iterator)
MEMBER_4 (splice, cont, iter, cont, iter, iter),
//////////////////////////////////////////////////////////////
// remove (const value_type&)
MEMBER_1 (remove, cont, cref),
// remove_if (Predicate)
MEMBER_1 (remove_if, cont, pred),
//////////////////////////////////////////////////////////////
// unique (BinaryPredicate)
MEMBER_1 (unique, cont, bpred),
//////////////////////////////////////////////////////////////
// merge (list&)
MEMBER_1 (merge, cont, cont),
// merge (list&, Compare)
MEMBER_2 (merge, cont, cont, comp),
//////////////////////////////////////////////////////////////
// sort ()
MEMBER_0 (sort, cont),
// sort (Compare)
MEMBER_1 (sort, cont, comp),
//////////////////////////////////////////////////////////////
// reverse ()
MEMBER_0 (reverse, cont),
//////////////////////////////////////////////////////////////
// operator== (const list&, const list&)
NON_MEMBER_2 (op_equal, ccont, ccont),
//////////////////////////////////////////////////////////////
// operator< (const list&, const list&)
NON_MEMBER_2 (op_less, ccont, ccont),
//////////////////////////////////////////////////////////////
// operator!= (const list&, const list&)
NON_MEMBER_2 (op_not_equal, ccont, ccont),
//////////////////////////////////////////////////////////////
// operator> (const list&, const list&)
NON_MEMBER_2 (op_greater, ccont, ccont),
//////////////////////////////////////////////////////////////
// operator>= (const list&, const list&)
NON_MEMBER_2 (op_greater_equal, ccont, ccont),
//////////////////////////////////////////////////////////////
// operator<= (const list&, const list&)
NON_MEMBER_2 (op_less_equal, ccont, ccont)
};
// clean up helper macros used above
#include <rw_sigdefs.h>
};
/**************************************************************************/
template <class InputIter1, class InputIter2>
inline bool
_rw_equal (InputIter1 first1, InputIter1 last1, InputIter2 first2)
{
for (; first1 != last1 && *first1 == *first2; ++first1, ++first2) ;
return first1 == last1;
}
// encapsulates the state of a list object
// used in exception safety tests to determine changes to the state
// after a modifying operation throws an exception
template <class List>
struct ListState
{
typedef typename List::const_iterator ListCIter;
typedef typename List::const_pointer ListCPtr;
_RWSTD_SIZE_T size_;
ListCIter* iters_;
ListCPtr* ptrs_;
ListState (List const & lst) : size_ (lst.size ()), iters_ (0), ptrs_ (0) {
iters_ = new ListCIter [size_];
ptrs_ = new ListCPtr [size_];
_RWSTD_SIZE_T index = 0;
for (ListCIter it = lst.begin (), end = lst.end ();
it != end; ++it, ++index) {
iters_ [index] = it;
ptrs_ [index] = &*it;
}
}
~ListState () {
delete [] iters_;
delete [] ptrs_;
}
// invokes rw_assert() to verify that two states are the same
void assert_equal (const ListState& state, int line,
int case_line, const char* when) const {
const bool equal = size_ == state.size_
&& _rw_equal (iters_, iters_ + size_, state.iters_)
&& _rw_equal (ptrs_, ptrs_ + size_, state.ptrs_);
rw_assert (equal, 0, case_line,
"line %d: %{$FUNCALL}: object state unexpectedly changed "
"after %s", line, when);
}
};
/**************************************************************************/
#endif // RW_23_LIST_H_INCLUDED