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