5 * Hewlett-Packard Company
7 * Copyright (c) 1996,1997
8 * Silicon Graphics Computer Systems, Inc.
11 * Moscow Center for SPARC Technology
16 * This material is provided "as is", with absolutely no warranty expressed
17 * or implied. Any use is at your own risk.
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.
26 #ifndef _STLP_VALARRAY_C
27 #define _STLP_VALARRAY_C
29 #ifndef _STLP_VALARRAY_H
30 # include <stl/_valarray.h>
36 _Valarray_bool valarray
<_Tp
>:: operator!() const {
37 _Valarray_bool
__tmp(this->size(), _Valarray_bool::_NoInit());
38 for (size_t __i
= 0; __i
< this->size(); ++__i
)
39 __tmp
[__i
] = !(*this)[__i
];
43 // Behavior is undefined if __x and *this have different sizes
45 valarray
<_Tp
>& valarray
<_Tp
>::operator=(const slice_array
<_Tp
>& __x
) {
46 _STLP_ASSERT(__x
._M_slice
.size() == this->size())
47 size_t __index
= __x
._M_slice
.start();
49 __i
< __x
._M_slice
.size();
50 ++__i
, __index
+= __x
._M_slice
.stride())
51 (*this)[__i
] = __x
._M_array
[__index
];
56 valarray
<_Tp
> valarray
<_Tp
>::operator[](slice __slice
) const {
57 valarray
<_Tp
> __tmp(__slice
.size(), _NoInit());
58 size_t __index
= __slice
.start();
61 ++__i
, __index
+= __slice
.stride())
62 __tmp
[__i
] = (*this)[__index
];
66 template <class _Size
>
67 bool _Gslice_Iter_tmpl
<_Size
>::_M_incr() {
68 size_t __dim
= _M_indices
.size() - 1;
71 _M_1d_idx
+= _M_gslice
._M_strides
[__dim
];
72 if (++_M_indices
[__dim
] != _M_gslice
._M_lengths
[__dim
])
74 else if (__dim
!= 0) {
75 _M_1d_idx
-= _M_gslice
._M_strides
[__dim
] * _M_gslice
._M_lengths
[__dim
];
76 _M_indices
[__dim
] = 0;
84 // Behavior is undefined if __x and *this have different sizes, or if
85 // __x was constructed from a degenerate gslice.
87 valarray
<_Tp
>& valarray
<_Tp
>::operator=(const gslice_array
<_Tp
>& __x
) {
88 if (this->size() != 0) {
89 _Gslice_Iter
__i(__x
._M_gslice
);
91 (*this)[__i
._M_step
] = __x
._M_array
[__i
._M_1d_idx
];
98 valarray
<_Tp
> valarray
<_Tp
>::operator[](const gslice
& __slice
) const {
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());
108 valarray
<_Tp
> valarray
<_Tp
>::operator[](const _Valarray_bool
& __mask
) const {
111 for (size_t __i
= 0; __i
< __mask
.size(); ++__i
)
112 if (__mask
[__i
]) ++_p_size
;
115 valarray
<_Tp
> __tmp(_p_size
, _NoInit());
118 for (size_t __i
= 0; __i
< __mask
.size(); ++__i
)
119 if (__mask
[__i
]) __tmp
[__idx
++] = (*this)[__i
];
126 valarray
<_Tp
>& valarray
<_Tp
>::operator=(const indirect_array
<_Tp
>& __x
) {
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
]];
135 valarray
<_Tp
>::operator[](const _Valarray_size_t
& __addr
) const {
136 valarray
<_Tp
> __tmp(__addr
.size(), _NoInit());
137 for (size_t __i
= 0; __i
< __addr
.size(); ++__i
)
138 __tmp
[__i
] = (*this)[__addr
[__i
]];
142 //----------------------------------------------------------------------
143 // Other valarray noninline member functions
148 valarray
<_Tp
> valarray
<_Tp
>::shift(int __n
) const {
149 valarray
<_Tp
> __tmp(this->size());
152 if (__n
< this->size())
153 copy(this->_M_first
+ __n
, this->_M_first
+ this->size(),
157 if (-__n
< this->size())
158 copy(this->_M_first
, this->_M_first
+ this->size() + __n
,
159 __tmp
._M_first
- __n
);
165 valarray
<_Tp
> valarray
<_Tp
>::cshift(int __m
) const {
166 valarray
<_Tp
> __tmp(this->size());
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.
172 if (this->size() < (numeric_limits
<long>::max
)())
173 __n
%= long(this->size());
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(),
187 #endif /* _STLP_VALARRAY_C */