1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // <deque> 10 11 // iterator erase(const_iterator f) 12 13 // Erasing items from the beginning or the end of a deque shall not invalidate iterators 14 // to items that were not erased. 15 16 #include <deque> 17 #include <cassert> 18 19 template <typename C> 20 void del_at_start(C c) 21 { 22 typename C::iterator first = c.begin(); 23 typename C::iterator it1 = first + 1; 24 typename C::iterator it2 = c.end() - 1; 25 26 c.erase (first); 27 28 typename C::iterator it3 = c.begin(); 29 typename C::iterator it4 = c.end() - 1; 30 assert( it1 == it3); 31 assert( *it1 == *it3); 32 assert(&*it1 == &*it3); 33 assert( it2 == it4); 34 assert( *it2 == *it4); 35 assert(&*it2 == &*it4); 36 } 37 38 template <typename C> 39 void del_at_end(C c) 40 { 41 typename C::iterator first = c.end() - 1; 42 typename C::iterator it1 = c.begin(); 43 typename C::iterator it2 = first - 1; 44 45 c.erase (first); 46 47 typename C::iterator it3 = c.begin(); 48 typename C::iterator it4 = c.end() - 1; 49 assert( it1 == it3); 50 assert( *it1 == *it3); 51 assert(&*it1 == &*it3); 52 assert( it2 == it4); 53 assert( *it2 == *it4); 54 assert(&*it2 == &*it4); 55 } 56 57 int main(int, char**) 58 { 59 std::deque<int> queue; 60 for (int i = 0; i < 20; ++i) 61 queue.push_back(i); 62 63 while (queue.size() > 1) 64 { 65 del_at_start(queue); 66 del_at_end(queue); 67 queue.pop_back(); 68 } 69 70 return 0; 71 } 72