stl_tempbuf.h

Go to the documentation of this file.
00001 // Temporary buffer implementation -*- C++ -*-
00002 
00003 // Copyright (C) 2001, 2002 Free Software Foundation, Inc.
00004 //
00005 // This file is part of the GNU ISO C++ Library.  This library is free
00006 // software; you can redistribute it and/or modify it under the
00007 // terms of the GNU General Public License as published by the
00008 // Free Software Foundation; either version 2, or (at your option)
00009 // any later version.
00010 
00011 // This library is distributed in the hope that it will be useful,
00012 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 // GNU General Public License for more details.
00015 
00016 // You should have received a copy of the GNU General Public License along
00017 // with this library; see the file COPYING.  If not, write to the Free
00018 // Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
00019 // USA.
00020 
00021 // As a special exception, you may use this file as part of a free software
00022 // library without restriction.  Specifically, if other files instantiate
00023 // templates or use macros or inline functions from this file, or you compile
00024 // this file and link it with other files to produce an executable, this
00025 // file does not by itself cause the resulting executable to be covered by
00026 // the GNU General Public License.  This exception does not however
00027 // invalidate any other reasons why the executable file might be covered by
00028 // the GNU General Public License.
00029 
00030 /*
00031  *
00032  * Copyright (c) 1994
00033  * Hewlett-Packard Company
00034  *
00035  * Permission to use, copy, modify, distribute and sell this software
00036  * and its documentation for any purpose is hereby granted without fee,
00037  * provided that the above copyright notice appear in all copies and
00038  * that both that copyright notice and this permission notice appear
00039  * in supporting documentation.  Hewlett-Packard Company makes no
00040  * representations about the suitability of this software for any
00041  * purpose.  It is provided "as is" without express or implied warranty.
00042  *
00043  *
00044  * Copyright (c) 1996,1997
00045  * Silicon Graphics Computer Systems, Inc.
00046  *
00047  * Permission to use, copy, modify, distribute and sell this software
00048  * and its documentation for any purpose is hereby granted without fee,
00049  * provided that the above copyright notice appear in all copies and
00050  * that both that copyright notice and this permission notice appear
00051  * in supporting documentation.  Silicon Graphics makes no
00052  * representations about the suitability of this software for any
00053  * purpose.  It is provided "as is" without express or implied warranty.
00054  */
00055 
00056 /** @file stl_tempbuf.h
00057  *  This is an internal header file, included by other library headers.
00058  *  You should not attempt to use it directly.
00059  */
00060 
00061 #ifndef __GLIBCPP_INTERNAL_TEMPBUF_H
00062 #define __GLIBCPP_INTERNAL_TEMPBUF_H
00063 
00064 namespace std
00065 {
00066 
00067 /**
00068  *  @if maint
00069  *  This class is used in two places:  stl_algo.h and ext/memory, where it
00070  *  is wrapped as the temporary_buffer class.  See temporary_buffer docs for
00071  *  more notes.
00072  *  @endif
00073 */
00074 template <class _ForwardIterator, class _Tp>
00075   class _Temporary_buffer
00076 {
00077   // concept requirements
00078   __glibcpp_class_requires(_ForwardIterator, _ForwardIteratorConcept)
00079 
00080   ptrdiff_t  _M_original_len;
00081   ptrdiff_t  _M_len;
00082   _Tp*       _M_buffer;
00083 
00084   // this is basically get_temporary_buffer() all over again
00085   void _M_allocate_buffer() {
00086     _M_original_len = _M_len;
00087     _M_buffer = 0;
00088 
00089     if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
00090       _M_len = INT_MAX / sizeof(_Tp);
00091 
00092     while (_M_len > 0) {
00093       _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
00094       if (_M_buffer)
00095         break;
00096       _M_len /= 2;
00097     }
00098   }
00099 
00100   void _M_initialize_buffer(const _Tp&, __true_type) {}
00101   void _M_initialize_buffer(const _Tp& val, __false_type) {
00102     uninitialized_fill_n(_M_buffer, _M_len, val);
00103   }
00104 
00105 public:
00106   /// As per Table mumble.
00107   ptrdiff_t size() const { return _M_len; }
00108   /// Returns the size requested by the constructor; may be >size().
00109   ptrdiff_t requested_size() const { return _M_original_len; }
00110   /// As per Table mumble.
00111   _Tp* begin() { return _M_buffer; }
00112   /// As per Table mumble.
00113   _Tp* end() { return _M_buffer + _M_len; }
00114 
00115   _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
00116     // Workaround for a __type_traits bug in the pre-7.3 compiler.
00117     typedef typename __type_traits<_Tp>::has_trivial_default_constructor
00118             _Trivial;
00119 
00120     try {
00121       _M_len = distance(__first, __last);
00122       _M_allocate_buffer();
00123       if (_M_len > 0)
00124         _M_initialize_buffer(*__first, _Trivial());
00125     }
00126     catch(...)
00127       { 
00128     free(_M_buffer); 
00129     _M_buffer = 0; 
00130     _M_len = 0;
00131     __throw_exception_again; 
00132       }
00133   }
00134  
00135   ~_Temporary_buffer() {  
00136     _Destroy(_M_buffer, _M_buffer + _M_len);
00137     free(_M_buffer);
00138   }
00139 
00140 private:
00141   // Disable copy constructor and assignment operator.
00142   _Temporary_buffer(const _Temporary_buffer&) {}
00143   void operator=(const _Temporary_buffer&) {}
00144 };
00145     
00146 } // namespace std
00147 
00148 #endif /* __GLIBCPP_INTERNAL_TEMPBUF_H */
00149 

Generated on Thu Feb 10 23:22:59 2005 for libstdc++-v3 Source by  doxygen 1.4.0