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