| /************************************************************************ |
| * |
| * 23.list.h - definitions of helpers used in clause 23.list tests |
| * |
| * $Id: 23.list.h |
| * |
| *************************************************************************** |
| * |
| * 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 <23.containers.h> |
| |
| /**************************************************************************/ |
| |
| // 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 |
| { |
| // define the helper macros |
| #include <rw_sigdefs.h> |
| |
| // 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 |