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