1  // -*- C++ -*-
       2  
       3  // Copyright (C) 2001-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  // 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  /*
      26   *
      27   * Copyright (c) 1994
      28   * Hewlett-Packard Company
      29   *
      30   * Permission to use, copy, modify, distribute and sell this software
      31   * and its documentation for any purpose is hereby granted without fee,
      32   * provided that the above copyright notice appear in all copies and
      33   * that both that copyright notice and this permission notice appear
      34   * in supporting documentation.  Hewlett-Packard Company makes no
      35   * representations about the suitability of this software for any
      36   * purpose.  It is provided "as is" without express or implied warranty.
      37   *
      38   *
      39   * Copyright (c) 1996
      40   * Silicon Graphics Computer Systems, Inc.
      41   *
      42   * Permission to use, copy, modify, distribute and sell this software
      43   * and its documentation for any purpose is hereby granted without fee,
      44   * provided that the above copyright notice appear in all copies and
      45   * that both that copyright notice and this permission notice appear
      46   * in supporting documentation.  Silicon Graphics makes no
      47   * representations about the suitability of this software for any
      48   * purpose.  It is provided "as is" without express or implied warranty.
      49   */
      50  
      51  /** @file bits/stl_raw_storage_iter.h
      52   *  This is an internal header file, included by other library headers.
      53   *  Do not attempt to use it directly. @headername{memory}
      54   */
      55  
      56  #ifndef _STL_RAW_STORAGE_ITERATOR_H
      57  #define _STL_RAW_STORAGE_ITERATOR_H 1
      58  
      59  namespace std _GLIBCXX_VISIBILITY(default)
      60  {
      61  _GLIBCXX_BEGIN_NAMESPACE_VERSION
      62  
      63  // Ignore warnings about std::iterator.
      64  #pragma GCC diagnostic push
      65  #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
      66  
      67    /**
      68     *  This iterator class lets algorithms store their results into
      69     *  uninitialized memory.
      70    */
      71    template <class _OutputIterator, class _Tp>
      72      class _GLIBCXX17_DEPRECATED raw_storage_iterator
      73      : public iterator<output_iterator_tag, void, void, void, void>
      74      {
      75      protected:
      76        _OutputIterator _M_iter;
      77  
      78      public:
      79        explicit
      80        raw_storage_iterator(_OutputIterator __x)
      81        : _M_iter(__x) {}
      82  
      83        raw_storage_iterator&
      84        operator*() { return *this; }
      85  
      86        raw_storage_iterator&
      87        operator=(const _Tp& __element)
      88        {
      89  	std::_Construct(std::__addressof(*_M_iter), __element);
      90  	return *this;
      91        }
      92  
      93  #if __cplusplus >= 201103L
      94        // _GLIBCXX_RESOLVE_LIB_DEFECTS
      95        // 2127. Move-construction with raw_storage_iterator
      96        raw_storage_iterator&
      97        operator=(_Tp&& __element)
      98        {
      99  	std::_Construct(std::__addressof(*_M_iter), std::move(__element));
     100  	return *this;
     101        }
     102  #endif
     103  
     104        raw_storage_iterator&
     105        operator++()
     106        {
     107  	++_M_iter;
     108  	return *this;
     109        }
     110  
     111        raw_storage_iterator
     112        operator++(int)
     113        {
     114  	raw_storage_iterator __tmp = *this;
     115  	++_M_iter;
     116  	return __tmp;
     117        }
     118  
     119        // _GLIBCXX_RESOLVE_LIB_DEFECTS
     120        // 2454. Add raw_storage_iterator::base() member
     121        _OutputIterator base() const { return _M_iter; }
     122      };
     123  #pragma GCC diagnostic pop
     124  
     125  _GLIBCXX_END_NAMESPACE_VERSION
     126  } // namespace
     127  
     128  #endif