1  // 2004-07-26  Matt Austern  <austern@apple.com>
       2  //
       3  // Copyright (C) 2003-2023 Free Software Foundation, Inc.
       4  //
       5  // This file is part of the GNU ISO C++ Library.  This library is free
       6  // software; you can redistribute it and/or modify it under the
       7  // terms of the GNU General Public License as published by the
       8  // Free Software Foundation; either version 3, or (at your option)
       9  // any later version.
      10  //
      11  // This library is distributed in the hope that it will be useful,
      12  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14  // GNU General Public License for more details.
      15  //
      16  // You should have received a copy of the GNU General Public License along
      17  // with this library; see the file COPYING3.  If not see
      18  // <http://www.gnu.org/licenses/>.
      19  //
      20  
      21  #include <iterator>
      22  #include <testsuite_allocator.h>
      23  
      24  template<typename _Tp>
      25  bool
      26  construct_destroy()
      27  {
      28    typedef _Tp list_type;
      29    typedef typename list_type::iterator iterator_type;
      30  
      31    using namespace __gnu_test;
      32    const int arr10[10] = { 2, 4, 1, 7, 3, 8, 10, 5, 9, 6 };
      33    bool ok = true;
      34  
      35    tracker_allocator_counter::reset();
      36    {
      37      list_type c;
      38      ok = check_construct_destroy("empty container", 0, 0) && ok;
      39    }
      40    ok = check_construct_destroy("empty container", 0, 0) && ok;
      41  
      42  
      43    tracker_allocator_counter::reset();
      44    {
      45      list_type c(arr10, arr10 + 10);
      46      ok = check_construct_destroy("Construct from range", 10, 0) && ok;
      47    }
      48    ok = check_construct_destroy("Construct from range", 10, 10) && ok;
      49  
      50    {
      51      list_type c(arr10, arr10 + 10);
      52      tracker_allocator_counter::reset();
      53      c.insert(c.begin(), arr10[0]);
      54      ok = check_construct_destroy("Insert element", 1, 0) && ok;
      55    }
      56    ok = check_construct_destroy("Insert element", 1, 11) && ok;
      57  
      58    {
      59      list_type c(arr10, arr10 + 10);
      60      tracker_allocator_counter::reset();
      61      iterator_type i5 = c.begin();
      62      std::advance(i5, 5);
      63      c.insert(i5, arr10, arr10+3);
      64      ok = check_construct_destroy("Insert short range", 3, 0) && ok;
      65    }
      66    ok = check_construct_destroy("Insert short range", 3, 13) && ok;
      67  
      68    {
      69      list_type c(arr10, arr10 + 10);
      70      tracker_allocator_counter::reset();
      71      iterator_type i7 = c.begin();
      72      std::advance(i7, 5);
      73      c.insert(i7, arr10, arr10+10);
      74      ok = check_construct_destroy("Insert long range", 10, 0) && ok;
      75    }
      76    ok = check_construct_destroy("Insert long range", 10, 20) && ok;
      77  
      78    return ok ? 0 : 1;
      79  }