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