1    	// -*- C++ -*-
2    	
3    	// Copyright (C) 2001-2017 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   	  /**
64   	   *  This iterator class lets algorithms store their results into
65   	   *  uninitialized memory.
66   	  */
67   	  template <class _OutputIterator, class _Tp>
68   	    class raw_storage_iterator
69   	    : public iterator<output_iterator_tag, void, void, void, void>
70   	    {
71   	    protected:
72   	      _OutputIterator _M_iter;
73   	
74   	    public:
75   	      explicit
76   	      raw_storage_iterator(_OutputIterator __x)
77   	      : _M_iter(__x) {}
78   	
79   	      raw_storage_iterator&
80   	      operator*() { return *this; }
81   	
82   	      raw_storage_iterator&
83   	      operator=(const _Tp& __element)
84   	      {
85   		std::_Construct(std::__addressof(*_M_iter), __element);
86   		return *this;
87   	      }
88   	
89   	#if __cplusplus >= 201103L
90   	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
91   	      // 2127. Move-construction with raw_storage_iterator
92   	      raw_storage_iterator&
93   	      operator=(_Tp&& __element)
94   	      {
95   		std::_Construct(std::__addressof(*_M_iter), std::move(__element));
96   		return *this;
97   	      }
98   	#endif
99   	
100  	      raw_storage_iterator&
101  	      operator++()
102  	      {
103  		++_M_iter;
104  		return *this;
105  	      }
106  	
107  	      raw_storage_iterator
108  	      operator++(int)
109  	      {
110  		raw_storage_iterator __tmp = *this;
111  		++_M_iter;
112  		return __tmp;
113  	      }
114  	
115  	      // _GLIBCXX_RESOLVE_LIB_DEFECTS
116  	      // 2454. Add raw_storage_iterator::base() member
117  	      _OutputIterator base() const { return _M_iter; }
118  	    };
119  	
120  	_GLIBCXX_END_NAMESPACE_VERSION
121  	} // namespace
122  	
123  	#endif
124