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