stl_tempbuf.h
上传用户:sichengcw
上传日期:2009-02-17
资源大小:202k
文件大小:3k
源码类别:

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 T>
  33. pair<T*, ptrdiff_t> get_temporary_buffer(ptrdiff_t len, T*) {
  34.   if (len > ptrdiff_t(INT_MAX / sizeof(T)))
  35.     len = INT_MAX / sizeof(T);
  36.   while (len > 0) {
  37.     T* tmp = (T*) malloc((size_t)len * sizeof(T));
  38.     if (tmp != 0)
  39.       return pair<T*, ptrdiff_t>(tmp, len);
  40.     len /= 2;
  41.   }
  42.   return pair<T*, ptrdiff_t>((T*)0, 0);
  43. }
  44. template <class T>
  45. void return_temporary_buffer(T* p) {
  46.   free(p);
  47. }
  48. template <class ForwardIterator,
  49.           class T 
  50. #ifdef __STL_CLASS_PARTIAL_SPECIALIZATION
  51.                   = iterator_traits<ForwardIterator>::value_type 
  52. #endif /* __STL_CLASS_PARTIAL_SPECIALIZATION */
  53.          >
  54. class temporary_buffer {
  55. private:
  56.   ptrdiff_t original_len;
  57.   ptrdiff_t len;
  58.   T* buffer;
  59.   void allocate_buffer() {
  60.     original_len = len;
  61.     buffer = 0;
  62.     if (len > (ptrdiff_t)(INT_MAX / sizeof(T)))
  63.       len = INT_MAX / sizeof(T);
  64.     while (len > 0) {
  65.       buffer = (T*) malloc(len * sizeof(T));
  66.       if (buffer)
  67.         break;
  68.       len /= 2;
  69.     }
  70.   }
  71.   void initialize_buffer(const T&, __true_type) {}
  72.   void initialize_buffer(const T& val, __false_type) {
  73.     uninitialized_fill_n(buffer, len, val);
  74.   }
  75. public:
  76.   ptrdiff_t size() const { return len; }
  77.   ptrdiff_t requested_size() const { return original_len; }
  78.   T* begin() { return buffer; }
  79.   T* end() { return buffer + len; }
  80.   temporary_buffer(ForwardIterator first, ForwardIterator last) {
  81.     __STL_TRY {
  82.       len = 0;
  83.       distance(first, last, len);
  84.       allocate_buffer();
  85.       if (len > 0)
  86.         initialize_buffer(*first,
  87.                           typename __type_traits<T>::has_trivial_default_constructor());
  88.     }
  89.     __STL_UNWIND(free(buffer); buffer = 0; len = 0);
  90.   }
  91.  
  92.   ~temporary_buffer() {  
  93.     destroy(buffer, buffer + len);
  94.     free(buffer);
  95.   }
  96. private:
  97.   temporary_buffer(const temporary_buffer&) {}
  98.   void operator=(const temporary_buffer&) {}
  99. };
  100. __STL_END_NAMESPACE
  101. #endif /* __SGI_STL_INTERNAL_TEMPBUF_H */
  102. // Local Variables:
  103. // mode:C++
  104. // End: