epoc32/include/tools/stlport/stl/_valarray.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
 * Copyright (c) 1999
williamr@4
     3
 * Silicon Graphics Computer Systems, Inc.
williamr@4
     4
 *
williamr@4
     5
 * Copyright (c) 1999
williamr@4
     6
 * Boris Fomitchev
williamr@4
     7
 *
williamr@4
     8
 * This material is provided "as is", with absolutely no warranty expressed
williamr@4
     9
 * or implied. Any use is at your own risk.
williamr@4
    10
 *
williamr@4
    11
 * Permission to use or copy this software for any purpose is hereby granted
williamr@4
    12
 * without fee, provided the above notices are retained on all copies.
williamr@4
    13
 * Permission to modify the code and to distribute modified code is granted,
williamr@4
    14
 * provided the above notices are retained, and a notice that the code was
williamr@4
    15
 * modified is included with the above copyright notice.
williamr@4
    16
 *
williamr@4
    17
 */
williamr@4
    18
williamr@4
    19
#ifndef _STLP_VALARRAY_H
williamr@4
    20
#define _STLP_VALARRAY_H
williamr@4
    21
williamr@4
    22
#ifndef _STLP_INTERNAL_CMATH
williamr@4
    23
#  include <stl/_cmath.h>
williamr@4
    24
#endif
williamr@4
    25
williamr@4
    26
#ifndef _STLP_INTERNAL_NEW
williamr@4
    27
#  include <stl/_new.h>
williamr@4
    28
#endif
williamr@4
    29
williamr@4
    30
#ifndef _STLP_INTERNAL_ALGO_H
williamr@4
    31
#  include <stl/_algo.h>
williamr@4
    32
#endif
williamr@4
    33
williamr@4
    34
#ifndef _STLP_INTERNAL_NUMERIC_H
williamr@4
    35
#  include <stl/_numeric.h>
williamr@4
    36
#endif
williamr@4
    37
williamr@4
    38
#ifndef _STLP_INTERNAL_LIMITS
williamr@4
    39
#  include <stl/_limits.h>
williamr@4
    40
#endif
williamr@4
    41
williamr@4
    42
/* As we only need the _STLP_ASSERT macro from _debug.h we test it to include _debug.h */
williamr@4
    43
#ifndef _STLP_ASSERT
williamr@4
    44
#  include <stl/debug/_debug.h>
williamr@4
    45
#endif
williamr@4
    46
williamr@4
    47
_STLP_BEGIN_NAMESPACE
williamr@4
    48
williamr@4
    49
class slice;
williamr@4
    50
class gslice;
williamr@4
    51
williamr@4
    52
template <class _Tp> class valarray;
williamr@4
    53
typedef valarray<bool>    _Valarray_bool;
williamr@4
    54
typedef valarray<size_t>  _Valarray_size_t;
williamr@4
    55
williamr@4
    56
template <class _Tp> class slice_array;
williamr@4
    57
template <class _Tp> class gslice_array;
williamr@4
    58
template <class _Tp> class mask_array;
williamr@4
    59
template <class _Tp> class indirect_array;
williamr@4
    60
williamr@4
    61
//----------------------------------------------------------------------
williamr@4
    62
// class valarray
williamr@4
    63
williamr@4
    64
// Base class to handle memory allocation and deallocation.  We can't just
williamr@4
    65
// use vector<>, because vector<bool> would be unsuitable as an internal
williamr@4
    66
// representation for valarray<bool>.
williamr@4
    67
williamr@4
    68
template <class _Tp>
williamr@4
    69
struct _Valarray_base
williamr@4
    70
{
williamr@4
    71
  _Tp*   _M_first;
williamr@4
    72
  size_t _M_size;
williamr@4
    73
williamr@4
    74
  _Valarray_base() : _M_first(0), _M_size(0) {}
williamr@4
    75
  _Valarray_base(size_t __n) : _M_first(0), _M_size(0) { _M_allocate(__n); }
williamr@4
    76
  ~_Valarray_base() { _M_deallocate(); }
williamr@4
    77
williamr@4
    78
  void _M_allocate(size_t __n) {
williamr@4
    79
    if (__n != 0) {
williamr@4
    80
      _M_first = __STATIC_CAST(_Tp*, (malloc(__n * sizeof(_Tp))));
williamr@4
    81
      _M_size  = __n;
williamr@4
    82
#if !defined(_STLP_NO_BAD_ALLOC) && defined(_STLP_USE_EXCEPTIONS)
williamr@4
    83
      if (_M_first == 0) {
williamr@4
    84
        _M_size = 0;
williamr@4
    85
        throw _STLP_STD::bad_alloc();
williamr@4
    86
      }
williamr@4
    87
#endif
williamr@4
    88
    }
williamr@4
    89
    else {
williamr@4
    90
      _M_first = 0;
williamr@4
    91
      _M_size = 0;
williamr@4
    92
    }
williamr@4
    93
  }
williamr@4
    94
williamr@4
    95
  void _M_deallocate() {
williamr@4
    96
    free(_M_first);
williamr@4
    97
    _M_first = 0;
williamr@4
    98
    _M_size = 0;
williamr@4
    99
  }
williamr@4
   100
};
williamr@4
   101
williamr@4
   102
template <class _Tp>
williamr@4
   103
class valarray : private _Valarray_base<_Tp>
williamr@4
   104
{
williamr@4
   105
  friend class gslice;
williamr@4
   106
williamr@4
   107
public:
williamr@4
   108
  typedef _Tp value_type;
williamr@4
   109
williamr@4
   110
  // Basic constructors
williamr@4
   111
  valarray() : _Valarray_base<_Tp>() {}
williamr@4
   112
  explicit valarray(size_t __n) : _Valarray_base<_Tp>(__n)
williamr@4
   113
    { uninitialized_fill_n(this->_M_first, this->_M_size, _STLP_DEFAULT_CONSTRUCTED(value_type)); }
williamr@4
   114
  valarray(const value_type& __x, size_t __n) : _Valarray_base<_Tp>(__n)
williamr@4
   115
    { uninitialized_fill_n(this->_M_first, this->_M_size, __x); }
williamr@4
   116
  valarray(const value_type* __p, size_t __n) : _Valarray_base<_Tp>(__n)
williamr@4
   117
    { uninitialized_copy(__p, __p + __n, this->_M_first); }
williamr@4
   118
  valarray(const valarray<_Tp>& __x) : _Valarray_base<_Tp>(__x._M_size) {
williamr@4
   119
    uninitialized_copy(__x._M_first, __x._M_first + __x._M_size,
williamr@4
   120
                       this->_M_first);
williamr@4
   121
  }
williamr@4
   122
williamr@4
   123
  // Constructors from auxiliary array types
williamr@4
   124
  valarray(const slice_array<_Tp>&);
williamr@4
   125
  valarray(const gslice_array<_Tp>&);
williamr@4
   126
  valarray(const mask_array<_Tp>&);
williamr@4
   127
  valarray(const indirect_array<_Tp>&);
williamr@4
   128
williamr@4
   129
  // Destructor
williamr@4
   130
  ~valarray() { _STLP_STD::_Destroy_Range(this->_M_first, this->_M_first + this->_M_size); }
williamr@4
   131
williamr@4
   132
  // Extension: constructor that doesn't initialize valarray elements to a
williamr@4
   133
  // specific value.  This is faster for types such as int and double.
williamr@4
   134
private:
williamr@4
   135
  void _M_initialize(const __true_type&) {}
williamr@4
   136
  void _M_initialize(const __false_type&)
williamr@4
   137
    { uninitialized_fill_n(this->_M_first, this->_M_size, _STLP_DEFAULT_CONSTRUCTED(_Tp)); }
williamr@4
   138
williamr@4
   139
public:
williamr@4
   140
  struct _NoInit {};
williamr@4
   141
  valarray(size_t __n, _NoInit) : _Valarray_base<_Tp>(__n) {
williamr@4
   142
    typedef typename __type_traits<_Tp>::has_trivial_default_constructor _Is_Trivial;
williamr@4
   143
    _M_initialize(_Is_Trivial());
williamr@4
   144
  }
williamr@4
   145
williamr@4
   146
public:                         // Assignment
williamr@4
   147
  // Basic assignment.  Note that 'x = y' is undefined if x.size() != y.size()
williamr@4
   148
  valarray<_Tp>& operator=(const valarray<_Tp>& __x) {
williamr@4
   149
    _STLP_ASSERT(__x.size() == this->size())
williamr@4
   150
    if (this != &__x)
williamr@4
   151
      copy(__x._M_first, __x._M_first + __x._M_size, this->_M_first);
williamr@4
   152
    return *this;
williamr@4
   153
  }
williamr@4
   154
williamr@4
   155
  // Scalar assignment
williamr@4
   156
  valarray<_Tp>& operator=(const value_type& __x) {
williamr@4
   157
    fill_n(this->_M_first, this->_M_size, __x);
williamr@4
   158
    return *this;
williamr@4
   159
  }
williamr@4
   160
williamr@4
   161
  // Assignment of auxiliary array types
williamr@4
   162
  valarray<_Tp>& operator=(const slice_array<_Tp>&);
williamr@4
   163
  valarray<_Tp>& operator=(const gslice_array<_Tp>&);
williamr@4
   164
  valarray<_Tp>& operator=(const mask_array<_Tp>&);
williamr@4
   165
  valarray<_Tp>& operator=(const indirect_array<_Tp>&);
williamr@4
   166
williamr@4
   167
public:                         // Element access
williamr@4
   168
  value_type  operator[](size_t __n) const { return this->_M_first[__n]; }
williamr@4
   169
  value_type& operator[](size_t __n)       { return this->_M_first[__n]; }
williamr@4
   170
  size_t size() const { return this->_M_size; }
williamr@4
   171
williamr@4
   172
public:                         // Subsetting operations with auxiliary type
williamr@4
   173
  valarray<_Tp>            operator[](slice) const;
williamr@4
   174
  slice_array<_Tp>    operator[](slice);
williamr@4
   175
  valarray<_Tp>            operator[](const gslice&) const;
williamr@4
   176
  gslice_array<_Tp>   operator[](const gslice&);
williamr@4
   177
  valarray<_Tp>            operator[](const _Valarray_bool&) const;
williamr@4
   178
  mask_array<_Tp>     operator[](const _Valarray_bool&);
williamr@4
   179
  valarray<_Tp>            operator[](const _Valarray_size_t&) const;
williamr@4
   180
  indirect_array<_Tp> operator[](const _Valarray_size_t&);
williamr@4
   181
williamr@4
   182
public:                         // Unary operators.
williamr@4
   183
  valarray<_Tp> operator+() const { return *this; }
williamr@4
   184
williamr@4
   185
  valarray<_Tp> operator-() const {
williamr@4
   186
    valarray<_Tp> __tmp(this->size(), _NoInit());
williamr@4
   187
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   188
      __tmp[__i] = -(*this)[__i];
williamr@4
   189
    return __tmp;
williamr@4
   190
  }
williamr@4
   191
williamr@4
   192
  valarray<_Tp> operator~() const {
williamr@4
   193
    valarray<_Tp> __tmp(this->size(), _NoInit());
williamr@4
   194
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   195
      __tmp[__i] = ~(*this)[__i];
williamr@4
   196
    return __tmp;
williamr@4
   197
  }
williamr@4
   198
williamr@4
   199
  _Valarray_bool operator!() const;
williamr@4
   200
williamr@4
   201
public:                         // Scalar computed assignment.
williamr@4
   202
  valarray<_Tp>& operator*= (const value_type& __x) {
williamr@4
   203
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   204
      (*this)[__i] *= __x;
williamr@4
   205
    return *this;
williamr@4
   206
  }
williamr@4
   207
williamr@4
   208
  valarray<_Tp>& operator/= (const value_type& __x) {
williamr@4
   209
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   210
      (*this)[__i] /= __x;
williamr@4
   211
    return *this;
williamr@4
   212
  }
williamr@4
   213
williamr@4
   214
  valarray<_Tp>& operator%= (const value_type& __x) {
williamr@4
   215
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   216
      (*this)[__i] %= __x;
williamr@4
   217
    return *this;
williamr@4
   218
  }
williamr@4
   219
williamr@4
   220
  valarray<_Tp>& operator+= (const value_type& __x) {
williamr@4
   221
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   222
      (*this)[__i] += __x;
williamr@4
   223
    return *this;
williamr@4
   224
  }
williamr@4
   225
williamr@4
   226
  valarray<_Tp>& operator-= (const value_type& __x) {
williamr@4
   227
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   228
      (*this)[__i] -= __x;
williamr@4
   229
    return *this;
williamr@4
   230
  }
williamr@4
   231
williamr@4
   232
  valarray<_Tp>& operator^= (const value_type& __x) {
williamr@4
   233
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   234
      (*this)[__i] ^= __x;
williamr@4
   235
    return *this;
williamr@4
   236
  }
williamr@4
   237
williamr@4
   238
  valarray<_Tp>& operator&= (const value_type& __x) {
williamr@4
   239
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   240
      (*this)[__i] &= __x;
williamr@4
   241
    return *this;
williamr@4
   242
  }
williamr@4
   243
williamr@4
   244
  valarray<_Tp>& operator|= (const value_type& __x) {
williamr@4
   245
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   246
      (*this)[__i] |= __x;
williamr@4
   247
    return *this;
williamr@4
   248
  }
williamr@4
   249
williamr@4
   250
  valarray<_Tp>& operator<<= (const value_type& __x) {
williamr@4
   251
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   252
      (*this)[__i] <<= __x;
williamr@4
   253
    return *this;
williamr@4
   254
  }
williamr@4
   255
williamr@4
   256
  valarray<_Tp>& operator>>= (const value_type& __x) {
williamr@4
   257
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   258
      (*this)[__i] >>= __x;
williamr@4
   259
    return *this;
williamr@4
   260
  }
williamr@4
   261
williamr@4
   262
public:                         // Array computed assignment.
williamr@4
   263
  valarray<_Tp>& operator*= (const valarray<_Tp>& __x) {
williamr@4
   264
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   265
      (*this)[__i] *= __x[__i];
williamr@4
   266
    return *this;
williamr@4
   267
  }
williamr@4
   268
williamr@4
   269
  valarray<_Tp>& operator/= (const valarray<_Tp>& __x) {
williamr@4
   270
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   271
      (*this)[__i] /= __x[__i];
williamr@4
   272
    return *this;
williamr@4
   273
  }
williamr@4
   274
williamr@4
   275
  valarray<_Tp>& operator%= (const valarray<_Tp>& __x) {
williamr@4
   276
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   277
      (*this)[__i] %= __x[__i];
williamr@4
   278
    return *this;
williamr@4
   279
  }
williamr@4
   280
williamr@4
   281
  valarray<_Tp>& operator+= (const valarray<_Tp>& __x) {
williamr@4
   282
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   283
      (*this)[__i] += __x[__i];
williamr@4
   284
    return *this;
williamr@4
   285
  }
williamr@4
   286
williamr@4
   287
  valarray<_Tp>& operator-= (const valarray<_Tp>& __x) {
williamr@4
   288
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   289
      (*this)[__i] -= __x[__i];
williamr@4
   290
    return *this;
williamr@4
   291
  }
williamr@4
   292
williamr@4
   293
  valarray<_Tp>& operator^= (const valarray<_Tp>& __x) {
williamr@4
   294
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   295
      (*this)[__i] ^= __x[__i];
williamr@4
   296
    return *this;
williamr@4
   297
  }
williamr@4
   298
williamr@4
   299
  valarray<_Tp>& operator&= (const valarray<_Tp>& __x) {
williamr@4
   300
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   301
      (*this)[__i] &= __x[__i];
williamr@4
   302
    return *this;
williamr@4
   303
  }
williamr@4
   304
williamr@4
   305
  valarray<_Tp>& operator|= (const valarray<_Tp>& __x) {
williamr@4
   306
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   307
      (*this)[__i] |= __x[__i];
williamr@4
   308
    return *this;
williamr@4
   309
  }
williamr@4
   310
williamr@4
   311
  valarray<_Tp>& operator<<= (const valarray<_Tp>& __x) {
williamr@4
   312
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   313
      (*this)[__i] <<= __x[__i];
williamr@4
   314
    return *this;
williamr@4
   315
  }
williamr@4
   316
williamr@4
   317
  valarray<_Tp>& operator>>= (const valarray<_Tp>& __x) {
williamr@4
   318
    for (size_t __i = 0; __i < this->size(); ++__i)
williamr@4
   319
      (*this)[__i] >>= __x[__i];
williamr@4
   320
    return *this;
williamr@4
   321
  }
williamr@4
   322
williamr@4
   323
public:                         // Other member functions.
williamr@4
   324
williamr@4
   325
  // The result is undefined for zero-length arrays
williamr@4
   326
  value_type sum() const {
williamr@4
   327
    return accumulate(this->_M_first + 1, this->_M_first + this->_M_size,
williamr@4
   328
                      (*this)[0]);
williamr@4
   329
  }
williamr@4
   330
williamr@4
   331
  // The result is undefined for zero-length arrays
williamr@4
   332
  value_type (min) () const {
williamr@4
   333
    return *min_element(this->_M_first + 0, this->_M_first + this->_M_size);
williamr@4
   334
  }
williamr@4
   335
williamr@4
   336
  value_type (max) () const {
williamr@4
   337
    return *max_element(this->_M_first + 0, this->_M_first + this->_M_size);
williamr@4
   338
  }
williamr@4
   339
williamr@4
   340
  valarray<_Tp> shift(int __n) const;
williamr@4
   341
  valarray<_Tp> cshift(int __n) const;
williamr@4
   342
williamr@4
   343
  valarray<_Tp> apply(value_type __f(value_type)) const {
williamr@4
   344
    valarray<_Tp> __tmp(this->size());
williamr@4
   345
    transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
williamr@4
   346
              __f);
williamr@4
   347
    return __tmp;
williamr@4
   348
  }
williamr@4
   349
  valarray<_Tp> apply(value_type __f(const value_type&)) const {
williamr@4
   350
    valarray<_Tp> __tmp(this->size());
williamr@4
   351
    transform(this->_M_first + 0, this->_M_first + this->_M_size, __tmp._M_first,
williamr@4
   352
              __f);
williamr@4
   353
    return __tmp;
williamr@4
   354
  }
williamr@4
   355
williamr@4
   356
  void resize(size_t __n, value_type __x = value_type()) {
williamr@4
   357
    _STLP_STD::_Destroy_Range(this->_M_first, this->_M_first + this->_M_size);
williamr@4
   358
    _Valarray_base<_Tp>::_M_deallocate();
williamr@4
   359
    _Valarray_base<_Tp>::_M_allocate(__n);
williamr@4
   360
    uninitialized_fill_n(this->_M_first, this->_M_size, __x);
williamr@4
   361
  }
williamr@4
   362
};
williamr@4
   363
williamr@4
   364
//----------------------------------------------------------------------
williamr@4
   365
// valarray non-member functions.
williamr@4
   366
williamr@4
   367
// Binary arithmetic operations between two arrays.  Behavior is
williamr@4
   368
// undefined if the two arrays do not have the same length.
williamr@4
   369
williamr@4
   370
template <class _Tp>
williamr@4
   371
inline valarray<_Tp>  _STLP_CALL operator*(const valarray<_Tp>& __x,
williamr@4
   372
                                           const valarray<_Tp>& __y) {
williamr@4
   373
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   374
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   375
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   376
    __tmp[__i] = __x[__i] * __y[__i];
williamr@4
   377
  return __tmp;
williamr@4
   378
}
williamr@4
   379
williamr@4
   380
template <class _Tp>
williamr@4
   381
inline valarray<_Tp>  _STLP_CALL operator/(const valarray<_Tp>& __x,
williamr@4
   382
                                           const valarray<_Tp>& __y) {
williamr@4
   383
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   384
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   385
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   386
    __tmp[__i] = __x[__i] / __y[__i];
williamr@4
   387
  return __tmp;
williamr@4
   388
}
williamr@4
   389
williamr@4
   390
template <class _Tp>
williamr@4
   391
inline valarray<_Tp>  _STLP_CALL operator%(const valarray<_Tp>& __x,
williamr@4
   392
                                           const valarray<_Tp>& __y) {
williamr@4
   393
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   394
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   395
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   396
    __tmp[__i] = __x[__i] % __y[__i];
williamr@4
   397
  return __tmp;
williamr@4
   398
}
williamr@4
   399
williamr@4
   400
template <class _Tp>
williamr@4
   401
inline valarray<_Tp>  _STLP_CALL operator+(const valarray<_Tp>& __x,
williamr@4
   402
                                           const valarray<_Tp>& __y) {
williamr@4
   403
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   404
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   405
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   406
    __tmp[__i] = __x[__i] + __y[__i];
williamr@4
   407
  return __tmp;
williamr@4
   408
}
williamr@4
   409
williamr@4
   410
template <class _Tp>
williamr@4
   411
inline valarray<_Tp>  _STLP_CALL operator-(const valarray<_Tp>& __x,
williamr@4
   412
                                           const valarray<_Tp>& __y) {
williamr@4
   413
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   414
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   415
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   416
    __tmp[__i] = __x[__i] - __y[__i];
williamr@4
   417
  return __tmp;
williamr@4
   418
}
williamr@4
   419
williamr@4
   420
template <class _Tp>
williamr@4
   421
inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x,
williamr@4
   422
                               const valarray<_Tp>& __y) {
williamr@4
   423
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   424
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   425
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   426
    __tmp[__i] = __x[__i] ^ __y[__i];
williamr@4
   427
  return __tmp;
williamr@4
   428
}
williamr@4
   429
williamr@4
   430
template <class _Tp>
williamr@4
   431
inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x,
williamr@4
   432
                               const valarray<_Tp>& __y) {
williamr@4
   433
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   434
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   435
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   436
    __tmp[__i] = __x[__i] & __y[__i];
williamr@4
   437
  return __tmp;
williamr@4
   438
}
williamr@4
   439
williamr@4
   440
template <class _Tp>
williamr@4
   441
inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x,
williamr@4
   442
                               const valarray<_Tp>& __y) {
williamr@4
   443
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   444
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   445
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   446
    __tmp[__i] = __x[__i] | __y[__i];
williamr@4
   447
  return __tmp;
williamr@4
   448
}
williamr@4
   449
williamr@4
   450
template <class _Tp>
williamr@4
   451
inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x,
williamr@4
   452
                               const valarray<_Tp>& __y) {
williamr@4
   453
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   454
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   455
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   456
    __tmp[__i] = __x[__i] << __y[__i];
williamr@4
   457
  return __tmp;
williamr@4
   458
}
williamr@4
   459
williamr@4
   460
template <class _Tp>
williamr@4
   461
inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x,
williamr@4
   462
                               const valarray<_Tp>& __y) {
williamr@4
   463
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   464
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   465
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   466
    __tmp[__i] = __x[__i] >> __y[__i];
williamr@4
   467
  return __tmp;
williamr@4
   468
}
williamr@4
   469
williamr@4
   470
// Binary arithmetic operations between an array and a scalar.
williamr@4
   471
williamr@4
   472
template <class _Tp>
williamr@4
   473
inline valarray<_Tp> _STLP_CALL operator*(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   474
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   475
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   476
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   477
    __tmp[__i] = __x[__i]  * __c;
williamr@4
   478
  return __tmp;
williamr@4
   479
}
williamr@4
   480
williamr@4
   481
template <class _Tp>
williamr@4
   482
inline valarray<_Tp> _STLP_CALL operator*(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   483
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   484
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   485
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   486
    __tmp[__i] = __c * __x[__i];
williamr@4
   487
  return __tmp;
williamr@4
   488
}
williamr@4
   489
williamr@4
   490
template <class _Tp>
williamr@4
   491
inline valarray<_Tp> _STLP_CALL operator/(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   492
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   493
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   494
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   495
    __tmp[__i] = __x[__i]  / __c;
williamr@4
   496
  return __tmp;
williamr@4
   497
}
williamr@4
   498
williamr@4
   499
template <class _Tp>
williamr@4
   500
inline valarray<_Tp> _STLP_CALL operator/(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   501
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   502
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   503
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   504
    __tmp[__i] = __c / __x[__i];
williamr@4
   505
  return __tmp;
williamr@4
   506
}
williamr@4
   507
williamr@4
   508
template <class _Tp>
williamr@4
   509
inline valarray<_Tp> _STLP_CALL operator%(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   510
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   511
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   512
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   513
    __tmp[__i] = __x[__i]  % __c;
williamr@4
   514
  return __tmp;
williamr@4
   515
}
williamr@4
   516
williamr@4
   517
template <class _Tp>
williamr@4
   518
inline valarray<_Tp> _STLP_CALL operator%(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   519
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   520
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   521
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   522
    __tmp[__i] = __c % __x[__i];
williamr@4
   523
  return __tmp;
williamr@4
   524
}
williamr@4
   525
williamr@4
   526
template <class _Tp>
williamr@4
   527
inline valarray<_Tp> _STLP_CALL operator+(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   528
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   529
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   530
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   531
    __tmp[__i] = __x[__i]  + __c;
williamr@4
   532
  return __tmp;
williamr@4
   533
}
williamr@4
   534
williamr@4
   535
template <class _Tp>
williamr@4
   536
inline valarray<_Tp> _STLP_CALL operator+(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   537
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   538
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   539
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   540
    __tmp[__i] = __c + __x[__i];
williamr@4
   541
  return __tmp;
williamr@4
   542
}
williamr@4
   543
williamr@4
   544
template <class _Tp>
williamr@4
   545
inline valarray<_Tp> _STLP_CALL operator-(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   546
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   547
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   548
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   549
    __tmp[__i] = __x[__i]  - __c;
williamr@4
   550
  return __tmp;
williamr@4
   551
}
williamr@4
   552
williamr@4
   553
template <class _Tp>
williamr@4
   554
inline valarray<_Tp> _STLP_CALL operator-(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   555
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   556
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   557
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   558
    __tmp[__i] = __c - __x[__i];
williamr@4
   559
  return __tmp;
williamr@4
   560
}
williamr@4
   561
williamr@4
   562
template <class _Tp>
williamr@4
   563
inline valarray<_Tp> _STLP_CALL operator^(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   564
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   565
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   566
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   567
    __tmp[__i] = __x[__i]  ^ __c;
williamr@4
   568
  return __tmp;
williamr@4
   569
}
williamr@4
   570
williamr@4
   571
template <class _Tp>
williamr@4
   572
inline valarray<_Tp> _STLP_CALL operator^(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   573
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   574
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   575
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   576
    __tmp[__i] = __c ^ __x[__i];
williamr@4
   577
  return __tmp;
williamr@4
   578
}
williamr@4
   579
williamr@4
   580
template <class _Tp>
williamr@4
   581
inline valarray<_Tp> _STLP_CALL operator&(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   582
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   583
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   584
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   585
    __tmp[__i] = __x[__i]  & __c;
williamr@4
   586
  return __tmp;
williamr@4
   587
}
williamr@4
   588
williamr@4
   589
template <class _Tp>
williamr@4
   590
inline valarray<_Tp> _STLP_CALL operator&(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   591
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   592
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   593
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   594
    __tmp[__i] = __c & __x[__i];
williamr@4
   595
  return __tmp;
williamr@4
   596
}
williamr@4
   597
williamr@4
   598
template <class _Tp>
williamr@4
   599
inline valarray<_Tp> _STLP_CALL operator|(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   600
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   601
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   602
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   603
    __tmp[__i] = __x[__i]  | __c;
williamr@4
   604
  return __tmp;
williamr@4
   605
}
williamr@4
   606
williamr@4
   607
template <class _Tp>
williamr@4
   608
inline valarray<_Tp> _STLP_CALL operator|(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   609
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   610
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   611
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   612
    __tmp[__i] = __c | __x[__i];
williamr@4
   613
  return __tmp;
williamr@4
   614
}
williamr@4
   615
williamr@4
   616
template <class _Tp>
williamr@4
   617
inline valarray<_Tp> _STLP_CALL operator<<(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   618
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   619
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   620
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   621
    __tmp[__i] = __x[__i]  << __c;
williamr@4
   622
  return __tmp;
williamr@4
   623
}
williamr@4
   624
williamr@4
   625
template <class _Tp>
williamr@4
   626
inline valarray<_Tp> _STLP_CALL operator<<(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   627
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   628
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   629
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   630
    __tmp[__i] = __c << __x[__i];
williamr@4
   631
  return __tmp;
williamr@4
   632
}
williamr@4
   633
williamr@4
   634
template <class _Tp>
williamr@4
   635
inline valarray<_Tp> _STLP_CALL operator>>(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   636
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   637
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   638
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   639
    __tmp[__i] = __x[__i]  >> __c;
williamr@4
   640
  return __tmp;
williamr@4
   641
}
williamr@4
   642
williamr@4
   643
template <class _Tp>
williamr@4
   644
inline valarray<_Tp> _STLP_CALL operator>>(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   645
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   646
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   647
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   648
    __tmp[__i] = __c >> __x[__i];
williamr@4
   649
  return __tmp;
williamr@4
   650
}
williamr@4
   651
williamr@4
   652
// Binary logical operations between two arrays.  Behavior is undefined
williamr@4
   653
// if the two arrays have different lengths.  Note that operator== does
williamr@4
   654
// not do what you might at first expect.
williamr@4
   655
williamr@4
   656
template <class _Tp>
williamr@4
   657
inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x,
williamr@4
   658
                                 const valarray<_Tp>& __y)
williamr@4
   659
{
williamr@4
   660
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   661
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   662
    __tmp[__i] = __x[__i] == __y[__i];
williamr@4
   663
  return __tmp;
williamr@4
   664
}
williamr@4
   665
williamr@4
   666
template <class _Tp>
williamr@4
   667
inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x,
williamr@4
   668
                                const valarray<_Tp>& __y)
williamr@4
   669
{
williamr@4
   670
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   671
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   672
    __tmp[__i] = __x[__i] < __y[__i];
williamr@4
   673
  return __tmp;
williamr@4
   674
}
williamr@4
   675
williamr@4
   676
#ifdef _STLP_USE_SEPARATE_RELOPS_NAMESPACE
williamr@4
   677
williamr@4
   678
template <class _Tp>
williamr@4
   679
inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x,
williamr@4
   680
                                 const valarray<_Tp>& __y)
williamr@4
   681
{
williamr@4
   682
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   683
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   684
    __tmp[__i] = __x[__i] != __y[__i];
williamr@4
   685
  return __tmp;
williamr@4
   686
}
williamr@4
   687
williamr@4
   688
template <class _Tp>
williamr@4
   689
inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x,
williamr@4
   690
                                const valarray<_Tp>& __y)
williamr@4
   691
{
williamr@4
   692
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   693
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   694
    __tmp[__i] = __x[__i] > __y[__i];
williamr@4
   695
  return __tmp;
williamr@4
   696
}
williamr@4
   697
williamr@4
   698
template <class _Tp>
williamr@4
   699
inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x,
williamr@4
   700
                                 const valarray<_Tp>& __y)
williamr@4
   701
{
williamr@4
   702
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   703
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   704
    __tmp[__i] = __x[__i] <= __y[__i];
williamr@4
   705
  return __tmp;
williamr@4
   706
}
williamr@4
   707
williamr@4
   708
template <class _Tp>
williamr@4
   709
inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x,
williamr@4
   710
                                 const valarray<_Tp>& __y)
williamr@4
   711
{
williamr@4
   712
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   713
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   714
    __tmp[__i] = __x[__i] >= __y[__i];
williamr@4
   715
  return __tmp;
williamr@4
   716
}
williamr@4
   717
williamr@4
   718
#endif /* _STLP_USE_SEPARATE_RELOPS_NAMESPACE */
williamr@4
   719
// fbp : swap ?
williamr@4
   720
williamr@4
   721
template <class _Tp>
williamr@4
   722
inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x,
williamr@4
   723
                                 const valarray<_Tp>& __y)
williamr@4
   724
{
williamr@4
   725
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   726
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   727
    __tmp[__i] = __x[__i] && __y[__i];
williamr@4
   728
  return __tmp;
williamr@4
   729
}
williamr@4
   730
williamr@4
   731
template <class _Tp>
williamr@4
   732
inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x,
williamr@4
   733
                                 const valarray<_Tp>& __y)
williamr@4
   734
{
williamr@4
   735
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   736
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   737
    __tmp[__i] = __x[__i] || __y[__i];
williamr@4
   738
  return __tmp;
williamr@4
   739
}
williamr@4
   740
williamr@4
   741
// Logical operations between an array and a scalar.
williamr@4
   742
williamr@4
   743
template <class _Tp>
williamr@4
   744
inline _Valarray_bool _STLP_CALL operator==(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   745
{
williamr@4
   746
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   747
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   748
    __tmp[__i] = __x[__i] == __c;
williamr@4
   749
  return __tmp;
williamr@4
   750
}
williamr@4
   751
williamr@4
   752
template <class _Tp>
williamr@4
   753
inline _Valarray_bool _STLP_CALL operator==(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   754
{
williamr@4
   755
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   756
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   757
    __tmp[__i] = __c == __x[__i];
williamr@4
   758
  return __tmp;
williamr@4
   759
}
williamr@4
   760
williamr@4
   761
template <class _Tp>
williamr@4
   762
inline _Valarray_bool _STLP_CALL operator!=(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   763
{
williamr@4
   764
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   765
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   766
    __tmp[__i] = __x[__i] != __c;
williamr@4
   767
  return __tmp;
williamr@4
   768
}
williamr@4
   769
williamr@4
   770
template <class _Tp>
williamr@4
   771
inline _Valarray_bool _STLP_CALL operator!=(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   772
{
williamr@4
   773
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   774
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   775
    __tmp[__i] = __c != __x[__i];
williamr@4
   776
  return __tmp;
williamr@4
   777
}
williamr@4
   778
williamr@4
   779
template <class _Tp>
williamr@4
   780
inline _Valarray_bool _STLP_CALL operator<(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   781
{
williamr@4
   782
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   783
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   784
    __tmp[__i] = __x[__i] < __c;
williamr@4
   785
  return __tmp;
williamr@4
   786
}
williamr@4
   787
williamr@4
   788
template <class _Tp>
williamr@4
   789
inline _Valarray_bool _STLP_CALL operator<(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   790
{
williamr@4
   791
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   792
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   793
    __tmp[__i] = __c < __x[__i];
williamr@4
   794
  return __tmp;
williamr@4
   795
}
williamr@4
   796
williamr@4
   797
template <class _Tp>
williamr@4
   798
inline _Valarray_bool _STLP_CALL operator>(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   799
{
williamr@4
   800
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   801
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   802
    __tmp[__i] = __x[__i] > __c;
williamr@4
   803
  return __tmp;
williamr@4
   804
}
williamr@4
   805
williamr@4
   806
template <class _Tp>
williamr@4
   807
inline _Valarray_bool _STLP_CALL operator>(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   808
{
williamr@4
   809
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   810
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   811
    __tmp[__i] = __c > __x[__i];
williamr@4
   812
  return __tmp;
williamr@4
   813
}
williamr@4
   814
williamr@4
   815
template <class _Tp>
williamr@4
   816
inline _Valarray_bool _STLP_CALL operator<=(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   817
{
williamr@4
   818
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   819
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   820
    __tmp[__i] = __x[__i]  <= __c;
williamr@4
   821
  return __tmp;
williamr@4
   822
}
williamr@4
   823
williamr@4
   824
template <class _Tp>
williamr@4
   825
inline _Valarray_bool _STLP_CALL operator<=(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   826
{
williamr@4
   827
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   828
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   829
    __tmp[__i] = __c <= __x[__i];
williamr@4
   830
  return __tmp;
williamr@4
   831
}
williamr@4
   832
williamr@4
   833
template <class _Tp>
williamr@4
   834
inline _Valarray_bool _STLP_CALL operator>=(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   835
{
williamr@4
   836
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   837
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   838
    __tmp[__i] = __x[__i] >= __c;
williamr@4
   839
  return __tmp;
williamr@4
   840
}
williamr@4
   841
williamr@4
   842
template <class _Tp>
williamr@4
   843
inline _Valarray_bool _STLP_CALL operator>=(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   844
{
williamr@4
   845
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   846
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   847
    __tmp[__i] = __c >= __x[__i];
williamr@4
   848
  return __tmp;
williamr@4
   849
}
williamr@4
   850
williamr@4
   851
template <class _Tp>
williamr@4
   852
inline _Valarray_bool _STLP_CALL operator&&(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   853
{
williamr@4
   854
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   855
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   856
    __tmp[__i] = __x[__i] && __c;
williamr@4
   857
  return __tmp;
williamr@4
   858
}
williamr@4
   859
williamr@4
   860
template <class _Tp>
williamr@4
   861
inline _Valarray_bool _STLP_CALL operator&&(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   862
{
williamr@4
   863
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   864
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   865
    __tmp[__i] = __c && __x[__i];
williamr@4
   866
  return __tmp;
williamr@4
   867
}
williamr@4
   868
williamr@4
   869
template <class _Tp>
williamr@4
   870
inline _Valarray_bool _STLP_CALL operator||(const valarray<_Tp>& __x, const _Tp& __c)
williamr@4
   871
{
williamr@4
   872
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   873
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   874
    __tmp[__i] = __x[__i] || __c;
williamr@4
   875
  return __tmp;
williamr@4
   876
}
williamr@4
   877
williamr@4
   878
template <class _Tp>
williamr@4
   879
inline _Valarray_bool _STLP_CALL operator||(const _Tp& __c, const valarray<_Tp>& __x)
williamr@4
   880
{
williamr@4
   881
  _Valarray_bool __tmp(__x.size(), _Valarray_bool::_NoInit());
williamr@4
   882
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   883
    __tmp[__i] = __c || __x[__i];
williamr@4
   884
  return __tmp;
williamr@4
   885
}
williamr@4
   886
williamr@4
   887
// valarray "transcendentals" (the list includes abs and sqrt, which,
williamr@4
   888
// of course, are not transcendental).
williamr@4
   889
williamr@4
   890
template <class _Tp>
williamr@4
   891
inline valarray<_Tp> abs(const valarray<_Tp>& __x) {
williamr@4
   892
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   893
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   894
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   895
    __tmp[__i] = ::abs(__x[__i]);
williamr@4
   896
  return __tmp;
williamr@4
   897
}
williamr@4
   898
williamr@4
   899
template <class _Tp>
williamr@4
   900
inline valarray<_Tp> acos(const valarray<_Tp>& __x) {
williamr@4
   901
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   902
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   903
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   904
    __tmp[__i] = ::acos(__x[__i]);
williamr@4
   905
  return __tmp;
williamr@4
   906
}
williamr@4
   907
williamr@4
   908
template <class _Tp>
williamr@4
   909
inline valarray<_Tp> asin(const valarray<_Tp>& __x) {
williamr@4
   910
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   911
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   912
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   913
    __tmp[__i] = ::asin(__x[__i]);
williamr@4
   914
  return __tmp;
williamr@4
   915
}
williamr@4
   916
williamr@4
   917
template <class _Tp>
williamr@4
   918
inline valarray<_Tp> atan(const valarray<_Tp>& __x) {
williamr@4
   919
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   920
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   921
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   922
    __tmp[__i] = ::atan(__x[__i]);
williamr@4
   923
  return __tmp;
williamr@4
   924
}
williamr@4
   925
williamr@4
   926
template <class _Tp>
williamr@4
   927
inline valarray<_Tp> atan2(const valarray<_Tp>& __x,
williamr@4
   928
                           const valarray<_Tp>& __y) {
williamr@4
   929
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   930
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   931
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   932
    __tmp[__i] = ::atan2(__x[__i], __y[__i]);
williamr@4
   933
  return __tmp;
williamr@4
   934
}
williamr@4
   935
williamr@4
   936
template <class _Tp>
williamr@4
   937
inline valarray<_Tp> atan2(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
   938
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   939
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   940
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   941
    __tmp[__i] = ::atan2(__x[__i], __c);
williamr@4
   942
  return __tmp;
williamr@4
   943
}
williamr@4
   944
williamr@4
   945
template <class _Tp>
williamr@4
   946
inline valarray<_Tp> atan2(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
   947
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   948
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   949
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   950
    __tmp[__i] = ::atan2(__c, __x[__i]);
williamr@4
   951
  return __tmp;
williamr@4
   952
}
williamr@4
   953
williamr@4
   954
template <class _Tp>
williamr@4
   955
inline valarray<_Tp> cos(const valarray<_Tp>& __x) {
williamr@4
   956
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   957
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   958
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   959
    __tmp[__i] = ::cos(__x[__i]);
williamr@4
   960
  return __tmp;
williamr@4
   961
}
williamr@4
   962
williamr@4
   963
template <class _Tp>
williamr@4
   964
inline valarray<_Tp> cosh(const valarray<_Tp>& __x) {
williamr@4
   965
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   966
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   967
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   968
    __tmp[__i] = ::cosh(__x[__i]);
williamr@4
   969
  return __tmp;
williamr@4
   970
}
williamr@4
   971
williamr@4
   972
template <class _Tp>
williamr@4
   973
inline valarray<_Tp> exp(const valarray<_Tp>& __x) {
williamr@4
   974
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   975
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   976
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   977
    __tmp[__i] = ::exp(__x[__i]);
williamr@4
   978
  return __tmp;
williamr@4
   979
}
williamr@4
   980
williamr@4
   981
template <class _Tp>
williamr@4
   982
inline valarray<_Tp> log(const valarray<_Tp>& __x) {
williamr@4
   983
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   984
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   985
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   986
    __tmp[__i] = ::log(__x[__i]);
williamr@4
   987
  return __tmp;
williamr@4
   988
}
williamr@4
   989
williamr@4
   990
template <class _Tp>
williamr@4
   991
inline valarray<_Tp> log10(const valarray<_Tp>& __x) {
williamr@4
   992
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
   993
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
   994
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
   995
    __tmp[__i] = ::log10(__x[__i]);
williamr@4
   996
  return __tmp;
williamr@4
   997
}
williamr@4
   998
williamr@4
   999
template <class _Tp>
williamr@4
  1000
inline valarray<_Tp> pow(const valarray<_Tp>& __x,
williamr@4
  1001
                         const valarray<_Tp>& __y) {
williamr@4
  1002
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1003
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1004
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1005
    __tmp[__i] = ::pow(__x[__i], __y[__i]);
williamr@4
  1006
  return __tmp;
williamr@4
  1007
}
williamr@4
  1008
williamr@4
  1009
template <class _Tp>
williamr@4
  1010
inline valarray<_Tp> pow(const valarray<_Tp>& __x, const _Tp& __c) {
williamr@4
  1011
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1012
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1013
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1014
    __tmp[__i] = ::pow(__x[__i], __c);
williamr@4
  1015
  return __tmp;
williamr@4
  1016
}
williamr@4
  1017
williamr@4
  1018
template <class _Tp>
williamr@4
  1019
inline valarray<_Tp> pow(const _Tp& __c, const valarray<_Tp>& __x) {
williamr@4
  1020
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1021
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1022
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1023
    __tmp[__i] = ::pow(__c, __x[__i]);
williamr@4
  1024
  return __tmp;
williamr@4
  1025
}
williamr@4
  1026
williamr@4
  1027
template <class _Tp>
williamr@4
  1028
inline valarray<_Tp> sin(const valarray<_Tp>& __x) {
williamr@4
  1029
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1030
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1031
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1032
    __tmp[__i] = ::sin(__x[__i]);
williamr@4
  1033
  return __tmp;
williamr@4
  1034
}
williamr@4
  1035
williamr@4
  1036
template <class _Tp>
williamr@4
  1037
inline valarray<_Tp> sinh(const valarray<_Tp>& __x) {
williamr@4
  1038
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1039
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1040
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1041
    __tmp[__i] = ::sinh(__x[__i]);
williamr@4
  1042
  return __tmp;
williamr@4
  1043
}
williamr@4
  1044
williamr@4
  1045
template <class _Tp>
williamr@4
  1046
inline valarray<_Tp> sqrt(const valarray<_Tp>& __x) {
williamr@4
  1047
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1048
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1049
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1050
    __tmp[__i] = ::sqrt(__x[__i]);
williamr@4
  1051
  return __tmp;
williamr@4
  1052
}
williamr@4
  1053
williamr@4
  1054
template <class _Tp>
williamr@4
  1055
inline valarray<_Tp> tan(const valarray<_Tp>& __x) {
williamr@4
  1056
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1057
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1058
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1059
    __tmp[__i] = ::tan(__x[__i]);
williamr@4
  1060
  return __tmp;
williamr@4
  1061
}
williamr@4
  1062
williamr@4
  1063
template <class _Tp>
williamr@4
  1064
inline valarray<_Tp> tanh(const valarray<_Tp>& __x) {
williamr@4
  1065
  typedef typename valarray<_Tp>::_NoInit _NoInit;
williamr@4
  1066
  valarray<_Tp> __tmp(__x.size(), _NoInit());
williamr@4
  1067
  for (size_t __i = 0; __i < __x.size(); ++__i)
williamr@4
  1068
    __tmp[__i] = ::tanh(__x[__i]);
williamr@4
  1069
  return __tmp;
williamr@4
  1070
}
williamr@4
  1071
williamr@4
  1072
//----------------------------------------------------------------------
williamr@4
  1073
// slice and slice_array
williamr@4
  1074
williamr@4
  1075
class slice {
williamr@4
  1076
public:
williamr@4
  1077
  slice() : _M_start(0), _M_length(0), _M_stride(0) {}
williamr@4
  1078
  slice(size_t __start, size_t __length, size_t __stride)
williamr@4
  1079
    : _M_start(__start), _M_length(__length), _M_stride(__stride)
williamr@4
  1080
    {}
williamr@4
  1081
  __TRIVIAL_DESTRUCTOR(slice)
williamr@4
  1082
williamr@4
  1083
  size_t start()  const { return _M_start; }
williamr@4
  1084
  size_t size()   const { return _M_length; }
williamr@4
  1085
  size_t stride() const { return _M_stride; }
williamr@4
  1086
williamr@4
  1087
private:
williamr@4
  1088
  size_t _M_start;
williamr@4
  1089
  size_t _M_length;
williamr@4
  1090
  size_t _M_stride;
williamr@4
  1091
};
williamr@4
  1092
williamr@4
  1093
template <class _Tp>
williamr@4
  1094
class slice_array {
williamr@4
  1095
  friend class valarray<_Tp>;
williamr@4
  1096
public:
williamr@4
  1097
  typedef _Tp value_type;
williamr@4
  1098
williamr@4
  1099
  void operator=(const valarray<value_type>& __x) const {
williamr@4
  1100
    size_t __index = _M_slice.start();
williamr@4
  1101
    for (size_t __i = 0;
williamr@4
  1102
         __i < _M_slice.size();
williamr@4
  1103
         ++__i, __index += _M_slice.stride())
williamr@4
  1104
      _M_array[__index] = __x[__i];
williamr@4
  1105
  }
williamr@4
  1106
williamr@4
  1107
  void operator*=(const valarray<value_type>& __x) const {
williamr@4
  1108
    size_t __index = _M_slice.start();
williamr@4
  1109
    for (size_t __i = 0;
williamr@4
  1110
         __i < _M_slice.size();
williamr@4
  1111
         ++__i, __index += _M_slice.stride())
williamr@4
  1112
      _M_array[__index] *= __x[__i];
williamr@4
  1113
  }
williamr@4
  1114
williamr@4
  1115
  void operator/=(const valarray<value_type>& __x) const {
williamr@4
  1116
    size_t __index = _M_slice.start();
williamr@4
  1117
    for (size_t __i = 0;
williamr@4
  1118
         __i < _M_slice.size();
williamr@4
  1119
         ++__i, __index += _M_slice.stride())
williamr@4
  1120
      _M_array[__index] /= __x[__i];
williamr@4
  1121
  }
williamr@4
  1122
williamr@4
  1123
  void operator%=(const valarray<value_type>& __x) const {
williamr@4
  1124
    size_t __index = _M_slice.start();
williamr@4
  1125
    for (size_t __i = 0;
williamr@4
  1126
         __i < _M_slice.size();
williamr@4
  1127
         ++__i, __index += _M_slice.stride())
williamr@4
  1128
      _M_array[__index] %= __x[__i];
williamr@4
  1129
  }
williamr@4
  1130
williamr@4
  1131
  void operator+=(const valarray<value_type>& __x) const {
williamr@4
  1132
    size_t __index = _M_slice.start();
williamr@4
  1133
    for (size_t __i = 0;
williamr@4
  1134
         __i < _M_slice.size();
williamr@4
  1135
         ++__i, __index += _M_slice.stride())
williamr@4
  1136
      _M_array[__index] += __x[__i];
williamr@4
  1137
  }
williamr@4
  1138
williamr@4
  1139
  void operator-=(const valarray<value_type>& __x) const {
williamr@4
  1140
    size_t __index = _M_slice.start();
williamr@4
  1141
    for (size_t __i = 0;
williamr@4
  1142
         __i < _M_slice.size();
williamr@4
  1143
         ++__i, __index += _M_slice.stride())
williamr@4
  1144
      _M_array[__index] -= __x[__i];
williamr@4
  1145
  }
williamr@4
  1146
williamr@4
  1147
  void operator^=(const valarray<value_type>& __x) const {
williamr@4
  1148
    size_t __index = _M_slice.start();
williamr@4
  1149
    for (size_t __i = 0;
williamr@4
  1150
         __i < _M_slice.size();
williamr@4
  1151
         ++__i, __index += _M_slice.stride())
williamr@4
  1152
      _M_array[__index] ^= __x[__i];
williamr@4
  1153
  }
williamr@4
  1154
williamr@4
  1155
  void operator&=(const valarray<value_type>& __x) const {
williamr@4
  1156
    size_t __index = _M_slice.start();
williamr@4
  1157
    for (size_t __i = 0;
williamr@4
  1158
         __i < _M_slice.size();
williamr@4
  1159
         ++__i, __index += _M_slice.stride())
williamr@4
  1160
      _M_array[__index] &= __x[__i];
williamr@4
  1161
  }
williamr@4
  1162
williamr@4
  1163
  void operator|=(const valarray<value_type>& __x) const {
williamr@4
  1164
    size_t __index = _M_slice.start();
williamr@4
  1165
    for (size_t __i = 0;
williamr@4
  1166
         __i < _M_slice.size();
williamr@4
  1167
         ++__i, __index += _M_slice.stride())
williamr@4
  1168
      _M_array[__index] |= __x[__i];
williamr@4
  1169
  }
williamr@4
  1170
williamr@4
  1171
  void operator<<=(const valarray<value_type>& __x) const {
williamr@4
  1172
    size_t __index = _M_slice.start();
williamr@4
  1173
    for (size_t __i = 0;
williamr@4
  1174
         __i < _M_slice.size();
williamr@4
  1175
         ++__i, __index += _M_slice.stride())
williamr@4
  1176
      _M_array[__index] <<= __x[__i];
williamr@4
  1177
  }
williamr@4
  1178
williamr@4
  1179
  void operator>>=(const valarray<value_type>& __x) const {
williamr@4
  1180
    size_t __index = _M_slice.start();
williamr@4
  1181
    for (size_t __i = 0;
williamr@4
  1182
         __i < _M_slice.size();
williamr@4
  1183
         ++__i, __index += _M_slice.stride())
williamr@4
  1184
      _M_array[__index] >>= __x[__i];
williamr@4
  1185
  }
williamr@4
  1186
williamr@4
  1187
  void operator=(const value_type& __c) /*const could be const but standard says NO (26.3.5.4-1)*/ {
williamr@4
  1188
    size_t __index = _M_slice.start();
williamr@4
  1189
    for (size_t __i = 0;
williamr@4
  1190
         __i < _M_slice.size();
williamr@4
  1191
         ++__i, __index += _M_slice.stride())
williamr@4
  1192
      _M_array[__index] = __c;
williamr@4
  1193
  }
williamr@4
  1194
williamr@4
  1195
  ~slice_array() {}
williamr@4
  1196
williamr@4
  1197
private:
williamr@4
  1198
  slice_array(const slice& __slice, valarray<_Tp>& __array)
williamr@4
  1199
    : _M_slice(__slice), _M_array(__array)
williamr@4
  1200
    {}
williamr@4
  1201
williamr@4
  1202
  slice          _M_slice;
williamr@4
  1203
  valarray<_Tp>& _M_array;
williamr@4
  1204
williamr@4
  1205
private:                        // Disable assignment and default constructor
williamr@4
  1206
  slice_array();
williamr@4
  1207
  slice_array(const slice_array&);
williamr@4
  1208
  slice_array& operator=(const slice_array&);
williamr@4
  1209
};
williamr@4
  1210
williamr@4
  1211
// valarray member functions dealing with slice and slice_array
williamr@4
  1212
williamr@4
  1213
template <class _Tp>
williamr@4
  1214
inline valarray<_Tp>::valarray(const slice_array<_Tp>& __x)
williamr@4
  1215
  : _Valarray_base<_Tp>(__x._M_slice.size()) {
williamr@4
  1216
  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
williamr@4
  1217
          _Is_Trivial;
williamr@4
  1218
  _M_initialize(_Is_Trivial());
williamr@4
  1219
  *this = __x;
williamr@4
  1220
}
williamr@4
  1221
williamr@4
  1222
williamr@4
  1223
template <class _Tp>
williamr@4
  1224
inline slice_array<_Tp> valarray<_Tp>::operator[](slice __slice) {
williamr@4
  1225
  return slice_array<_Tp>(__slice, *this);
williamr@4
  1226
}
williamr@4
  1227
williamr@4
  1228
//----------------------------------------------------------------------
williamr@4
  1229
// gslice and gslice_array
williamr@4
  1230
williamr@4
  1231
template <class _Size>
williamr@4
  1232
struct _Gslice_Iter_tmpl;
williamr@4
  1233
williamr@4
  1234
class gslice {
williamr@4
  1235
  friend struct _Gslice_Iter_tmpl<size_t>;
williamr@4
  1236
public:
williamr@4
  1237
  gslice() : _M_start(0), _M_lengths(0), _M_strides(0) {}
williamr@4
  1238
  gslice(size_t __start,
williamr@4
  1239
         const _Valarray_size_t& __lengths, const _Valarray_size_t& __strides)
williamr@4
  1240
    : _M_start(__start), _M_lengths(__lengths), _M_strides(__strides)
williamr@4
  1241
    {}
williamr@4
  1242
  __TRIVIAL_DESTRUCTOR(gslice)
williamr@4
  1243
williamr@4
  1244
  size_t start()            const { return _M_start; }
williamr@4
  1245
  _Valarray_size_t size()   const { return _M_lengths; }
williamr@4
  1246
  _Valarray_size_t stride() const { return _M_strides; }
williamr@4
  1247
williamr@4
  1248
  // Extension: check for an empty gslice.
williamr@4
  1249
  bool _M_empty() const { return _M_lengths.size() == 0; }
williamr@4
  1250
williamr@4
  1251
  // Extension: number of indices this gslice represents.  (For a degenerate
williamr@4
  1252
  // gslice, they're not necessarily all distinct.)
williamr@4
  1253
  size_t _M_size() const {
williamr@4
  1254
    return !this->_M_empty()
williamr@4
  1255
      ? accumulate(_M_lengths._M_first + 1,
williamr@4
  1256
                   _M_lengths._M_first + _M_lengths._M_size,
williamr@4
  1257
                   _M_lengths[0],
williamr@4
  1258
                   multiplies<size_t>())
williamr@4
  1259
      : 0;
williamr@4
  1260
  }
williamr@4
  1261
williamr@4
  1262
# ifndef __HP_aCC
williamr@4
  1263
private:
williamr@4
  1264
# endif
williamr@4
  1265
williamr@4
  1266
  size_t _M_start;
williamr@4
  1267
  _Valarray_size_t _M_lengths;
williamr@4
  1268
  _Valarray_size_t _M_strides;
williamr@4
  1269
};
williamr@4
  1270
williamr@4
  1271
// This is not an STL iterator.  It is constructed from a gslice, and it
williamr@4
  1272
// steps through the gslice indices in sequence.  See 23.3.6 of the C++
williamr@4
  1273
// standard, paragraphs 2-3, for an explanation of the sequence.  At
williamr@4
  1274
// each step we get two things: the ordinal (i.e. number of steps taken),
williamr@4
  1275
// and the one-dimensional index.
williamr@4
  1276
williamr@4
  1277
template <class _Size>
williamr@4
  1278
struct _Gslice_Iter_tmpl {
williamr@4
  1279
  _Gslice_Iter_tmpl(const gslice& __gslice)
williamr@4
  1280
    : _M_step(0), _M_1d_idx(__gslice.start()),
williamr@4
  1281
      _M_indices(size_t(0), __gslice._M_lengths.size()),
williamr@4
  1282
      _M_gslice(__gslice)
williamr@4
  1283
    {}
williamr@4
  1284
williamr@4
  1285
  bool _M_done() const { return _M_indices[0] == _M_gslice._M_lengths[0]; }
williamr@4
  1286
williamr@4
  1287
  bool _M_incr();
williamr@4
  1288
williamr@4
  1289
  _Size _M_step;
williamr@4
  1290
  _Size _M_1d_idx;
williamr@4
  1291
williamr@4
  1292
  valarray<_Size> _M_indices;
williamr@4
  1293
  const gslice& _M_gslice;
williamr@4
  1294
};
williamr@4
  1295
williamr@4
  1296
typedef _Gslice_Iter_tmpl<size_t> _Gslice_Iter;
williamr@4
  1297
williamr@4
  1298
template <class _Tp>
williamr@4
  1299
class gslice_array {
williamr@4
  1300
  friend class valarray<_Tp>;
williamr@4
  1301
public:
williamr@4
  1302
  typedef _Tp value_type;
williamr@4
  1303
williamr@4
  1304
  void operator= (const valarray<value_type>& __x) const {
williamr@4
  1305
    if (!_M_gslice._M_empty()) {
williamr@4
  1306
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1307
      do _M_array[__i._M_1d_idx] = __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1308
    }
williamr@4
  1309
  }
williamr@4
  1310
williamr@4
  1311
  void operator*= (const valarray<value_type>& __x) const {
williamr@4
  1312
    if (!_M_gslice._M_empty()) {
williamr@4
  1313
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1314
      do _M_array[__i._M_1d_idx] *= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1315
    }
williamr@4
  1316
  }
williamr@4
  1317
williamr@4
  1318
  void operator/= (const valarray<value_type>& __x) const {
williamr@4
  1319
    if (!_M_gslice._M_empty()) {
williamr@4
  1320
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1321
      do _M_array[__i._M_1d_idx] /= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1322
    }
williamr@4
  1323
  }
williamr@4
  1324
williamr@4
  1325
  void operator%= (const valarray<value_type>& __x) const {
williamr@4
  1326
    if (!_M_gslice._M_empty()) {
williamr@4
  1327
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1328
      do _M_array[__i._M_1d_idx] %= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1329
    }
williamr@4
  1330
  }
williamr@4
  1331
williamr@4
  1332
  void operator+= (const valarray<value_type>& __x) const {
williamr@4
  1333
    if (!_M_gslice._M_empty()) {
williamr@4
  1334
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1335
      do _M_array[__i._M_1d_idx] += __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1336
    }
williamr@4
  1337
  }
williamr@4
  1338
williamr@4
  1339
  void operator-= (const valarray<value_type>& __x) const {
williamr@4
  1340
    if (!_M_gslice._M_empty()) {
williamr@4
  1341
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1342
      do _M_array[__i._M_1d_idx] -= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1343
    }
williamr@4
  1344
  }
williamr@4
  1345
williamr@4
  1346
  void operator^= (const valarray<value_type>& __x) const {
williamr@4
  1347
    if (!_M_gslice._M_empty()) {
williamr@4
  1348
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1349
      do _M_array[__i._M_1d_idx] ^= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1350
    }
williamr@4
  1351
  }
williamr@4
  1352
williamr@4
  1353
  void operator&= (const valarray<value_type>& __x) const {
williamr@4
  1354
    if (!_M_gslice._M_empty()) {
williamr@4
  1355
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1356
      do _M_array[__i._M_1d_idx] &= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1357
    }
williamr@4
  1358
  }
williamr@4
  1359
williamr@4
  1360
  void operator|= (const valarray<value_type>& __x) const {
williamr@4
  1361
    if (!_M_gslice._M_empty()) {
williamr@4
  1362
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1363
      do _M_array[__i._M_1d_idx] |= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1364
    }
williamr@4
  1365
  }
williamr@4
  1366
williamr@4
  1367
  void operator<<= (const valarray<value_type>& __x) const {
williamr@4
  1368
    if (!_M_gslice._M_empty()) {
williamr@4
  1369
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1370
      do _M_array[__i._M_1d_idx] <<= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1371
    }
williamr@4
  1372
  }
williamr@4
  1373
williamr@4
  1374
  void operator>>= (const valarray<value_type>& __x) const {
williamr@4
  1375
    if (!_M_gslice._M_empty()) {
williamr@4
  1376
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1377
      do _M_array[__i._M_1d_idx] >>= __x[__i._M_step]; while(__i._M_incr());
williamr@4
  1378
    }
williamr@4
  1379
  }
williamr@4
  1380
williamr@4
  1381
  void operator= (const value_type& __c) /*const could be const but standard says NO (26.3.7.4-1)*/ {
williamr@4
  1382
    if (!_M_gslice._M_empty()) {
williamr@4
  1383
      _Gslice_Iter __i(_M_gslice);
williamr@4
  1384
      do _M_array[__i._M_1d_idx] = __c; while(__i._M_incr());
williamr@4
  1385
    }
williamr@4
  1386
  }
williamr@4
  1387
williamr@4
  1388
  ~gslice_array() {}
williamr@4
  1389
williamr@4
  1390
private:
williamr@4
  1391
  gslice_array(const gslice& __gslice, valarray<_Tp>& __array)
williamr@4
  1392
    : _M_gslice(__gslice), _M_array(__array)
williamr@4
  1393
    {}
williamr@4
  1394
williamr@4
  1395
  gslice                _M_gslice;
williamr@4
  1396
  valarray<value_type>& _M_array;
williamr@4
  1397
williamr@4
  1398
private:                        // Disable assignment
williamr@4
  1399
  void operator=(const gslice_array<_Tp>&);
williamr@4
  1400
};
williamr@4
  1401
williamr@4
  1402
// valarray member functions dealing with gslice and gslice_array.  Note
williamr@4
  1403
// that it is illegal (behavior is undefined) to construct a gslice_array
williamr@4
  1404
// from a degenerate gslice.
williamr@4
  1405
williamr@4
  1406
template <class _Tp>
williamr@4
  1407
inline valarray<_Tp>::valarray(const gslice_array<_Tp>& __x)
williamr@4
  1408
  : _Valarray_base<_Tp>(__x._M_gslice._M_size()) {
williamr@4
  1409
  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
williamr@4
  1410
          _Is_Trivial;
williamr@4
  1411
  _M_initialize(_Is_Trivial());
williamr@4
  1412
  *this = __x;
williamr@4
  1413
}
williamr@4
  1414
williamr@4
  1415
template <class _Tp>
williamr@4
  1416
inline gslice_array<_Tp> valarray<_Tp>::operator[](const gslice& __slice) {
williamr@4
  1417
  return gslice_array<_Tp>(__slice, *this);
williamr@4
  1418
}
williamr@4
  1419
williamr@4
  1420
williamr@4
  1421
//----------------------------------------------------------------------
williamr@4
  1422
// mask_array
williamr@4
  1423
williamr@4
  1424
template <class _Tp>
williamr@4
  1425
class mask_array {
williamr@4
  1426
  friend class valarray<_Tp>;
williamr@4
  1427
public:
williamr@4
  1428
  typedef _Tp value_type;
williamr@4
  1429
williamr@4
  1430
  void operator=(const valarray<value_type>& __x) const {
williamr@4
  1431
    size_t __idx = 0;
williamr@4
  1432
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1433
      if (_M_mask[__i]) _M_array[__i] = __x[__idx++];
williamr@4
  1434
  }
williamr@4
  1435
williamr@4
  1436
  void operator*=(const valarray<value_type>& __x) const {
williamr@4
  1437
    size_t __idx = 0;
williamr@4
  1438
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1439
      if (_M_mask[__i]) _M_array[__i] *= __x[__idx++];
williamr@4
  1440
  }
williamr@4
  1441
williamr@4
  1442
  void operator/=(const valarray<value_type>& __x) const {
williamr@4
  1443
    size_t __idx = 0;
williamr@4
  1444
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1445
      if (_M_mask[__i]) _M_array[__i] /= __x[__idx++];
williamr@4
  1446
  }
williamr@4
  1447
williamr@4
  1448
  void operator%=(const valarray<value_type>& __x) const {
williamr@4
  1449
    size_t __idx = 0;
williamr@4
  1450
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1451
      if (_M_mask[__i]) _M_array[__i] %= __x[__idx++];
williamr@4
  1452
  }
williamr@4
  1453
williamr@4
  1454
  void operator+=(const valarray<value_type>& __x) const {
williamr@4
  1455
    size_t __idx = 0;
williamr@4
  1456
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1457
      if (_M_mask[__i]) _M_array[__i] += __x[__idx++];
williamr@4
  1458
  }
williamr@4
  1459
williamr@4
  1460
  void operator-=(const valarray<value_type>& __x) const {
williamr@4
  1461
    size_t __idx = 0;
williamr@4
  1462
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1463
      if (_M_mask[__i]) _M_array[__i] -= __x[__idx++];
williamr@4
  1464
  }
williamr@4
  1465
williamr@4
  1466
  void operator^=(const valarray<value_type>& __x) const {
williamr@4
  1467
    size_t __idx = 0;
williamr@4
  1468
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1469
      if (_M_mask[__i]) _M_array[__i] ^= __x[__idx++];
williamr@4
  1470
  }
williamr@4
  1471
williamr@4
  1472
  void operator&=(const valarray<value_type>& __x) const {
williamr@4
  1473
    size_t __idx = 0;
williamr@4
  1474
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1475
      if (_M_mask[__i]) _M_array[__i] &= __x[__idx++];
williamr@4
  1476
  }
williamr@4
  1477
williamr@4
  1478
  void operator|=(const valarray<value_type>& __x) const {
williamr@4
  1479
    size_t __idx = 0;
williamr@4
  1480
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1481
      if (_M_mask[__i]) _M_array[__i] |= __x[__idx++];
williamr@4
  1482
  }
williamr@4
  1483
williamr@4
  1484
  void operator<<=(const valarray<value_type>& __x) const {
williamr@4
  1485
    size_t __idx = 0;
williamr@4
  1486
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1487
      if (_M_mask[__i]) _M_array[__i] <<= __x[__idx++];
williamr@4
  1488
  }
williamr@4
  1489
williamr@4
  1490
  void operator>>=(const valarray<value_type>& __x) const {
williamr@4
  1491
    size_t __idx = 0;
williamr@4
  1492
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1493
      if (_M_mask[__i]) _M_array[__i] >>= __x[__idx++];
williamr@4
  1494
  }
williamr@4
  1495
williamr@4
  1496
  void operator=(const value_type& __c) const {
williamr@4
  1497
    for (size_t __i = 0; __i < _M_array.size(); ++__i)
williamr@4
  1498
      if (_M_mask[__i]) _M_array[__i] = __c;
williamr@4
  1499
  }
williamr@4
  1500
williamr@4
  1501
  ~mask_array() {}
williamr@4
  1502
williamr@4
  1503
  // Extension: number of true values in the mask
williamr@4
  1504
  size_t _M_num_true() const {
williamr@4
  1505
    size_t __result = 0;
williamr@4
  1506
    for (size_t __i = 0; __i < _M_mask.size(); ++__i)
williamr@4
  1507
      if (_M_mask[__i]) ++__result;
williamr@4
  1508
    return __result;
williamr@4
  1509
  }
williamr@4
  1510
williamr@4
  1511
private:
williamr@4
  1512
  mask_array(const _Valarray_bool& __mask, valarray<_Tp>& __array)
williamr@4
  1513
    : _M_mask(__mask), _M_array(__array)
williamr@4
  1514
    {}
williamr@4
  1515
williamr@4
  1516
  _Valarray_bool _M_mask;
williamr@4
  1517
  valarray<_Tp>& _M_array;
williamr@4
  1518
williamr@4
  1519
private:                        // Disable assignment
williamr@4
  1520
  void operator=(const mask_array<_Tp>&);
williamr@4
  1521
};
williamr@4
  1522
williamr@4
  1523
// valarray member functions dealing with mask_array
williamr@4
  1524
williamr@4
  1525
template <class _Tp>
williamr@4
  1526
inline valarray<_Tp>::valarray(const mask_array<_Tp>& __x)
williamr@4
  1527
  : _Valarray_base<_Tp>(__x._M_num_true())
williamr@4
  1528
{
williamr@4
  1529
  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
williamr@4
  1530
          _Is_Trivial;
williamr@4
  1531
  _M_initialize(_Is_Trivial());
williamr@4
  1532
  *this = __x;
williamr@4
  1533
}
williamr@4
  1534
williamr@4
  1535
// Behavior is undefined if __x._M_num_true() != this->size()
williamr@4
  1536
template <class _Tp>
williamr@4
  1537
inline valarray<_Tp>& valarray<_Tp>::operator=(const mask_array<_Tp>& __x) {
williamr@4
  1538
  size_t __idx = 0;
williamr@4
  1539
  for (size_t __i = 0; __i < __x._M_array.size(); ++__i)
williamr@4
  1540
    if (__x._M_mask[__i]) (*this)[__idx++] = __x._M_array[__i];
williamr@4
  1541
  return *this;
williamr@4
  1542
}
williamr@4
  1543
williamr@4
  1544
template <class _Tp>
williamr@4
  1545
inline mask_array<_Tp> valarray<_Tp>::operator[](const _Valarray_bool& __mask)
williamr@4
  1546
{
williamr@4
  1547
  return mask_array<_Tp>(__mask, *this);
williamr@4
  1548
}
williamr@4
  1549
williamr@4
  1550
williamr@4
  1551
//----------------------------------------------------------------------
williamr@4
  1552
// indirect_array
williamr@4
  1553
williamr@4
  1554
template <class _Tp>
williamr@4
  1555
class indirect_array {
williamr@4
  1556
  friend class valarray<_Tp>;
williamr@4
  1557
public:
williamr@4
  1558
  typedef _Tp value_type;
williamr@4
  1559
williamr@4
  1560
  void operator=(const valarray<value_type>& __x) const {
williamr@4
  1561
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1562
      _M_array[_M_addr[__i]] = __x[__i];
williamr@4
  1563
  }
williamr@4
  1564
williamr@4
  1565
  void operator*=(const valarray<value_type>& __x) const {
williamr@4
  1566
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1567
      _M_array[_M_addr[__i]] *= __x[__i];
williamr@4
  1568
  }
williamr@4
  1569
williamr@4
  1570
  void operator/=(const valarray<value_type>& __x) const {
williamr@4
  1571
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1572
      _M_array[_M_addr[__i]] /= __x[__i];
williamr@4
  1573
  }
williamr@4
  1574
williamr@4
  1575
  void operator%=(const valarray<value_type>& __x) const {
williamr@4
  1576
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1577
      _M_array[_M_addr[__i]] %= __x[__i];
williamr@4
  1578
  }
williamr@4
  1579
williamr@4
  1580
  void operator+=(const valarray<value_type>& __x) const {
williamr@4
  1581
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1582
      _M_array[_M_addr[__i]] += __x[__i];
williamr@4
  1583
  }
williamr@4
  1584
williamr@4
  1585
  void operator-=(const valarray<value_type>& __x) const {
williamr@4
  1586
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1587
      _M_array[_M_addr[__i]] -= __x[__i];
williamr@4
  1588
  }
williamr@4
  1589
williamr@4
  1590
  void operator^=(const valarray<value_type>& __x) const {
williamr@4
  1591
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1592
      _M_array[_M_addr[__i]] ^= __x[__i];
williamr@4
  1593
  }
williamr@4
  1594
williamr@4
  1595
  void operator&=(const valarray<value_type>& __x) const {
williamr@4
  1596
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1597
      _M_array[_M_addr[__i]] &= __x[__i];
williamr@4
  1598
  }
williamr@4
  1599
williamr@4
  1600
  void operator|=(const valarray<value_type>& __x) const {
williamr@4
  1601
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1602
      _M_array[_M_addr[__i]] |= __x[__i];
williamr@4
  1603
  }
williamr@4
  1604
williamr@4
  1605
  void operator<<=(const valarray<value_type>& __x) const {
williamr@4
  1606
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1607
      _M_array[_M_addr[__i]] <<= __x[__i];
williamr@4
  1608
  }
williamr@4
  1609
williamr@4
  1610
  void operator>>=(const valarray<value_type>& __x) const {
williamr@4
  1611
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1612
      _M_array[_M_addr[__i]] >>= __x[__i];
williamr@4
  1613
  }
williamr@4
  1614
williamr@4
  1615
  void operator=(const value_type& __c) const {
williamr@4
  1616
    for (size_t __i = 0; __i < _M_addr.size(); ++__i)
williamr@4
  1617
      _M_array[_M_addr[__i]] = __c;
williamr@4
  1618
  }
williamr@4
  1619
williamr@4
  1620
  ~indirect_array() {}
williamr@4
  1621
williamr@4
  1622
private:
williamr@4
  1623
  indirect_array(const _Valarray_size_t& __addr, valarray<_Tp>& __array)
williamr@4
  1624
    : _M_addr(__addr), _M_array(__array)
williamr@4
  1625
    {}
williamr@4
  1626
williamr@4
  1627
  _Valarray_size_t _M_addr;
williamr@4
  1628
  valarray<_Tp>&   _M_array;
williamr@4
  1629
williamr@4
  1630
private:                        // Disable assignment
williamr@4
  1631
  void operator=(const indirect_array<_Tp>&);
williamr@4
  1632
};
williamr@4
  1633
williamr@4
  1634
// valarray member functions dealing with indirect_array
williamr@4
  1635
williamr@4
  1636
template <class _Tp>
williamr@4
  1637
inline valarray<_Tp>::valarray(const indirect_array<_Tp>& __x)
williamr@4
  1638
  : _Valarray_base<_Tp>(__x._M_addr.size())
williamr@4
  1639
{
williamr@4
  1640
  typedef typename __type_traits<_Tp>::has_trivial_default_constructor
williamr@4
  1641
          _Is_Trivial;
williamr@4
  1642
  _M_initialize(_Is_Trivial());
williamr@4
  1643
  *this = __x;
williamr@4
  1644
}
williamr@4
  1645
williamr@4
  1646
williamr@4
  1647
template <class _Tp>
williamr@4
  1648
inline indirect_array<_Tp>
williamr@4
  1649
valarray<_Tp>::operator[](const _Valarray_size_t& __addr)
williamr@4
  1650
{
williamr@4
  1651
  return indirect_array<_Tp>(__addr, *this);
williamr@4
  1652
}
williamr@4
  1653
williamr@4
  1654
_STLP_END_NAMESPACE
williamr@4
  1655
williamr@4
  1656
# if !defined (_STLP_LINK_TIME_INSTANTIATION)
williamr@4
  1657
#  include <stl/_valarray.c>
williamr@4
  1658
# endif
williamr@4
  1659
williamr@4
  1660
#endif /* _STLP_VALARRAY */
williamr@4
  1661
williamr@4
  1662
williamr@4
  1663
// Local Variables:
williamr@4
  1664
// mode:C++
williamr@4
  1665
// End: