home *** CD-ROM | disk | FTP | other *** search
/ Beginning C++ Through Gam…rogramming (2nd Edition) / BCGP2E.ISO / bloodshed / devcpp-4.9.9.2_setup.exe / stl_tempbuf.h < prev    next >
C/C++ Source or Header  |  2005-01-29  |  5KB  |  172 lines

  1. // Temporary buffer implementation -*- C++ -*-
  2.  
  3. // Copyright (C) 2001, 2002, 2004 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, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
  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.  
  66. namespace 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 __type_traits<_Tp>::has_trivial_default_constructor
  149.           _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. } // namespace std
  169.  
  170. #endif /* _TEMPBUF_H */
  171.  
  172.