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, const_iterator l) 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 17 #include <deque> 18 #include <cstdint> 19 #include <cassert> 20 21 template <typename C> 22 void del_at_start(C c, size_t num) 23 { 24 typename C::iterator first = c.begin(); 25 typename C::iterator last = first + num; 26 typename C::iterator it1 = last; 27 typename C::iterator it2 = c.end() - 1; 28 29 c.erase (first, last); 30 31 typename C::iterator it3 = c.begin(); 32 typename C::iterator it4 = c.end() - 1; 33 assert( it1 == it3); 34 assert( *it1 == *it3); 35 assert(&*it1 == &*it3); 36 assert( it2 == it4); 37 assert( *it2 == *it4); 38 assert(&*it2 == &*it4); 39 } 40 41 template <typename C> 42 void del_at_end(C c, size_t num) 43 { 44 typename C::iterator last = c.end(); 45 typename C::iterator first = last - num; 46 typename C::iterator it1 = c.begin(); 47 typename C::iterator it2 = first - 1; 48 49 c.erase (first, last); 50 51 typename C::iterator it3 = c.begin(); 52 typename C::iterator it4 = c.end() - 1; 53 assert( it1 == it3); 54 assert( *it1 == *it3); 55 assert(&*it1 == &*it3); 56 assert( it2 == it4); 57 assert( *it2 == *it4); 58 assert(&*it2 == &*it4); 59 } 60 61 62 int main(int, char**) 63 { 64 std::deque<int> queue; 65 for (int i = 0; i < 20; ++i) 66 queue.push_back(i); 67 68 while (queue.size() > 1) 69 { 70 for (size_t i = 1; i < queue.size(); ++i) 71 { 72 del_at_start(queue, i); 73 del_at_end (queue, i); 74 } 75 queue.pop_back(); 76 } 77 78 return 0; 79 } 80