epoc32/include/stdapis/stlport/stl/_uninitialized.h
author William Roberts <williamr@symbian.org>
Wed, 31 Mar 2010 12:33:34 +0100
branchSymbian3
changeset 4 837f303aceeb
permissions -rw-r--r--
Current Symbian^3 public API header files (from PDK 3.0.h)
This is the epoc32/include tree with the "platform" subtrees removed, and
all but a selected few mbg and rsg files removed.
williamr@4
     1
/*
williamr@4
     2
 *
williamr@4
     3
 * Copyright (c) 1994
williamr@4
     4
 * Hewlett-Packard Company
williamr@4
     5
 *
williamr@4
     6
 * Copyright (c) 1996,1997
williamr@4
     7
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     8
 *
williamr@4
     9
 * Copyright (c) 1997
williamr@4
    10
 * Moscow Center for SPARC Technology
williamr@4
    11
 *
williamr@4
    12
 * Copyright (c) 1999 
williamr@4
    13
 * Boris Fomitchev
williamr@4
    14
 *
williamr@4
    15
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    16
 * or implied. Any use is at your own risk.
williamr@4
    17
 *
williamr@4
    18
 * Permission to use or copy this software for any purpose is hereby granted 
williamr@4
    19
 * without fee, provided the above notices are retained on all copies.
williamr@4
    20
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    21
 * provided the above notices are retained, and a notice that the code was
williamr@4
    22
 * modified is included with the above copyright notice.
williamr@4
    23
 *
williamr@4
    24
 */
williamr@4
    25
williamr@4
    26
/* NOTE: This is an internal header file, included by other STL headers.
williamr@4
    27
 *   You should not attempt to use it directly.
williamr@4
    28
 */
williamr@4
    29
williamr@4
    30
#ifndef _STLP_INTERNAL_UNINITIALIZED_H
williamr@4
    31
#define _STLP_INTERNAL_UNINITIALIZED_H
williamr@4
    32
williamr@4
    33
# ifndef _STLP_CSTRING
williamr@4
    34
#  include <cstring>
williamr@4
    35
# endif
williamr@4
    36
williamr@4
    37
# ifndef _STLP_INTERNAL_ALGOBASE_H
williamr@4
    38
#  include <stl/_algobase.h>
williamr@4
    39
# endif
williamr@4
    40
williamr@4
    41
# ifndef _STLP_INTERNAL_CONSTRUCT_H
williamr@4
    42
#  include <stl/_construct.h>
williamr@4
    43
# endif
williamr@4
    44
williamr@4
    45
_STLP_BEGIN_NAMESPACE
williamr@4
    46
williamr@4
    47
// uninitialized_copy
williamr@4
    48
williamr@4
    49
// Valid if copy construction is equivalent to assignment, and if the
williamr@4
    50
//  destructor is trivial.
williamr@4
    51
template <class _InputIter, class _ForwardIter>
williamr@4
    52
inline _ForwardIter 
williamr@4
    53
__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
williamr@4
    54
                     const __true_type&) {
williamr@4
    55
  return __copy_aux(__first, __last, __result, _BothPtrType< _InputIter, _ForwardIter> :: _Ret());
williamr@4
    56
}
williamr@4
    57
williamr@4
    58
template <class _InputIter, class _ForwardIter>
williamr@4
    59
// _STLP_INLINE_LOOP
williamr@4
    60
_ForwardIter 
williamr@4
    61
__uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result,
williamr@4
    62
                     const __false_type&)
williamr@4
    63
{
williamr@4
    64
  _STLP_LEAVE_VOLATILE _ForwardIter __cur = __result;
williamr@4
    65
  _STLP_TRY  {
williamr@4
    66
    for ( ; __first != __last; ++__first, ++__cur)
williamr@4
    67
      _Construct(&*__cur, *__first);
williamr@4
    68
    //    return __cur;
williamr@4
    69
  }
williamr@4
    70
  _STLP_UNWIND (_STLP_STD::_Destroy(__result, __cur)); 
williamr@4
    71
  return __cur;
williamr@4
    72
}
williamr@4
    73
williamr@4
    74
template <class _InputIter, class _ForwardIter>
williamr@4
    75
inline _ForwardIter
williamr@4
    76
uninitialized_copy(_InputIter __first, _InputIter __last, _ForwardIter __result) {
williamr@4
    77
  return __uninitialized_copy(__first, __last, __result,  _IS_POD_ITER(__result, _ForwardIter));
williamr@4
    78
}
williamr@4
    79
williamr@4
    80
inline char* 
williamr@4
    81
uninitialized_copy(const char* __first, const char* __last, char* __result) {
williamr@4
    82
  return  (char*)__copy_trivial (__first, __last, __result);
williamr@4
    83
}
williamr@4
    84
williamr@4
    85
#  ifdef _STLP_HAS_WCHAR_T // dwa 8/15/97
williamr@4
    86
inline wchar_t* 
williamr@4
    87
uninitialized_copy(const wchar_t* __first, const wchar_t* __last, wchar_t* __result) {
williamr@4
    88
  return  (wchar_t*)__copy_trivial (__first, __last, __result);
williamr@4
    89
}
williamr@4
    90
#  endif /* _STLP_HAS_WCHAR_T */
williamr@4
    91
williamr@4
    92
# ifndef _STLP_NO_EXTENSIONS
williamr@4
    93
// uninitialized_copy_n (not part of the C++ standard)
williamr@4
    94
williamr@4
    95
template <class _InputIter, class _Size, class _ForwardIter>
williamr@4
    96
// _STLP_INLINE_LOOP 
williamr@4
    97
pair<_InputIter, _ForwardIter>
williamr@4
    98
__uninitialized_copy_n(_InputIter __first, _Size __count,
williamr@4
    99
                       _ForwardIter __result,
williamr@4
   100
                       const input_iterator_tag &)
williamr@4
   101
{
williamr@4
   102
  _STLP_LEAVE_VOLATILE  _ForwardIter __cur = __result;
williamr@4
   103
  _STLP_TRY {
williamr@4
   104
    for ( ; __count > 0 ; --__count, ++__first, ++__cur) 
williamr@4
   105
      _Construct(&*__cur, *__first);
williamr@4
   106
    //    return pair<_InputIter, _ForwardIter>(__first, __cur);
williamr@4
   107
  }
williamr@4
   108
  _STLP_UNWIND(_STLP_STD::_Destroy(__result, __cur));
williamr@4
   109
williamr@4
   110
  return pair<_InputIter, _ForwardIter>(__first, __cur);
williamr@4
   111
williamr@4
   112
}
williamr@4
   113
williamr@4
   114
# if defined(_STLP_NONTEMPL_BASE_MATCH_BUG) 
williamr@4
   115
template <class _InputIterator, class _Size, class _ForwardIterator>
williamr@4
   116
inline pair<_InputIterator, _ForwardIterator>
williamr@4
   117
__uninitialized_copy_n(_InputIterator __first, _Size __count,
williamr@4
   118
                       _ForwardIterator __result,
williamr@4
   119
                       const forward_iterator_tag &) {
williamr@4
   120
  return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
williamr@4
   121
}
williamr@4
   122
williamr@4
   123
template <class _InputIterator, class _Size, class _ForwardIterator>
williamr@4
   124
inline pair<_InputIterator, _ForwardIterator>
williamr@4
   125
__uninitialized_copy_n(_InputIterator __first, _Size __count,
williamr@4
   126
                       _ForwardIterator __result,
williamr@4
   127
                       const bidirectional_iterator_tag &) {
williamr@4
   128
  return __uninitialized_copy_n(__first, __count, __result, input_iterator_tag());
williamr@4
   129
}
williamr@4
   130
# endif
williamr@4
   131
williamr@4
   132
williamr@4
   133
template <class _RandomAccessIter, class _Size, class _ForwardIter>
williamr@4
   134
inline pair<_RandomAccessIter, _ForwardIter>
williamr@4
   135
__uninitialized_copy_n(_RandomAccessIter __first, _Size __count, _ForwardIter __result, const random_access_iterator_tag &) {
williamr@4
   136
  _RandomAccessIter __last = __first + __count;
williamr@4
   137
  return pair<_RandomAccessIter, _ForwardIter>( __last, __uninitialized_copy(__first, __last, __result, 
williamr@4
   138
                                                                             _IS_POD_ITER(__result, _ForwardIter)));
williamr@4
   139
}
williamr@4
   140
williamr@4
   141
// this is used internally in <rope> , which is extension itself.
williamr@4
   142
template <class _InputIter, class _Size, class _ForwardIter>
williamr@4
   143
inline pair<_InputIter, _ForwardIter>
williamr@4
   144
uninitialized_copy_n(_InputIter __first, _Size __count,
williamr@4
   145
                     _ForwardIter __result) {
williamr@4
   146
  return __uninitialized_copy_n(__first, __count, __result, _STLP_ITERATOR_CATEGORY(__first, _InputIter));
williamr@4
   147
}
williamr@4
   148
# endif /* _STLP_NO_EXTENSIONS */
williamr@4
   149
williamr@4
   150
// Valid if copy construction is equivalent to assignment, and if the
williamr@4
   151
// destructor is trivial.
williamr@4
   152
template <class _ForwardIter, class _Tp>
williamr@4
   153
inline void
williamr@4
   154
__uninitialized_fill(_ForwardIter __first, _ForwardIter __last, 
williamr@4
   155
                     const _Tp& __x, const __true_type&) {
williamr@4
   156
  _STLP_STD::fill(__first, __last, __x);
williamr@4
   157
}
williamr@4
   158
williamr@4
   159
template <class _ForwardIter, class _Tp>
williamr@4
   160
// _STLP_INLINE_LOOP 
williamr@4
   161
void
williamr@4
   162
__uninitialized_fill(_ForwardIter __first, _ForwardIter __last, 
williamr@4
   163
                     const _Tp& __x, const __false_type&)
williamr@4
   164
{
williamr@4
   165
  _STLP_LEAVE_VOLATILE  _ForwardIter __cur = __first;
williamr@4
   166
  _STLP_TRY {
williamr@4
   167
    for ( ; __cur != __last; ++__cur)
williamr@4
   168
      _Construct(&*__cur, __x);
williamr@4
   169
  }
williamr@4
   170
  _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
williamr@4
   171
}
williamr@4
   172
williamr@4
   173
template <class _ForwardIter, class _Tp>
williamr@4
   174
inline void uninitialized_fill(_ForwardIter __first, _ForwardIter __last,  const _Tp& __x) {
williamr@4
   175
  __uninitialized_fill(__first, __last, __x, _IS_POD_ITER(__first, _ForwardIter));
williamr@4
   176
}
williamr@4
   177
williamr@4
   178
// Valid if copy construction is equivalent to assignment, and if the
williamr@4
   179
//  destructor is trivial.
williamr@4
   180
template <class _ForwardIter, class _Size, class _Tp>
williamr@4
   181
inline _ForwardIter
williamr@4
   182
__uninitialized_fill_n(_ForwardIter __first, _Size __n,
williamr@4
   183
                       const _Tp& __x, const __true_type&) {
williamr@4
   184
  return _STLP_STD::fill_n(__first, __n, __x);
williamr@4
   185
}
williamr@4
   186
williamr@4
   187
template <class _ForwardIter, class _Size, class _Tp>
williamr@4
   188
//_STLP_INLINE_LOOP 
williamr@4
   189
_ForwardIter
williamr@4
   190
__uninitialized_fill_n(_ForwardIter __first, _Size __n,
williamr@4
   191
                       const _Tp& __x, const __false_type&)
williamr@4
   192
{
williamr@4
   193
  _STLP_LEAVE_VOLATILE  _ForwardIter __cur = __first;
williamr@4
   194
  _STLP_TRY {
williamr@4
   195
    for ( ; __n > 0; --__n, ++__cur)
williamr@4
   196
      _Construct(&*__cur, __x);
williamr@4
   197
    //    return __cur;
williamr@4
   198
  }
williamr@4
   199
  _STLP_UNWIND(_STLP_STD::_Destroy(__first, __cur));
williamr@4
   200
  // # ifdef _STLP_THROW_RETURN_BUG
williamr@4
   201
  return __cur;
williamr@4
   202
  //# endif
williamr@4
   203
}
williamr@4
   204
williamr@4
   205
template <class _ForwardIter, class _Size, class _Tp>
williamr@4
   206
inline _ForwardIter 
williamr@4
   207
uninitialized_fill_n(_ForwardIter __first, _Size __n, const _Tp& __x) {
williamr@4
   208
  return __uninitialized_fill_n(__first, __n, __x, _IS_POD_ITER(__first, _ForwardIter));
williamr@4
   209
}
williamr@4
   210
williamr@4
   211
// Extensions: __uninitialized_copy_copy, __uninitialized_copy_fill, 
williamr@4
   212
// __uninitialized_fill_copy.
williamr@4
   213
williamr@4
   214
// __uninitialized_copy_copy
williamr@4
   215
// Copies [first1, last1) into [result, result + (last1 - first1)), and
williamr@4
   216
//  copies [first2, last2) into
williamr@4
   217
//  [result, result + (last1 - first1) + (last2 - first2)).
williamr@4
   218
williamr@4
   219
template <class _InputIter1, class _InputIter2, class _ForwardIter>
williamr@4
   220
inline _ForwardIter
williamr@4
   221
__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   222
                          _InputIter2 __first2, _InputIter2 __last2,
williamr@4
   223
                          _ForwardIter __result, __true_type)
williamr@4
   224
{
williamr@4
   225
  return __uninitialized_copy(__first2, __last2, 
williamr@4
   226
                              __uninitialized_copy(__first1, __last1, __result, __true_type()), __true_type());
williamr@4
   227
}
williamr@4
   228
williamr@4
   229
template <class _InputIter1, class _InputIter2, class _ForwardIter>
williamr@4
   230
// inline 
williamr@4
   231
_ForwardIter
williamr@4
   232
__uninitialized_copy_copy(_InputIter1 __first1, _InputIter1 __last1,
williamr@4
   233
                          _InputIter2 __first2, _InputIter2 __last2,
williamr@4
   234
                          _ForwardIter __result, __false_type)
williamr@4
   235
{
williamr@4
   236
   _STLP_LEAVE_VOLATILE _ForwardIter __mid = __uninitialized_copy(__first1, __last1, __result, _IS_POD_ITER(__result, _ForwardIter));
williamr@4
   237
williamr@4
   238
  _STLP_TRY {
williamr@4
   239
    return __uninitialized_copy(__first2, __last2, __mid , _IS_POD_ITER(__result, _ForwardIter));
williamr@4
   240
  }
williamr@4
   241
  _STLP_UNWIND (_STLP_STD::_Destroy(__result, __mid));
williamr@4
   242
# ifdef _STLP_THROW_RETURN_BUG
williamr@4
   243
  return __mid;
williamr@4
   244
# endif
williamr@4
   245
}
williamr@4
   246
williamr@4
   247
// __uninitialized_fill_copy
williamr@4
   248
// Fills [result, mid) with x, and copies [first, last) into
williamr@4
   249
//  [mid, mid + (last - first)).
williamr@4
   250
template <class _ForwardIter, class _Tp, class _InputIter>
williamr@4
   251
// inline 
williamr@4
   252
_ForwardIter 
williamr@4
   253
__uninitialized_fill_copy(_ForwardIter __result, _ForwardIter __mid, const _Tp& __x,
williamr@4
   254
                          _InputIter __first, _InputIter __last)
williamr@4
   255
{
williamr@4
   256
  typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
williamr@4
   257
  __uninitialized_fill(__result, __mid, __x, _I_POD());
williamr@4
   258
  _STLP_TRY {
williamr@4
   259
    return __uninitialized_copy(__first, __last, __mid, _I_POD());
williamr@4
   260
  }
williamr@4
   261
  _STLP_UNWIND (_STLP_STD::_Destroy(__result, __mid));
williamr@4
   262
# ifdef _STLP_THROW_RETURN_BUG
williamr@4
   263
  return __result;
williamr@4
   264
# endif
williamr@4
   265
}
williamr@4
   266
williamr@4
   267
// __uninitialized_copy_fill
williamr@4
   268
// Copies [first1, last1) into [first2, first2 + (last1 - first1)), and
williamr@4
   269
//  fills [first2 + (last1 - first1), last2) with x.
williamr@4
   270
template <class _InputIter, class _ForwardIter, class _Tp>
williamr@4
   271
// inline 
williamr@4
   272
void
williamr@4
   273
__uninitialized_copy_fill(_InputIter __first1, _InputIter __last1,
williamr@4
   274
                          _ForwardIter __first2, _ForwardIter __last2,
williamr@4
   275
                          const _Tp& __x)
williamr@4
   276
{
williamr@4
   277
  typedef typename __type_traits<_Tp>::is_POD_type _I_POD;
williamr@4
   278
  _ForwardIter __mid2 = __uninitialized_copy(__first1, __last1, __first2, _I_POD());
williamr@4
   279
  _STLP_TRY {
williamr@4
   280
    __uninitialized_fill(__mid2, __last2, __x, _I_POD());
williamr@4
   281
  }
williamr@4
   282
  _STLP_UNWIND(_STLP_STD::_Destroy(__first2, __mid2));
williamr@4
   283
}
williamr@4
   284
williamr@4
   285
_STLP_END_NAMESPACE
williamr@4
   286
williamr@4
   287
#endif /* _STLP_INTERNAL_UNINITIALIZED_H */
williamr@4
   288
williamr@4
   289
// Local Variables:
williamr@4
   290
// mode:C++
williamr@4
   291
// End: