1// Temporary buffer implementation -*- C++ -*- 2 3// Copyright (C) 2001, 2002, 2004, 2005 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 2, 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 COPYING. If not, write to the Free 18// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 19// USA. 20 21// As a special exception, you may use this file as part of a free software 22// library without restriction. Specifically, if other files instantiate 23// templates or use macros or inline functions from this file, or you compile 24// this file and link it with other files to produce an executable, this 25// file does not by itself cause the resulting executable to be covered by 26// the GNU General Public License. This exception does not however 27// invalidate any other reasons why the executable file might be covered by 28// the GNU General Public License. 29 30/* 31 * 32 * Copyright (c) 1994 33 * Hewlett-Packard Company 34 * 35 * Permission to use, copy, modify, distribute and sell this software 36 * and its documentation for any purpose is hereby granted without fee, 37 * provided that the above copyright notice appear in all copies and 38 * that both that copyright notice and this permission notice appear 39 * in supporting documentation. Hewlett-Packard Company makes no 40 * representations about the suitability of this software for any 41 * purpose. It is provided "as is" without express or implied warranty. 42 * 43 * 44 * Copyright (c) 1996,1997 45 * Silicon Graphics Computer Systems, Inc. 46 * 47 * Permission to use, copy, modify, distribute and sell this software 48 * and its documentation for any purpose is hereby granted without fee, 49 * provided that the above copyright notice appear in all copies and 50 * that both that copyright notice and this permission notice appear 51 * in supporting documentation. Silicon Graphics makes no 52 * representations about the suitability of this software for any 53 * purpose. It is provided "as is" without express or implied warranty. 54 */ 55 56/** @file stl_tempbuf.h 57 * This is an internal header file, included by other library headers. 58 * You should not attempt to use it directly. 59 */ 60 61#ifndef _TEMPBUF_H 62#define _TEMPBUF_H 1 63 64#include <memory> 65 66namespace std 67{ 68 /** 69 * @if maint 70 * This class is used in two places: stl_algo.h and ext/memory, 71 * where it is wrapped as the temporary_buffer class. See 72 * temporary_buffer docs for more notes. 73 * @endif 74 */ 75 template<typename _ForwardIterator, typename _Tp> 76 class _Temporary_buffer 77 { 78 // concept requirements 79 __glibcxx_class_requires(_ForwardIterator, _ForwardIteratorConcept) 80 81 public: 82 typedef _Tp value_type; 83 typedef value_type* pointer; 84 typedef pointer iterator; 85 typedef ptrdiff_t size_type; 86 87 protected: 88 size_type _M_original_len; 89 size_type _M_len; 90 pointer _M_buffer; 91 92 void 93 _M_initialize_buffer(const _Tp&, __true_type) { } 94 95 void 96 _M_initialize_buffer(const _Tp& val, __false_type) 97 { std::uninitialized_fill_n(_M_buffer, _M_len, val); } 98 99 public: 100 /// As per Table mumble. 101 size_type 102 size() const 103 { return _M_len; } 104 105 /// Returns the size requested by the constructor; may be >size(). 106 size_type 107 requested_size() const 108 { return _M_original_len; } 109 110 /// As per Table mumble. 111 iterator 112 begin() 113 { return _M_buffer; } 114 115 /// As per Table mumble. 116 iterator 117 end() 118 { return _M_buffer + _M_len; } 119 120 /** 121 * Constructs a temporary buffer of a size somewhere between 122 * zero and the size of the given range. 123 */ 124 _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last); 125 126 ~_Temporary_buffer() 127 { 128 std::_Destroy(_M_buffer, _M_buffer + _M_len); 129 std::return_temporary_buffer(_M_buffer); 130 } 131 132 private: 133 // Disable copy constructor and assignment operator. 134 _Temporary_buffer(const _Temporary_buffer&); 135 136 void 137 operator=(const _Temporary_buffer&); 138 }; 139 140 141 template<typename _ForwardIterator, typename _Tp> 142 _Temporary_buffer<_ForwardIterator, _Tp>:: 143 _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) 144 : _M_original_len(std::distance(__first, __last)), 145 _M_len(0), _M_buffer(0) 146 { 147 // Workaround for a __type_traits bug in the pre-7.3 compiler. 148 typedef typename std::__is_scalar<_Tp>::__type _Trivial; 149 150 try 151 { 152 pair<pointer, size_type> __p(get_temporary_buffer< 153 value_type>(_M_original_len)); 154 _M_buffer = __p.first; 155 _M_len = __p.second; 156 if (_M_len > 0) 157 _M_initialize_buffer(*__first, _Trivial()); 158 } 159 catch(...) 160 { 161 std::return_temporary_buffer(_M_buffer); 162 _M_buffer = 0; 163 _M_len = 0; 164 __throw_exception_again; 165 } 166 } 167} // namespace std 168 169#endif /* _TEMPBUF_H */ 170 171