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