epoc32/include/tools/stlport/stl/_valarray.c
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
 *
williamr@4
     4
 * Copyright (c) 1994
williamr@4
     5
 * Hewlett-Packard Company
williamr@4
     6
 *
williamr@4
     7
 * Copyright (c) 1996,1997
williamr@4
     8
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     9
 *
williamr@4
    10
 * Copyright (c) 1997
williamr@4
    11
 * Moscow Center for SPARC Technology
williamr@4
    12
 *
williamr@4
    13
 * Copyright (c) 1999
williamr@4
    14
 * Boris Fomitchev
williamr@4
    15
 *
williamr@4
    16
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
    17
 * or implied. Any use is at your own risk.
williamr@4
    18
 *
williamr@4
    19
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    20
 * without fee, provided the above notices are retained on all copies.
williamr@4
    21
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    22
 * provided the above notices are retained, and a notice that the code was
williamr@4
    23
 * modified is included with the above copyright notice.
williamr@4
    24
 *
williamr@4
    25
 */
williamr@4
    26
#ifndef _STLP_VALARRAY_C
williamr@4
    27
#define _STLP_VALARRAY_C
williamr@4
    28
williamr@4
    29
#ifndef _STLP_VALARRAY_H
williamr@4
    30
# include <stl/_valarray.h>
williamr@4
    31
#endif
williamr@4
    32
williamr@4
    33
_STLP_BEGIN_NAMESPACE
williamr@4
    34
williamr@4
    35
template <class _Tp>
williamr@4
    36
_Valarray_bool valarray<_Tp>:: operator!() const {
williamr@4
    37
  _Valarray_bool __tmp(this->size(), _Valarray_bool::_NoInit());
williamr@4
    38
  for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
    39
    __tmp[__i] = !(*this)[__i];
williamr@4
    40
  return __tmp;
williamr@4
    41
}
williamr@4
    42
williamr@4
    43
// Behavior is undefined if __x and *this have different sizes
williamr@4
    44
template <class _Tp>
williamr@4
    45
valarray<_Tp>& valarray<_Tp>::operator=(const slice_array<_Tp>& __x)
williamr@4
    46
{
williamr@4
    47
  size_t __index = __x._M_slice.start();
williamr@4
    48
  for (size_t __i = 0;
williamr@4
    49
       __i < __x._M_slice.size();
williamr@4
    50
       ++__i, __index += __x._M_slice.stride())
williamr@4
    51
    (*this)[__i] = __x._M_array[__index];
williamr@4
    52
  return *this;
williamr@4
    53
}
williamr@4
    54
williamr@4
    55
template <class _Tp>
williamr@4
    56
valarray<_Tp> valarray<_Tp>::operator[](slice __slice) const {
williamr@4
    57
  valarray<_Tp> __tmp(__slice.size(), _NoInit());
williamr@4
    58
  size_t __index = __slice.start();
williamr@4
    59
  for (size_t __i = 0;
williamr@4
    60
       __i < __slice.size();
williamr@4
    61
       ++__i, __index += __slice.stride())
williamr@4
    62
    __tmp[__i] = (*this)[__index];
williamr@4
    63
  return __tmp;
williamr@4
    64
}
williamr@4
    65
williamr@4
    66
template <class _Size>
williamr@4
    67
bool _Gslice_Iter_tmpl<_Size>::_M_incr() {
williamr@4
    68
  size_t __dim = _M_indices.size() - 1;
williamr@4
    69
  ++_M_step;
williamr@4
    70
  for (;;) {
williamr@4
    71
    _M_1d_idx += _M_gslice._M_strides[__dim];
williamr@4
    72
    if (++_M_indices[__dim] != _M_gslice._M_lengths[__dim])
williamr@4
    73
      return true;
williamr@4
    74
    else if (__dim != 0) {
williamr@4
    75
      _M_1d_idx -= _M_gslice._M_strides[__dim] * _M_gslice._M_lengths[__dim];
williamr@4
    76
      _M_indices[__dim] = 0;
williamr@4
    77
      --__dim;
williamr@4
    78
    }
williamr@4
    79
    else
williamr@4
    80
      return false;
williamr@4
    81
  }
williamr@4
    82
}
williamr@4
    83
williamr@4
    84
// Behavior is undefined if __x and *this have different sizes, or if
williamr@4
    85
// __x was constructed from a degenerate gslice.
williamr@4
    86
template <class _Tp>
williamr@4
    87
valarray<_Tp>& valarray<_Tp>::operator=(const gslice_array<_Tp>& __x)
williamr@4
    88
{
williamr@4
    89
  if (this->size() != 0) {
williamr@4
    90
    _Gslice_Iter __i(__x._M_gslice);
williamr@4
    91
    do
williamr@4
    92
      (*this)[__i._M_step] = __x._M_array[__i._M_1d_idx];
williamr@4
    93
    while(__i._M_incr());
williamr@4
    94
  }
williamr@4
    95
  return *this;
williamr@4
    96
}
williamr@4
    97
williamr@4
    98
template <class _Tp>
williamr@4
    99
valarray<_Tp> valarray<_Tp>::operator[](const gslice& __slice) const
williamr@4
   100
{
williamr@4
   101
  valarray<_Tp> __tmp(__slice._M_size(), _NoInit());
williamr@4
   102
  if (__tmp.size() != 0) {
williamr@4
   103
    _Gslice_Iter __i(__slice);
williamr@4
   104
    do __tmp[__i._M_step] = (*this)[__i._M_1d_idx]; while(__i._M_incr());
williamr@4
   105
  }
williamr@4
   106
  return __tmp;
williamr@4
   107
}
williamr@4
   108
williamr@4
   109
template <class _Tp>
williamr@4
   110
valarray<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask) const
williamr@4
   111
{
williamr@4
   112
  size_t _p_size = 0;
williamr@4
   113
  {
williamr@4
   114
    for (size_t __i = 0; __i < __mask.size(); ++__i)
williamr@4
   115
      if (__mask[__i]) ++_p_size;
williamr@4
   116
  }
williamr@4
   117
williamr@4
   118
  valarray<_Tp> __tmp(_p_size, _NoInit());
williamr@4
   119
  size_t __idx = 0;
williamr@4
   120
  {
williamr@4
   121
    for (size_t __i = 0; __i < __mask.size(); ++__i)
williamr@4
   122
      if (__mask[__i]) __tmp[__idx++] = (*this)[__i];
williamr@4
   123
  }
williamr@4
   124
williamr@4
   125
  return __tmp;
williamr@4
   126
}
williamr@4
   127
williamr@4
   128
template <class _Tp>
williamr@4
   129
valarray<_Tp>& valarray<_Tp>::operator=(const indirect_array<_Tp>& __x) {
williamr@4
   130
  for (size_t __i = 0; __i < __x._M_addr.size(); ++__i)
williamr@4
   131
    (*this)[__i] = __x._M_array[__x._M_addr[__i]];
williamr@4
   132
  return *this;
williamr@4
   133
}
williamr@4
   134
williamr@4
   135
template <class _Tp>
williamr@4
   136
valarray<_Tp>
williamr@4
   137
valarray<_Tp>::operator[](const _Valarray_size_t& __addr) const
williamr@4
   138
{
williamr@4
   139
  valarray<_Tp> __tmp(__addr.size(), _NoInit());
williamr@4
   140
  for (size_t __i = 0; __i < __addr.size(); ++__i)
williamr@4
   141
    __tmp[__i] = (*this)[__addr[__i]];
williamr@4
   142
  return __tmp;
williamr@4
   143
}
williamr@4
   144
williamr@4
   145
//----------------------------------------------------------------------
williamr@4
   146
// Other valarray noninline member functions
williamr@4
   147
williamr@4
   148
// Shift and cshift
williamr@4
   149
williamr@4
   150
template <class _Tp>
williamr@4
   151
valarray<_Tp> valarray<_Tp>::shift(int __n) const
williamr@4
   152
{
williamr@4
   153
  valarray<_Tp> __tmp(this->size());
williamr@4
   154
williamr@4
   155
  if (__n >= 0) {
williamr@4
   156
    if (__n < this->size())
williamr@4
   157
      copy(this->_M_first + __n, this->_M_first + this->size(),
williamr@4
   158
           __tmp._M_first);
williamr@4
   159
  }
williamr@4
   160
  else {
williamr@4
   161
    if (-__n < this->size())
williamr@4
   162
      copy(this->_M_first, this->_M_first + this->size() + __n,
williamr@4
   163
           __tmp._M_first - __n);
williamr@4
   164
  }
williamr@4
   165
  return __tmp;
williamr@4
   166
}
williamr@4
   167
williamr@4
   168
template <class _Tp>
williamr@4
   169
valarray<_Tp> valarray<_Tp>::cshift(int __m) const
williamr@4
   170
{
williamr@4
   171
  valarray<_Tp> __tmp(this->size());
williamr@4
   172
williamr@4
   173
  // Reduce __m to an equivalent number in the range [0, size()).  We
williamr@4
   174
  // have to be careful with negative numbers, since the sign of a % b
williamr@4
   175
  // is unspecified when a < 0.
williamr@4
   176
  long __n = __m;
williamr@4
   177
  if (this->size() < (numeric_limits<long>::max)())
williamr@4
   178
    __n %= long(this->size());
williamr@4
   179
  if (__n < 0)
williamr@4
   180
    __n += this->size();
williamr@4
   181
williamr@4
   182
  copy(this->_M_first,       this->_M_first + __n,
williamr@4
   183
       __tmp._M_first + (this->size() - __n));
williamr@4
   184
  copy(this->_M_first + __n, this->_M_first + this->size(),
williamr@4
   185
       __tmp._M_first);
williamr@4
   186
williamr@4
   187
  return __tmp;
williamr@4
   188
}
williamr@4
   189
williamr@4
   190
_STLP_END_NAMESPACE
williamr@4
   191
williamr@4
   192
#endif /*  _STLP_VALARRAY_C */
williamr@4
   193
williamr@4
   194
// Local Variables:
williamr@4
   195
// mode:C++
williamr@4
   196
// End: