/* * * Copyright (c) 1994 * Hewlett-Packard Company * * Permission to use, copy, modify, distribute and sell this software * and its documentation for any purpose is hereby granted without fee, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. Hewlett-Packard Company and Microsoft * Corporation make no representations about the suitability of this * software for any purpose. It is provided "as is" without express or * implied warranty. * */ #ifndef TEMPBUF_H #define TEMPBUF_H #include #include #ifndef __stl_buffer_size #define __stl_buffer_size 16384 // 16k #endif extern char __stl_temp_buffer[__stl_buffer_size]; //not reentrant code template pair get_temporary_buffer(int len, T*) { while (len > __stl_buffer_size / sizeof(T)) { set_new_handler(0); T* tmp = (T*)(::operator new((unsigned int)len * sizeof(T))); if (tmp) return pair(tmp, len); len = len / 2; } return pair((T*)__stl_temp_buffer, (int)(__stl_buffer_size / sizeof(T))); } template void return_temporary_buffer(T* p) { if ((char*)(p) != __stl_temp_buffer) deallocate(p); } template pair get_temporary_buffer(long len, T* p) { if (len > INT_MAX/sizeof(T)) len = INT_MAX/sizeof(T); pair tmp = get_temporary_buffer((int)len, p); return pair(tmp.first, (long)(tmp.second)); } #endif