Home | History | Annotate | Line # | Download | only in bits
      1 // <bits/erase_if.h> -*- C++ -*-
      2 
      3 // Copyright (C) 2015-2024 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 // Under Section 7 of GPL version 3, you are granted additional
     17 // permissions described in the GCC Runtime Library Exception, version
     18 // 3.1, as published by the Free Software Foundation.
     19 
     20 // You should have received a copy of the GNU General Public License and
     21 // a copy of the GCC Runtime Library Exception along with this program;
     22 // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
     23 // <http://www.gnu.org/licenses/>.
     24 
     25 /** @file bits/erase_if.h
     26  *  This is an internal header file, included by other library headers.
     27  *  Do not attempt to use it directly.
     28  */
     29 
     30 #ifndef _GLIBCXX_ERASE_IF_H
     31 #define _GLIBCXX_ERASE_IF_H 1
     32 
     33 #pragma GCC system_header
     34 
     35 #include <bits/c++config.h>
     36 
     37 // Used by C++17 containers and Library Fundamentals v2 headers.
     38 #if __cplusplus >= 201402L
     39 namespace std
     40 {
     41 _GLIBCXX_BEGIN_NAMESPACE_VERSION
     42 
     43   namespace __detail
     44   {
     45     template<typename _Container, typename _UnsafeContainer,
     46 	     typename _Predicate>
     47       typename _Container::size_type
     48       __erase_nodes_if(_Container& __cont, _UnsafeContainer& __ucont,
     49 		       _Predicate __pred)
     50       {
     51 	typename _Container::size_type __num = 0;
     52 	for (auto __iter = __ucont.begin(), __last = __ucont.end();
     53 	     __iter != __last;)
     54 	  {
     55 	    if (__pred(*__iter))
     56 	      {
     57 		__iter = __cont.erase(__iter);
     58 		++__num;
     59 	      }
     60 	    else
     61 	      ++__iter;
     62 	  }
     63 	return __num;
     64       }
     65   } // namespace __detail
     66 
     67 _GLIBCXX_END_NAMESPACE_VERSION
     68 } // namespace std
     69 #endif // C++14
     70 
     71 #endif // _GLIBCXX_ERASE_IF_H
     72