19720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/*
29720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
39720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1994
49720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Hewlett-Packard Company
59720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
69720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1996,1997
79720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Silicon Graphics Computer Systems, Inc.
89720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
99720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1997
109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Moscow Center for SPARC Technology
119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Copyright (c) 1999
139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Boris Fomitchev
149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * This material is provided "as is", with absolutely no warranty expressed
169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * or implied. Any use is at your own risk.
179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to use or copy this software for any purpose is hereby granted
199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * without fee, provided the above notices are retained on all copies.
209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * Permission to modify the code and to distribute modified code is granted,
219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * provided the above notices are retained, and a notice that the code was
229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block * modified is included with the above copyright notice.
239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *
249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block/* NOTE: This is an internal header file, included by other STL headers.
279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block *   You should not attempt to use it directly.
289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block */
299720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_CONSTRUCT_H
319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#define _STLP_INTERNAL_CONSTRUCT_H
329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_DEBUG_UNINITIALIZED) && !defined (_STLP_INTERNAL_CSTRING)
349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_cstring.h>
359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
369720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_NEW
389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_new.h>
399720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
409720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
419720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#ifndef _STLP_INTERNAL_ITERATOR_BASE_H
429720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_iterator_base.h>
439720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
449720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#ifndef _STLP_TYPE_TRAITS_H
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  include <stl/type_traits.h>
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_MOVE_CONSTRUCT_FWK_H) && !defined (_STLP_NO_MOVE_SEMANTIC)
509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  include <stl/_move_construct_fwk.h>
519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_BEGIN_NAMESPACE
549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __destroy_aux(_Tp* __pointer, const __false_type& /*_Trivial_destructor*/)
579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block{ __pointer->~_Tp(); }
589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void __destroy_aux(_Tp*, const __true_type& /*_Trivial_destructor*/) {}
619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy(_Tp* __pointer) {
649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __destroy_aux(__pointer, _Trivial_destructor());
669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset(__REINTERPRET_CAST(char*, __pointer), _STLP_SHRED_BYTE, sizeof(_Tp));
689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy_Moved(_Tp* __pointer) {
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Tp>::complete _Trivial_destructor;
759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __destroy_aux(__pointer, _Trivial_destructor());
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  if defined (_STLP_DEBUG_UNINITIALIZED)
779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((char*)__pointer, _STLP_SHRED_BYTE, sizeof(_Tp));
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#  endif
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Destroy(__pointer);
819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (new)
859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_NEW_REDEFINE new
869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef new
879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1>
909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Construct_aux (_T1* __p, const __false_type&) {
91e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  new(__p) _T1();
929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1>
959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Construct_aux (_T1* __p, const __true_type&) {
96e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined (_STLP_DEF_CONST_PLCT_NEW_BUG)
97e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__p = _T1(0);
98e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
99e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We use binary copying for POD types since it results
100e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // in a considerably better code at least on MSVC.
101e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__p = _T1();
1029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DEF_CONST_PLCT_NEW_BUG */
103e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
1049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1>
1069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Construct(_T1* __p) {
1079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
1089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
1099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEF_CONST_PLCT_NEW_BUG)
111e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Construct_aux (__p, _HasDefaultZeroValue(__p)._Answer());
1129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
113e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Construct_aux (__p, _Is_POD(__p)._Answer());
1149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DEF_CONST_PLCT_NEW_BUG */
1159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
118e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _Copy_Construct_aux(_Tp* __p, const _Tp& __val, const __false_type&) {
119e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  new(__p) _Tp(__val);
120e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
121e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
122e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp>
123e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _Copy_Construct_aux(_Tp* __p, const _Tp& __val, const __true_type&) {
124e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We use binary copying for POD types since it results
125e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // in a considerably better code at least on MSVC.
126e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__p = __val;
127e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
128e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
129e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _Tp>
1309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Copy_Construct(_Tp* __p, const _Tp& __val) {
1319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
1329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_Tp));
1339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
134e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Copy_Construct_aux(__p, __val, _Is_POD(__p)._Answer());
135e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
136e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
137e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _T1, class _T2>
138e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _Param_Construct_aux(_T1* __p, const _T2& __val, const __false_type&) {
139e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  new(__p) _T1(__val);
140e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
141e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
142e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scotttemplate <class _T1, class _T2>
143e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _Param_Construct_aux(_T1* __p, const _T2& __val, const __true_type&) {
144e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We use binary copying for POD types since it results
145e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // in a considerably better code at least on MSVC.
146e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__p = _T1(__val);
1479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2>
1509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Param_Construct(_T1* __p, const _T2& __val) {
1519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
1529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
1539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
154e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Param_Construct_aux(__p, __val, _Is_POD(__p)._Answer());
1559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2>
1589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Move_Construct_Aux(_T1* __p, _T2& __val, const __false_type& /*_IsPOD*/) {
159e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
160e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  new(__p) _T1(_STLP_PRIV _AsMoveSource(__val));
161e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
162e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  _Param_Construct(__p, __val);
163e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
1649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2>
1679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Move_Construct_Aux(_T1* __p, _T2& __val, const __true_type& /*_IsPOD*/) {
168e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // We use binary copying for POD types since it results
169e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  // in a considerably better code at least on MSVC.
170e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  *__p = _T1(__val);
1719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2>
1749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Move_Construct(_T1* __p, _T2& __val) {
1759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
1769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  memset((char*)__p, _STLP_SHRED_BYTE, sizeof(_T1));
1779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  _Move_Construct_Aux(__p, __val, _Is_POD(__p)._Answer());
1799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined(_STLP_NEW_REDEFINE)
1829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  if defined (DEBUG_NEW)
1839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#    define new DEBUG_NEW
1849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  endif
1859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  undef _STLP_NEW_REDEFINE
1869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator, class _Tp>
1899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP void
1909720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__destroy_range_aux(_ForwardIterator __first, _ForwardIterator __last, _Tp*, const __false_type& /*_Trivial_destructor*/) {
1919720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__first) {
1929720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    __destroy_aux(&(*__first), __false_type());
1939720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
1949720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    memset((char*)&(*__first), _STLP_SHRED_BYTE, sizeof(_Tp));
1959720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
1969720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  }
1979720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
1989720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
1999720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator, class _Tp>
2009720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEBUG_UNINITIALIZED)
2019720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_INLINE_LOOP void
2029720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__destroy_range_aux(_ForwardIterator __first, _ForwardIterator __last, _Tp*, const __true_type& /*_Trivial_destructor*/) {
2039720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  for ( ; __first != __last; ++__first)
2049720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block    memset((char*)&(*__first), _STLP_SHRED_BYTE, sizeof(_Tp));
2059720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2069720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2079720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void
2089720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__destroy_range_aux(_ForwardIterator, _ForwardIterator, _Tp*, const __true_type& /*_Trivial_destructor*/) {}
2099720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2109720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2119720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator, class _Tp>
2129720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void
2139720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__destroy_range(_ForwardIterator __first, _ForwardIterator __last, _Tp *__ptr) {
2149720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __type_traits<_Tp>::has_trivial_destructor _Trivial_destructor;
2159720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __destroy_range_aux(__first, __last, __ptr, _Trivial_destructor());
2169720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2179720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2189720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator>
2199720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy_Range(_ForwardIterator __first, _ForwardIterator __last) {
2209720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __destroy_range(__first, __last, _STLP_VALUE_TYPE(__first, _ForwardIterator));
2219720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2229720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2239720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy_Range(char*, char*) {}
2249720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_HAS_WCHAR_T) // dwa 8/15/97
2259720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy_Range(wchar_t*, wchar_t*) {}
2269720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void _Destroy_Range(const wchar_t*, const wchar_t*) {}
2279720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif
2289720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
229e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
2309720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator, class _Tp>
2319720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void
2329720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block__destroy_mv_srcs(_ForwardIterator __first, _ForwardIterator __last, _Tp *__ptr) {
2339720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  typedef typename __move_traits<_Tp>::complete _CompleteMove;
2349720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  __destroy_range_aux(__first, __last, __ptr, _CompleteMove());
2359720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
236e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2379720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2389720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator>
239e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline void _Destroy_Moved_Range(_ForwardIterator __first, _ForwardIterator __last)
240e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if !defined (_STLP_NO_MOVE_SEMANTIC)
241e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ __destroy_mv_srcs(__first, __last, _STLP_VALUE_TYPE(__first, _ForwardIterator)); }
242e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#else
243e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{ _Destroy_Range(__first, __last); }
244e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
2459720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2469720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if defined (_STLP_DEF_CONST_DEF_PARAM_BUG)
2479720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Those adaptors are here to fix common compiler bug regarding builtins:
2489720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// expressions like int k = int() should initialize k to 0
2499720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2509720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp __default_constructed_aux(_Tp*, const __false_type&) {
2519720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _Tp();
2529720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2539720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2549720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp __default_constructed_aux(_Tp*, const __true_type&) {
2559720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return _Tp(0);
2569720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2579720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2589720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2599720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline _Tp __default_constructed(_Tp* __p) {
2609720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block  return __default_constructed_aux(__p, _HasDefaultZeroValue(__p)._Answer());
2619720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block}
2629720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2639720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_DEFAULT_CONSTRUCTED(_TTp) __default_constructed((_TTp*)0)
2649720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#else
2659720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#  define _STLP_DEFAULT_CONSTRUCTED(_TTp) _TTp()
2669720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_DEF_CONST_DEF_PARAM_BUG */
2679720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2689720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2699720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#if !defined (_STLP_NO_ANACHRONISMS)
2709720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// --------------------------------------------------
2719720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Old names from the HP STL.
2729720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2739720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1, class _T2>
2749720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void construct(_T1* __p, const _T2& __val) {_Param_Construct(__p, __val); }
2759720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _T1>
2769720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void construct(_T1* __p) { _STLP_STD::_Construct(__p); }
2779720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _Tp>
2789720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void destroy(_Tp* __pointer) {  _STLP_STD::_Destroy(__pointer); }
2799720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blocktemplate <class _ForwardIterator>
2809720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Blockinline void destroy(_ForwardIterator __first, _ForwardIterator __last) { _STLP_STD::_Destroy_Range(__first, __last); }
2819720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_NO_ANACHRONISMS */
2829720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2839720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block_STLP_END_NAMESPACE
2849720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2859720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block#endif /* _STLP_INTERNAL_CONSTRUCT_H */
2869720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block
2879720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// Local Variables:
2889720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// mode:C++
2899720d5f59b9c1f5d1b9ecbc9173dbcb71bd557beSteve Block// End:
290