1  // -*- C++ -*-
       2  // Utility subroutines for the C++ library testsuite.
       3  //
       4  // Copyright (C) 2000-2023 Free Software Foundation, Inc.
       5  //
       6  // This file is part of the GNU ISO C++ Library.  This library is free
       7  // software; you can redistribute it and/or modify it under the
       8  // terms of the GNU General Public License as published by the
       9  // Free Software Foundation; either version 3, or (at your option)
      10  // any later version.
      11  //
      12  // This library is distributed in the hope that it will be useful,
      13  // but WITHOUT ANY WARRANTY; without even the implied warranty of
      14  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      15  // GNU General Public License for more details.
      16  //
      17  // You should have received a copy of the GNU General Public License along
      18  // with this library; see the file COPYING3.  If not see
      19  // <http://www.gnu.org/licenses/>.
      20  //
      21  
      22  #ifndef _GLIBCXX_TESTSUITE_NEW_OPERATORS_H
      23  #define _GLIBCXX_TESTSUITE_NEW_OPERATORS_H
      24  
      25  #include <new>
      26  #include <testsuite_hooks.h>
      27  
      28  namespace __gnu_test
      29  {
      30    std::size_t&
      31    get_new_limit()
      32    {
      33      static std::size_t limit = 1024 * 1024;
      34      return limit;
      35    }
      36  
      37    void
      38    set_new_limit(std::size_t l)
      39    { get_new_limit() = l; }
      40  }
      41  
      42  void* operator new(std::size_t size) THROW(std::bad_alloc)
      43  {
      44    if (size > __gnu_test::get_new_limit())
      45      throw std::bad_alloc();
      46  
      47    void* p = std::malloc(size);
      48    if (!p)
      49      throw std::bad_alloc();
      50  
      51    return p;
      52  }
      53  
      54  void* operator new (std::size_t size, const std::nothrow_t&) throw()
      55  {
      56    if (size > __gnu_test::get_new_limit())
      57      return 0;
      58  
      59    return std::malloc(size);
      60  }
      61  
      62  void operator delete(void* p) throw()
      63  {
      64    if (p)
      65      std::free(p);
      66  }
      67  
      68  #if __cpp_sized_deallocation
      69  void operator delete(void* p, std::size_t) throw()
      70  { ::operator delete(p); }
      71  #endif
      72  
      73  void operator delete(void* p, const std::nothrow_t&) throw()
      74  {
      75    if (p)
      76      std::free(p);
      77  }
      78  
      79  
      80  #endif // _GLIBCXX_TESTSUITE_NEW_OPERATORS_H
      81  
      82