stl_temp.h
上传用户:nizebo
上传日期:2022-05-14
资源大小:882k
文件大小:5k
源码类别:

STL

开发平台:

Visual C++

  1. /*
  2.  *
  3.  * Copyright (c) 1994
  4.  * Hewlett-Packard Company
  5.  *
  6.  * Permission to use, copy, modify, distribute and sell this software
  7.  * and its documentation for any purpose is hereby granted without fee,
  8.  * provided that the above copyright notice appear in all copies and
  9.  * that both that copyright notice and this permission notice appear
  10.  * in supporting documentation.  Hewlett-Packard Company makes no
  11.  * representations about the suitability of this software for any
  12.  * purpose.  It is provided "as is" without express or implied warranty.
  13.  *
  14.  *
  15.  * Copyright (c) 1996,1997
  16.  * Silicon Graphics Computer Systems, Inc.
  17.  *
  18.  * Permission to use, copy, modify, distribute and sell this software
  19.  * and its documentation for any purpose is hereby granted without fee,
  20.  * provided that the above copyright notice appear in all copies and
  21.  * that both that copyright notice and this permission notice appear
  22.  * in supporting documentation.  Silicon Graphics makes no
  23.  * representations about the suitability of this software for any
  24.  * purpose.  It is provided "as is" without express or implied warranty.
  25.  */
  26. /* NOTE: This is an internal header file, included by other STL headers.
  27.  *   You should not attempt to use it directly.
  28.  */
  29. #ifndef __SGI_STL_INTERNAL_TEMPBUF_H
  30. #define __SGI_STL_INTERNAL_TEMPBUF_H
  31. __STL_BEGIN_NAMESPACE
  32. template <class _Tp>
  33. pair<_Tp*, ptrdiff_t> 
  34. __get_temporary_buffer(ptrdiff_t __len, _Tp*)
  35. {
  36.   if (__len > ptrdiff_t(INT_MAX / sizeof(_Tp)))
  37.     __len = INT_MAX / sizeof(_Tp);
  38.   while (__len > 0) {
  39.     _Tp* __tmp = (_Tp*) malloc((size_t)__len * sizeof(_Tp));
  40.     if (__tmp != 0)
  41.       return pair<_Tp*, ptrdiff_t>(__tmp, __len);
  42.     __len /= 2;
  43.   }
  44.   return pair<_Tp*, ptrdiff_t>((_Tp*)0, 0);
  45. }
  46. #ifdef __STL_EXPLICIT_FUNCTION_TMPL_ARGS
  47. template <class _Tp>
  48. inline pair<_Tp*, ptrdiff_t> get_temporary_buffer(ptrdiff_t __len) {
  49.   return __get_temporary_buffer(__len, (_Tp*) 0);
  50. }
  51. #endif /* __STL_EXPLICIT_FUNCTION_TMPL_ARGS */
  52. // This overload is not required by the standard; it is an extension.
  53. // It is supported for backward compatibility with the HP STL, and
  54. // because not all compilers support the language feature (explicit
  55. // function template arguments) that is required for the standard
  56. // version of get_temporary_buffer.
  57. template <class _Tp>
  58. inline pair<_Tp*, ptrdiff_t> get_temporary_buffer(ptrdiff_t __len, _Tp*) {
  59.   return __get_temporary_buffer(__len, (_Tp*) 0);
  60. }
  61. template <class _Tp>
  62. void return_temporary_buffer(_Tp* __p) {
  63.   free(__p);
  64. }
  65. template <class _ForwardIterator, class _Tp>
  66. class _Temporary_buffer {
  67. private:
  68.   ptrdiff_t  _M_original_len;
  69.   ptrdiff_t  _M_len;
  70.   _Tp*       _M_buffer;
  71.   void _M_allocate_buffer() {
  72.     _M_original_len = _M_len;
  73.     _M_buffer = 0;
  74.     if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
  75.       _M_len = INT_MAX / sizeof(_Tp);
  76.     while (_M_len > 0) {
  77.       _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
  78.       if (_M_buffer)
  79.         break;
  80.       _M_len /= 2;
  81.     }
  82.   }
  83.   void _M_initialize_buffer(const _Tp&, __true_type) {}
  84.   void _M_initialize_buffer(const _Tp& val, __false_type) {
  85.     uninitialized_fill_n(_M_buffer, _M_len, val);
  86.   }
  87. public:
  88.   ptrdiff_t size() const { return _M_len; }
  89.   ptrdiff_t requested_size() const { return _M_original_len; }
  90.   _Tp* begin() { return _M_buffer; }
  91.   _Tp* end() { return _M_buffer + _M_len; }
  92.   _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
  93.     // Workaround for a __type_traits bug in the pre-7.3 compiler.
  94. #   if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730
  95.     typedef typename __type_traits<_Tp>::is_POD_type _Trivial;
  96. #   else
  97.     typedef typename __type_traits<_Tp>::has_trivial_default_constructor
  98.             _Trivial;
  99. #   endif
  100.     __STL_TRY {
  101.       _M_len = 0;
  102.       distance(__first, __last, _M_len);
  103.       _M_allocate_buffer();
  104.       if (_M_len > 0)
  105.         _M_initialize_buffer(*__first, _Trivial());
  106.     }
  107.     __STL_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0);
  108.   }
  109.  
  110.   ~_Temporary_buffer() {  
  111.     destroy(_M_buffer, _M_buffer + _M_len);
  112.     free(_M_buffer);
  113.   }
  114. private:
  115.   // Disable copy constructor and assignment operator.
  116.   _Temporary_buffer(const _Temporary_buffer&) {}
  117.   void operator=(const _Temporary_buffer&) {}
  118. };
  119. // Class temporary_buffer is not part of the standard.  It is an extension.
  120. template <class _ForwardIterator, 
  121.           class _Tp 
  122. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  123.                     = typename iterator_traits<_ForwardIterator>::value_type
  124. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  125.          >
  126. struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
  127. {
  128.   temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
  129.     : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
  130.   ~temporary_buffer() {}
  131. };
  132.     
  133. __STL_END_NAMESPACE
  134. #endif /* __SGI_STL_INTERNAL_TEMPBUF_H */
  135. // Local Variables:
  136. // mode:C++
  137. // End: