home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / libg++-2.7.1-bin.lha / lib / g++-include / tempbuf.h < prev    next >
C/C++ Source or Header  |  1996-10-12  |  2KB  |  56 lines

  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.  
  16. #ifndef TEMPBUF_H
  17. #define TEMPBUF_H
  18.  
  19. #include <limits.h>
  20. #include <pair.h>
  21.  
  22. #ifndef __stl_buffer_size
  23. #define __stl_buffer_size 16384 // 16k
  24. #endif
  25.  
  26. extern char __stl_temp_buffer[__stl_buffer_size];
  27.  
  28. //not reentrant code
  29.  
  30. template <class T>
  31. pair<T*, int> get_temporary_buffer(int len, T*) {
  32.     while (len > __stl_buffer_size / sizeof(T)) {
  33.     set_new_handler(0);
  34.         T* tmp = (T*)(::operator new((unsigned int)len * sizeof(T)));
  35.         if (tmp) return pair<T*, int>(tmp, len);
  36.         len = len / 2;
  37.     }
  38.     return pair<T*, int>((T*)__stl_temp_buffer, 
  39.                          (int)(__stl_buffer_size / sizeof(T)));
  40. }
  41.  
  42. template <class T>
  43. void return_temporary_buffer(T* p) {
  44.     if ((char*)(p) != __stl_temp_buffer) deallocate(p);
  45. }
  46.  
  47. template <class T>
  48. pair<T*, long> get_temporary_buffer(long len, T* p) {
  49.     if (len > INT_MAX/sizeof(T)) 
  50.     len = INT_MAX/sizeof(T);
  51.     pair<T*, int> tmp = get_temporary_buffer((int)len, p);
  52.     return pair<T*, long>(tmp.first, (long)(tmp.second));
  53. }
  54.  
  55. #endif
  56.