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