stl_tempbuf.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:4k
源码类别:

3D图形编程

开发平台:

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 _T>
  33. pair<_T*, ptrdiff_t> 
  34. get_temporary_buffer(ptrdiff_t __len, _T*)
  35. {
  36.   if (__len > ptrdiff_t(INT_MAX / sizeof(_T)))
  37.     __len = INT_MAX / sizeof(_T);
  38.   while (__len > 0) {
  39.     _T* __tmp = (_T*) malloc((size_t)__len * sizeof(_T));
  40.     if (__tmp != 0)
  41.       return pair<_T*, ptrdiff_t>(__tmp, __len);
  42.     __len /= 2;
  43.   }
  44.   return pair<_T*, ptrdiff_t>((_T*)0, 0);
  45. }
  46. template <class _T>
  47. void return_temporary_buffer(_T* __p) {
  48.   free(__p);
  49. }
  50. template <class _ForwardIterator, class _T>
  51. class _Temporary_buffer {
  52. private:
  53.   ptrdiff_t _M_original_len;
  54.   ptrdiff_t _M_len;
  55.   _T*       _M_buffer;
  56.   void _M_allocate_buffer() {
  57.     _M_original_len = _M_len;
  58.     _M_buffer = 0;
  59.     if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_T)))
  60.       _M_len = INT_MAX / sizeof(_T);
  61.     while (_M_len > 0) {
  62.       _M_buffer = (_T*) malloc(_M_len * sizeof(_T));
  63.       if (_M_buffer)
  64.         break;
  65.       _M_len /= 2;
  66.     }
  67.   }
  68.   void _M_initialize_buffer(const _T&, __true_type) {}
  69.   void _M_initialize_buffer(const _T& val, __false_type) {
  70.     uninitialized_fill_n(_M_buffer, _M_len, val);
  71.   }
  72. public:
  73.   ptrdiff_t size() const { return _M_len; }
  74.   ptrdiff_t requested_size() const { return _M_original_len; }
  75.   _T* begin() { return _M_buffer; }
  76.   _T* end() { return _M_buffer + _M_len; }
  77.   _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
  78.     __STL_TRY {
  79.       _M_len = 0;
  80.       distance(__first, __last, _M_len);
  81.       _M_allocate_buffer();
  82.       if (_M_len > 0)
  83.         _M_initialize_buffer(
  84.             *__first,
  85.             __type_traits<_T>::has_trivial_default_constructor());
  86.     }
  87.     __STL_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0);
  88.   }
  89.  
  90.   ~_Temporary_buffer() {  
  91.     destroy(_M_buffer, _M_buffer + _M_len);
  92.     free(_M_buffer);
  93.   }
  94. private:
  95.   // Disable copy constructor and assignment operator.
  96.   _Temporary_buffer(const _Temporary_buffer&) {}
  97.   void operator=(const _Temporary_buffer&) {}
  98. };
  99. // Class temporary_buffer is not part of the standard.  It is an extension.
  100. template <class _ForwardIterator, 
  101.           class _T 
  102. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  103.                     = typename iterator_traits<_ForwardIterator>::value_type
  104. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  105.          >
  106. struct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _T>
  107. {
  108.   temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
  109.     : _Temporary_buffer<_ForwardIterator, _T>(__first, __last) {}
  110.   ~temporary_buffer() {}
  111. };
  112.     
  113. __STL_END_NAMESPACE
  114. #endif /* __SGI_STL_INTERNAL_TEMPBUF_H */
  115. // Local Variables:
  116. // mode:C++
  117. // End: