177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/*
277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1994
477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Hewlett-Packard Company
577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1996,1997
777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Silicon Graphics Computer Systems, Inc.
877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1997
1077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Moscow Center for SPARC Technology
1177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Copyright (c) 1999
1377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Boris Fomitchev
1477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * This material is provided "as is", with absolutely no warranty expressed
1677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * or implied. Any use is at your own risk.
1777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
1877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to use or copy this software for any purpose is hereby granted
1977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * without fee, provided the above notices are retained on all copies.
2077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * Permission to modify the code and to distribute modified code is granted,
2177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * provided the above notices are retained, and a notice that the code was
2277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner * modified is included with the above copyright notice.
2377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *
2477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
2677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner/* NOTE: This is an internal header file, included by other STL headers.
2777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner *   You should not attempt to use it directly.
2877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner */
2977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_TEMPBUF_H
3177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#define _STLP_INTERNAL_TEMPBUF_H
3277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_CLIMITS
3477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <climits>
3577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
3677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
3777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_CSTDLIB
3877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_cstdlib.h>
3977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_INTERNAL_UNINITIALIZED_H
4277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_uninitialized.h>
4377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
4477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_BEGIN_NAMESPACE
4677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
4777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
4877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpair<_Tp*, ptrdiff_t>  _STLP_CALL
4977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner__get_temporary_buffer(ptrdiff_t __len, _Tp*);
5077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifndef _STLP_NO_EXPLICIT_FUNCTION_TMPL_ARGS
5277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
5477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pair<_Tp*, ptrdiff_t>  _STLP_CALL get_temporary_buffer(ptrdiff_t __len) {
5577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __get_temporary_buffer(__len, (_Tp*) 0);
5677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
5777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
5877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# if ! defined(_STLP_NO_EXTENSIONS)
5977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// This overload is not required by the standard; it is an extension.
6077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// It is supported for backward compatibility with the HP STL, and
6177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// because not all compilers support the language feature (explicit
6277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// function template arguments) that is required for the standard
6377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// version of get_temporary_buffer.
6477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
6577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline pair<_Tp*, ptrdiff_t>  _STLP_CALL
6677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerget_temporary_buffer(ptrdiff_t __len, _Tp*) {
6777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  return __get_temporary_buffer(__len, (_Tp*) 0);
6877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
6977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif
7077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif
7177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _Tp>
7377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerinline void  _STLP_CALL return_temporary_buffer(_Tp* __p) {
7477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// SunPro brain damage
7577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  free((char*)__p);
7677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner}
7777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
7877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ForwardIterator, class _Tp>
7977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerclass _Temporary_buffer {
8077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
8177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ptrdiff_t  _M_original_len;
8277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ptrdiff_t  _M_len;
8377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp*       _M_buffer;
8477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_allocate_buffer() {
8677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_original_len = _M_len;
8777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _M_buffer = 0;
8877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
8977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    if (_M_len > (ptrdiff_t)(INT_MAX / sizeof(_Tp)))
9077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_len = INT_MAX / sizeof(_Tp);
9177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
9277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    while (_M_len > 0) {
9377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_buffer = (_Tp*) malloc(_M_len * sizeof(_Tp));
9477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_M_buffer)
9577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        break;
9677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_len /= 2;
9777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
9877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
9977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_initialize_buffer(const _Tp&, const __true_type&) {}
10177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void _M_initialize_buffer(const _Tp& val, const __false_type&) {
10277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    uninitialized_fill_n(_M_buffer, _M_len, val);
10377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
10477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
10577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerpublic:
10677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ptrdiff_t size() const { return _M_len; }
10777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ptrdiff_t requested_size() const { return _M_original_len; }
10877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* begin() { return _M_buffer; }
10977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Tp* end() { return _M_buffer + _M_len; }
11077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
11177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Temporary_buffer(_ForwardIterator __first, _ForwardIterator __last) {
11277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    // Workaround for a __type_traits bug in the pre-7.3 compiler.
11377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#   if defined(__sgi) && !defined(__GNUC__) && _COMPILER_VERSION < 730
11477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename __type_traits<_Tp>::is_POD_type _Trivial;
11577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#   else
11677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    typedef typename __type_traits<_Tp>::has_trivial_default_constructor  _Trivial;
11777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#   endif
11877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_TRY {
11977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_len = _STLP_STD::distance(__first, __last);
12077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      _M_allocate_buffer();
12177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner      if (_M_len > 0)
12277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner        _M_initialize_buffer(*__first, _Trivial());
12377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    }
12477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_UNWIND(free(_M_buffer); _M_buffer = 0; _M_len = 0)
12577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
12677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
12777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~_Temporary_buffer() {
12877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    _STLP_STD::_Destroy_Range(_M_buffer, _M_buffer + _M_len);
12977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    free(_M_buffer);
13077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  }
13177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerprivate:
13377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  // Disable copy constructor and assignment operator.
13477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  _Temporary_buffer(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
13577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  void operator=(const _Temporary_buffer<_ForwardIterator, _Tp>&) {}
13677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
13777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
13877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_NO_EXTENSIONS
13977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Class temporary_buffer is not part of the standard.  It is an extension.
14177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
14277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnertemplate <class _ForwardIterator,
14377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner          class _Tp
14477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#ifdef _STLP_CLASS_PARTIAL_SPECIALIZATION
14577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner                    = typename iterator_traits<_ForwardIterator>::value_type
14677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_CLASS_PARTIAL_SPECIALIZATION */
14777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner         >
14877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turnerstruct temporary_buffer : public _Temporary_buffer<_ForwardIterator, _Tp>
14977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner{
15077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  temporary_buffer(_ForwardIterator __first, _ForwardIterator __last)
15177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner    : _Temporary_buffer<_ForwardIterator, _Tp>(__first, __last) {}
15277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner  ~temporary_buffer() {}
15377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner};
15477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif /* _STLP_NO_EXTENSIONS */
15677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner_STLP_END_NAMESPACE
15877dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
15977dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# ifndef _STLP_LINK_TIME_INSTANTIATION
16077dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#  include <stl/_tempbuf.c>
16177dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner# endif
16277dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16377dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner#endif /* _STLP_INTERNAL_TEMPBUF_H */
16477dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner
16577dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// Local Variables:
16677dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// mode:C++
16777dc872c5c4ae67e051d1bf7edf96ce36c7b9be2David 'Digit' Turner// End:
168