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