libstdc++
valarray
Go to the documentation of this file.
1
/
/
The
template
and
inlines
for
the
-
*
-
C
+
+
-
*
-
valarray
class
.
2
3
/
/
Copyright
(
C
)
1997-2025
Free
Software
Foundation
,
Inc
.
4
/
/
5
/
/
This
file
is
part
of
the
GNU
ISO
C
+
+
Library
.
This
library
is
free
6
/
/
software
;
you
can
redistribute
it
and
/
or
modify
it
under
the
7
/
/
terms
of
the
GNU
General
Public
License
as
published
by
the
8
/
/
Free
Software
Foundation
;
either
version
3
,
or
(
at
your
option
)
9
/
/
any
later
version
.
10
11
/
/
This
library
is
distributed
in
the
hope
that
it
will
be
useful
,
12
/
/
but
WITHOUT
ANY
WARRANTY
;
without
even
the
implied
warranty
of
13
/
/
MERCHANTABILITY
or
FITNESS
FOR
A
PARTICULAR
PURPOSE
.
See
the
14
/
/
GNU
General
Public
License
for
more
details
.
15
16
/
/
Under
Section
7
of
GPL
version
3
,
you
are
granted
additional
17
/
/
permissions
described
in
the
GCC
Runtime
Library
Exception
,
version
18
/
/
3
.
1
,
as
published
by
the
Free
Software
Foundation
.
19
20
/
/
You
should
have
received
a
copy
of
the
GNU
General
Public
License
and
21
/
/
a
copy
of
the
GCC
Runtime
Library
Exception
along
with
this
program
;
22
/
/
see
the
files
COPYING3
and
COPYING
.
RUNTIME
respectively
.
If
not
,
see
23
/
/
<
http
:
/
/
www
.
gnu
.
org
/
licenses
/
>
.
24
25
/
*
*
@
file
include
/
valarray
26
*
This
is
a
Standard
C
+
+
Library
header
.
27
*
/
28
29
/
/
Written
by
Gabriel
Dos
Reis
<
Gabriel
.
Dos
-
Reis
@
DPTMaths
.
ENS
-
Cachan
.
Fr
>
30
31
#ifndef _GLIBCXX_VALARRAY
32
#define _GLIBCXX_VALARRAY 1
33
34
#ifdef _GLIBCXX_SYSHDR
35
#pragma GCC system_header
36
#endif
37
38
#include <bits/requires_hosted.h> // <cmath> dependant
39
40
#include <bits/c++config.h>
41
#include <cmath>
42
#include <algorithm>
43
#include <debug/debug.h>
44
#if __cplusplus >= 201103L
45
#include <initializer_list>
46
#endif
47
48
namespace
std
_GLIBCXX_VISIBILITY
(
default
)
49
{
50
_GLIBCXX_BEGIN_NAMESPACE_VERSION
51
52
template
<
class
_Clos
,
typename
_Tp
>
53
class
_Expr
;
54
55
template
<
typename
_Tp1
,
typename
_Tp2
>
56
class
_ValArray
;
57
58
namespace
__detail
59
{
60
template
<
class
_Oper
,
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
61
struct
_UnClos
;
62
63
template
<
class
_Oper
,
64
template
<
class
,
class
>
class
_Meta1
,
65
template
<
class
,
class
>
class
_Meta2
,
66
class
_Dom1
,
class
_Dom2
>
67
struct
_BinClos
;
68
69
template
<
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
70
struct
_SClos
;
71
72
template
<
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
73
struct
_GClos
;
74
75
template
<
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
76
struct
_IClos
;
77
78
template
<
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
79
struct
_ValFunClos
;
80
81
template
<
template
<
class
,
class
>
class
_Meta
,
class
_Dom
>
82
struct
_RefFunClos
;
83
}
/
/
namespace
__detail
84
85
using
__detail
:
:
_UnClos
;
86
using
__detail
:
:
_BinClos
;
87
using
__detail
:
:
_SClos
;
88
using
__detail
:
:
_GClos
;
89
using
__detail
:
:
_IClos
;
90
using
__detail
:
:
_ValFunClos
;
91
using
__detail
:
:
_RefFunClos
;
92
93
template
<
class
_Tp
>
class
valarray
;
/
/
An
array
of
type
_Tp
94
class
slice
;
/
/
BLAS
-
like
slice
out
of
an
array
95
template
<
class
_Tp
>
class
slice_array
;
96
class
gslice
;
/
/
generalized
slice
out
of
an
array
97
template
<
class
_Tp
>
class
gslice_array
;
98
template
<
class
_Tp
>
class
mask_array
;
/
/
masked
array
99
template
<
class
_Tp
>
class
indirect_array
;
/
/
indirected
array
100
101
_GLIBCXX_END_NAMESPACE_VERSION
102
}
/
/
namespace
103
104
#include <bits/valarray_array.h>
105
#include <bits/valarray_before.h>
106
107
namespace
std
_GLIBCXX_VISIBILITY
(
default
)
108
{
109
_GLIBCXX_BEGIN_NAMESPACE_VERSION
110
111
/
*
*
112
*
@
defgroup
numeric_arrays
Numeric
Arrays
113
*
@
ingroup
numerics
114
*
115
*
Classes
and
functions
for
representing
and
manipulating
arrays
of
elements
.
116
*
@{
117
*
/
118
119
/
*
*
120
*
@
brief
Smart
array
designed
to
support
numeric
processing
.
121
*
122
*
A
valarray
is
an
array
that
provides
constraints
intended
to
allow
for
123
*
effective
optimization
of
numeric
array
processing
by
reducing
the
124
*
aliasing
that
can
result
from
pointer
representations
.
It
represents
a
125
*
one
-
dimensional
array
from
which
different
multidimensional
subsets
can
126
*
be
accessed
and
modified
.
127
*
128
*
@
tparam
_Tp
Type
of
object
in
the
array
.
129
*
/
130
template
<
class
_Tp
>
131
class
valarray
132
{
133
template
<
class
_Op
>
134
struct
_UnaryOp
135
{
136
type
def
typename
__fun
<
_Op
,
_Tp
>
:
:
result_type
__rt
;
137
type
def
_Expr
<
_UnClos
<
_Op
,
_ValArray
,
_Tp
>
,
__rt
>
_Rt
;
138
};
139
public
:
140
type
def
_Tp
value_type
;
141
142
/
/
_lib
.
valarray
.
cons_
construct
/
destroy
:
143
/
/
/
Construct
an
empty
array
.
144
valarray
(
)
_GLIBCXX_NOTHROW
;
145
146
/
/
/
Construct
an
array
with
@
a
n
elements
.
147
explicit
valarray
(
size_t
)
;
148
149
/
/
/
Construct
an
array
with
@
a
n
elements
initialized
to
@
a
t
.
150
valarray
(
const
_Tp
&
,
size_t
)
;
151
152
/
/
/
Construct
an
array
initialized
to
the
first
@
a
n
elements
of
@
a
t
.
153
valarray
(
const
_Tp
*
__restrict__
,
size_t
)
;
154
155
/
/
/
Copy
constructor
.
156
valarray
(
const
valarray
&
)
;
157
158
#if __cplusplus >= 201103L
159
/
/
/
Move
constructor
.
160
valarray
(
valarray
&&
)
noexcept
;
161
#endif
162
163
/
/
/
Construct
an
array
with
the
same
size
and
values
in
@
a
sa
.
164
valarray
(
const
slice_array
<
_Tp
>
&
)
;
165
166
/
/
/
Construct
an
array
with
the
same
size
and
values
in
@
a
ga
.
167
valarray
(
const
gslice_array
<
_Tp
>
&
)
;
168
169
/
/
/
Construct
an
array
with
the
same
size
and
values
in
@
a
ma
.
170
valarray
(
const
mask_array
<
_Tp
>
&
)
;
171
172
/
/
/
Construct
an
array
with
the
same
size
and
values
in
@
a
ia
.
173
valarray
(
const
indirect_array
<
_Tp
>
&
)
;
174
175
#if __cplusplus >= 201103L
176
/
/
/
Construct
an
array
with
an
initializer_list
of
values
.
177
valarray
(
initializer_list
<
_Tp
>
)
;
178
#endif
179
180
template
<
class
_Dom
>
181
valarray
(
const
_Expr
<
_Dom
,
_Tp
>
&
__e
)
;
182
183
~
valarray
(
)
_GLIBCXX_NOEXCEPT
;
184
185
/
/
_lib
.
valarray
.
assign_
assignment
:
186
/
*
*
187
*
@
brief
Assign
elements
to
an
array
.
188
*
189
*
Assign
elements
of
array
to
values
in
@
a
v
.
190
*
191
*
@
param
__v
Valarray
to
get
values
from
.
192
*
/
193
valarray
<
_Tp
>
&
operator
=
(
const
valarray
<
_Tp
>
&
__v
)
;
194
195
#if __cplusplus >= 201103L
196
/
*
*
197
*
@
brief
Move
assign
elements
to
an
array
.
198
*
199
*
Move
assign
elements
of
array
to
values
in
@
a
v
.
200
*
201
*
@
param
__v
Valarray
to
get
values
from
.
202
*
/
203
valarray
<
_Tp
>
&
operator
=
(
valarray
<
_Tp
>
&&
__v
)
noexcept
;
204
#endif
205
206
/
*
*
207
*
@
brief
Assign
elements
to
a
value
.
208
*
209
*
Assign
all
elements
of
array
to
@
a
t
.
210
*
211
*
@
param
__t
Value
for
elements
.
212
*
/
213
valarray
<
_Tp
>
&
operator
=
(
const
_Tp
&
__t
)
;
214
215
/
*
*
216
*
@
brief
Assign
elements
to
an
array
subset
.
217
*
218
*
Assign
elements
of
array
to
values
in
@
a
sa
.
Results
are
undefined
219
*
if
@
a
sa
does
not
have
the
same
size
as
this
array
.
220
*
221
*
@
param
__sa
Array
slice
to
get
values
from
.
222
*
/
223
valarray
<
_Tp
>
&
operator
=
(
const
slice_array
<
_Tp
>
&
__sa
)
;
224
225
/
*
*
226
*
@
brief
Assign
elements
to
an
array
subset
.
227
*
228
*
Assign
elements
of
array
to
values
in
@
a
ga
.
Results
are
undefined
229
*
if
@
a
ga
does
not
have
the
same
size
as
this
array
.
230
*
231
*
@
param
__ga
Array
slice
to
get
values
from
.
232
*
/
233
valarray
<
_Tp
>
&
operator
=
(
const
gslice_array
<
_Tp
>
&
__ga
)
;
234
235
/
*
*
236
*
@
brief
Assign
elements
to
an
array
subset
.
237
*
238
*
Assign
elements
of
array
to
values
in
@
a
ma
.
Results
are
undefined
239
*
if
@
a
ma
does
not
have
the
same
size
as
this
array
.
240
*
241
*
@
param
__ma
Array
slice
to
get
values
from
.
242
*
/
243
valarray
<
_Tp
>
&
operator
=
(
const
mask_array
<
_Tp
>
&
__ma
)
;
244
245
/
*
*
246
*
@
brief
Assign
elements
to
an
array
subset
.
247
*
248
*
Assign
elements
of
array
to
values
in
@
a
ia
.
Results
are
undefined
249
*
if
@
a
ia
does
not
have
the
same
size
as
this
array
.
250
*
251
*
@
param
__ia
Array
slice
to
get
values
from
.
252
*
/
253
valarray
<
_Tp
>
&
operator
=
(
const
indirect_array
<
_Tp
>
&
__ia
)
;
254
255
#if __cplusplus >= 201103L
256
/
*
*
257
*
@
brief
Assign
elements
to
an
initializer_list
.
258
*
259
*
Assign
elements
of
array
to
values
in
@
a
__l
.
Results
are
undefined
260
*
if
@
a
__l
does
not
have
the
same
size
as
this
array
.
261
*
262
*
@
param
__l
initializer_list
to
get
values
from
.
263
*
/
264
valarray
&
operator
=
(
initializer_list
<
_Tp
>
__l
)
;
265
#endif
266
267
template
<
class
_Dom
>
valarray
<
_Tp
>
&
268
operator
=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
269
270
/
/
_lib
.
valarray
.
access_
element
access
:
271
/
*
*
272
*
Return
a
reference
to
the
i
'
th
array
element
.
273
*
274
*
@
param
__i
Index
of
element
to
return
.
275
*
@
return
Reference
to
the
i
'
th
element
.
276
*
/
277
_Tp
&
operator
[]
(
size_t
__i
)
_GLIBCXX_NOTHROW
;
278
279
/
/
_GLIBCXX_RESOLVE_LIB_DEFECTS
280
/
/
389
.
Const
overload
of
valarray
:
:
operator
[]
returns
by
value
.
281
const
_Tp
&
operator
[]
(
size_t
)
const
_GLIBCXX_NOTHROW
;
282
283
/
/
_lib
.
valarray
.
sub_
subset
operations
:
284
/
*
*
285
*
@
brief
Return
an
array
subset
.
286
*
287
*
Returns
a
new
valarray
containing
the
elements
of
the
array
288
*
indicated
by
the
slice
argument
.
The
new
valarray
has
the
same
size
289
*
as
the
input
slice
.
@
see
slice
.
290
*
291
*
@
param
__s
The
source
slice
.
292
*
@
return
New
valarray
containing
elements
in
@
a
__s
.
293
*
/
294
_Expr
<
_SClos
<
_ValArray
,
_Tp
>
,
_Tp
>
operator
[]
(
slice
__s
)
const
;
295
296
/
*
*
297
*
@
brief
Return
a
reference
to
an
array
subset
.
298
*
299
*
Returns
a
new
valarray
containing
the
elements
of
the
array
300
*
indicated
by
the
slice
argument
.
The
new
valarray
has
the
same
size
301
*
as
the
input
slice
.
@
see
slice
.
302
*
303
*
@
param
__s
The
source
slice
.
304
*
@
return
New
valarray
containing
elements
in
@
a
__s
.
305
*
/
306
slice_array
<
_Tp
>
operator
[]
(
slice
__s
)
;
307
308
/
*
*
309
*
@
brief
Return
an
array
subset
.
310
*
311
*
Returns
a
slice_array
referencing
the
elements
of
the
array
312
*
indicated
by
the
slice
argument
.
@
see
gslice
.
313
*
314
*
@
param
__s
The
source
slice
.
315
*
@
return
Slice_array
referencing
elements
indicated
by
@
a
__s
.
316
*
/
317
_Expr
<
_GClos
<
_ValArray
,
_Tp
>
,
_Tp
>
operator
[]
(
const
gslice
&
__s
)
const
;
318
319
/
*
*
320
*
@
brief
Return
a
reference
to
an
array
subset
.
321
*
322
*
Returns
a
new
valarray
containing
the
elements
of
the
array
323
*
indicated
by
the
gslice
argument
.
The
new
valarray
has
324
*
the
same
size
as
the
input
gslice
.
@
see
gslice
.
325
*
326
*
@
param
__s
The
source
gslice
.
327
*
@
return
New
valarray
containing
elements
in
@
a
__s
.
328
*
/
329
gslice_array
<
_Tp
>
operator
[]
(
const
gslice
&
__s
)
;
330
331
/
*
*
332
*
@
brief
Return
an
array
subset
.
333
*
334
*
Returns
a
new
valarray
containing
the
elements
of
the
array
335
*
indicated
by
the
argument
.
The
input
is
a
valarray
of
bool
which
336
*
represents
a
bitmask
indicating
which
elements
should
be
copied
into
337
*
the
new
valarray
.
Each
element
of
the
array
is
added
to
the
return
338
*
valarray
if
the
corresponding
element
of
the
argument
is
true
.
339
*
340
*
@
param
__m
The
valarray
bitmask
.
341
*
@
return
New
valarray
containing
elements
indicated
by
@
a
__m
.
342
*
/
343
valarray
<
_Tp
>
operator
[]
(
const
valarray
<
bool
>
&
__m
)
const
;
344
345
/
*
*
346
*
@
brief
Return
a
reference
to
an
array
subset
.
347
*
348
*
Returns
a
new
mask_array
referencing
the
elements
of
the
array
349
*
indicated
by
the
argument
.
The
input
is
a
valarray
of
bool
which
350
*
represents
a
bitmask
indicating
which
elements
are
part
of
the
351
*
subset
.
Elements
of
the
array
are
part
of
the
subset
if
the
352
*
corresponding
element
of
the
argument
is
true
.
353
*
354
*
@
param
__m
The
valarray
bitmask
.
355
*
@
return
New
valarray
containing
elements
indicated
by
@
a
__m
.
356
*
/
357
mask_array
<
_Tp
>
operator
[]
(
const
valarray
<
bool
>
&
__m
)
;
358
359
/
*
*
360
*
@
brief
Return
an
array
subset
.
361
*
362
*
Returns
a
new
valarray
containing
the
elements
of
the
array
363
*
indicated
by
the
argument
.
The
elements
in
the
argument
are
364
*
interpreted
as
the
indices
of
elements
of
this
valarray
to
copy
to
365
*
the
return
valarray
.
366
*
367
*
@
param
__i
The
valarray
element
index
list
.
368
*
@
return
New
valarray
containing
elements
in
@
a
__s
.
369
*
/
370
_Expr
<
_IClos
<
_ValArray
,
_Tp
>
,
_Tp
>
371
operator
[]
(
const
valarray
<
size_t
>
&
__i
)
const
;
372
373
/
*
*
374
*
@
brief
Return
a
reference
to
an
array
subset
.
375
*
376
*
Returns
an
indirect_array
referencing
the
elements
of
the
array
377
*
indicated
by
the
argument
.
The
elements
in
the
argument
are
378
*
interpreted
as
the
indices
of
elements
of
this
valarray
to
include
379
*
in
the
subset
.
The
returned
indirect_array
refers
to
these
380
*
elements
.
381
*
382
*
@
param
__i
The
valarray
element
index
list
.
383
*
@
return
Indirect_array
referencing
elements
in
@
a
__i
.
384
*
/
385
indirect_array
<
_Tp
>
operator
[]
(
const
valarray
<
size_t
>
&
__i
)
;
386
387
/
/
_lib
.
valarray
.
unary_
unary
operators
:
388
/
/
/
Return
a
new
valarray
by
applying
unary
+
to
each
element
.
389
type
name
_UnaryOp
<
__unary_plus
>
:
:
_Rt
operator
+
(
)
const
;
390
391
/
/
/
Return
a
new
valarray
by
applying
unary
-
to
each
element
.
392
type
name
_UnaryOp
<
__negate
>
:
:
_Rt
operator
-
(
)
const
;
393
394
/
/
/
Return
a
new
valarray
by
applying
unary
~
to
each
element
.
395
type
name
_UnaryOp
<
__bitwise_not
>
:
:
_Rt
operator
~
(
)
const
;
396
397
/
/
/
Return
a
new
valarray
by
applying
unary
!
to
each
element
.
398
type
name
_UnaryOp
<
__logical_not
>
:
:
_Rt
operator
!
(
)
const
;
399
400
/
/
_lib
.
valarray
.
cassign_
computed
assignment
:
401
/
/
/
Multiply
each
element
of
array
by
@
a
t
.
402
valarray
<
_Tp
>
&
operator
*=
(
const
_Tp
&
)
;
403
404
/
/
/
Divide
each
element
of
array
by
@
a
t
.
405
valarray
<
_Tp
>
&
operator
/=
(
const
_Tp
&
)
;
406
407
/
/
/
Set
each
element
e
of
array
to
e
%
@
a
t
.
408
valarray
<
_Tp
>
&
operator
%=
(
const
_Tp
&
)
;
409
410
/
/
/
Add
@
a
t
to
each
element
of
array
.
411
valarray
<
_Tp
>
&
operator
+=
(
const
_Tp
&
)
;
412
413
/
/
/
Subtract
@
a
t
to
each
element
of
array
.
414
valarray
<
_Tp
>
&
operator
-=
(
const
_Tp
&
)
;
415
416
/
/
/
Set
each
element
e
of
array
to
e
^
@
a
t
.
417
valarray
<
_Tp
>
&
operator
^=
(
const
_Tp
&
)
;
418
419
/
/
/
Set
each
element
e
of
array
to
e
&
@
a
t
.
420
valarray
<
_Tp
>
&
operator
&=
(
const
_Tp
&
)
;
421
422
/
/
/
Set
each
element
e
of
array
to
e
|
@
a
t
.
423
valarray
<
_Tp
>
&
operator
|=
(
const
_Tp
&
)
;
424
425
/
/
/
Left
shift
each
element
e
of
array
by
@
a
t
bits
.
426
valarray
<
_Tp
>
&
operator
<<=
(
const
_Tp
&
)
;
427
428
/
/
/
Right
shift
each
element
e
of
array
by
@
a
t
bits
.
429
valarray
<
_Tp
>
&
operator
>>=
(
const
_Tp
&
)
;
430
431
/
/
/
Multiply
elements
of
array
by
corresponding
elements
of
@
a
v
.
432
valarray
<
_Tp
>
&
operator
*=
(
const
valarray
<
_Tp
>
&
)
;
433
434
/
/
/
Divide
elements
of
array
by
corresponding
elements
of
@
a
v
.
435
valarray
<
_Tp
>
&
operator
/=
(
const
valarray
<
_Tp
>
&
)
;
436
437
/
/
/
Modulo
elements
of
array
by
corresponding
elements
of
@
a
v
.
438
valarray
<
_Tp
>
&
operator
%=
(
const
valarray
<
_Tp
>
&
)
;
439
440
/
/
/
Add
corresponding
elements
of
@
a
v
to
elements
of
array
.
441
valarray
<
_Tp
>
&
operator
+=
(
const
valarray
<
_Tp
>
&
)
;
442
443
/
/
/
Subtract
corresponding
elements
of
@
a
v
from
elements
of
array
.
444
valarray
<
_Tp
>
&
operator
-=
(
const
valarray
<
_Tp
>
&
)
;
445
446
/
/
/
Logical
xor
corresponding
elements
of
@
a
v
with
elements
of
array
.
447
valarray
<
_Tp
>
&
operator
^=
(
const
valarray
<
_Tp
>
&
)
;
448
449
/
/
/
Logical
or
corresponding
elements
of
@
a
v
with
elements
of
array
.
450
valarray
<
_Tp
>
&
operator
|=
(
const
valarray
<
_Tp
>
&
)
;
451
452
/
/
/
Logical
and
corresponding
elements
of
@
a
v
with
elements
of
array
.
453
valarray
<
_Tp
>
&
operator
&=
(
const
valarray
<
_Tp
>
&
)
;
454
455
/
/
/
Left
shift
elements
of
array
by
corresponding
elements
of
@
a
v
.
456
valarray
<
_Tp
>
&
operator
<<=
(
const
valarray
<
_Tp
>
&
)
;
457
458
/
/
/
Right
shift
elements
of
array
by
corresponding
elements
of
@
a
v
.
459
valarray
<
_Tp
>
&
operator
>>=
(
const
valarray
<
_Tp
>
&
)
;
460
461
template
<
class
_Dom
>
462
valarray
<
_Tp
>
&
operator
*=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
463
template
<
class
_Dom
>
464
valarray
<
_Tp
>
&
operator
/=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
465
template
<
class
_Dom
>
466
valarray
<
_Tp
>
&
operator
%=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
467
template
<
class
_Dom
>
468
valarray
<
_Tp
>
&
operator
+=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
469
template
<
class
_Dom
>
470
valarray
<
_Tp
>
&
operator
-=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
471
template
<
class
_Dom
>
472
valarray
<
_Tp
>
&
operator
^=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
473
template
<
class
_Dom
>
474
valarray
<
_Tp
>
&
operator
|=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
475
template
<
class
_Dom
>
476
valarray
<
_Tp
>
&
operator
&=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
477
template
<
class
_Dom
>
478
valarray
<
_Tp
>
&
operator
<<=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
479
template
<
class
_Dom
>
480
valarray
<
_Tp
>
&
operator
>>=
(
const
_Expr
<
_Dom
,
_Tp
>
&
)
;
481
482
/
/
_lib
.
valarray
.
members_
member
functions
:
483
#if __cplusplus >= 201103L
484
/
/
/
Swap
.
485
void
swap
(
valarray
<
_Tp
>
&
__v
)
noexcept
;
486
#endif
487
488
/
/
/
Return
the
number
of
elements
in
array
.
489
size_t
size
(
)
const
;
490
491
/
*
*
492
*
@
brief
Return
the
sum
of
all
elements
in
the
array
.
493
*
494
*
Accumulates
the
sum
of
all
elements
into
a
Tp
using
+=
.
The
order
495
*
of
adding
the
elements
is
unspecified
.
496
*
/
497
_Tp
sum
(
)
const
;
498
499
/
/
/
Return
the
minimum
element
using
operator
<
(
)
.
500
_Tp
min
(
)
const
;
501
502
/
/
/
Return
the
maximum
element
using
operator
<
(
)
.
503
_Tp
max
(
)
const
;
504
505
/
*
*
506
*
@
brief
Return
a
shifted
array
.
507
*
508
*
A
new
valarray
is
constructed
as
a
copy
of
this
array
with
elements
509
*
in
shifted
positions
.
For
an
element
with
index
i
,
the
new
position
510
*
is
i
-
n
.
The
new
valarray
has
the
same
size
as
the
current
one
.
511
*
New
elements
without
a
value
are
set
to
0
.
Elements
whose
new
512
*
position
is
outside
the
bounds
of
the
array
are
discarded
.
513
*
514
*
Positive
arguments
shift
toward
index
0
,
discarding
elements
[
0
,
n
)
.
515
*
Negative
arguments
discard
elements
from
the
top
of
the
array
.
516
*
517
*
@
param
__n
Number
of
element
positions
to
shift
.
518
*
@
return
New
valarray
with
elements
in
shifted
positions
.
519
*
/
520
valarray
<
_Tp
>
shift
(
int
__n
)
const
;
521
522
/
*
*
523
*
@
brief
Return
a
rotated
array
.
524
*
525
*
A
new
valarray
is
constructed
as
a
copy
of
this
array
with
elements
526
*
in
shifted
positions
.
For
an
element
with
index
i
,
the
new
position
527
*
is
(
i
-
n
)
%
size
(
)
.
The
new
valarray
has
the
same
size
as
the
528
*
current
one
.
Elements
that
are
shifted
beyond
the
array
bounds
are
529
*
shifted
into
the
other
end
of
the
array
. No elements are lost.
530
*
531
*
Positive
arguments
shift
toward
index
0
,
wrapping
around
the
top
.
532
*
Negative
arguments
shift
towards
the
top
,
wrapping
around
to
0
.
533
*
534
*
@
param
__n
Number
of
element
positions
to
rotate
.
535
*
@
return
New
valarray
with
elements
in
shifted
positions
.
536
*
/
537
valarray
<
_Tp
>
cshift
(
int
__n
)
const
;
538
539
/
*
*
540
*
@
brief
Apply
a
function
to
the
array
.
541
*
542
*
Returns
a
new
valarray
with
elements
assigned
to
the
result
of
543
*
applying
__func
to
the
corresponding
element
of
this
array
.
The
new
544
*
array
has
the
same
size
as
this
one
.
545
*
546
*
@
param
__func
Function
of
Tp
returning
Tp
to
apply
.
547
*
@
return
New
valarray
with
transformed
elements
.
548
*
/
549
_Expr
<
_ValFunClos
<
_ValArray
,
_Tp
>
,
_Tp
>
apply
(
_Tp
__func
(
_Tp
)
)
const
;
550
551
/
*
*
552
*
@
brief
Apply
a
function
to
the
array
.
553
*
554
*
Returns
a
new
valarray
with
elements
assigned
to
the
result
of
555
*
applying
__func
to
the
corresponding
element
of
this
array
.
The
new
556
*
array
has
the
same
size
as
this
one
.
557
*
558
*
@
param
__func
Function
of
const
Tp
&
returning
Tp
to
apply
.
559
*
@
return
New
valarray
with
transformed
elements
.
560
*
/
561
_Expr
<
_RefFunClos
<
_ValArray
,
_Tp
>
,
_Tp
>
apply
(
_Tp
__func
(
const
_Tp
&
)
)
const
;
562
563
/
*
*
564
*
@
brief
Resize
array
.
565
*
566
*
Resize
this
array
to
@
a
size
and
set
all
elements
to
@
a
c
.
All
567
*
references
and
iterators
are
invalidated
.
568
*
569
*
@
param
__size
New
array
size
.
570
*
@
param
__c
New
value
for
all
elements
.
571
*
/
572
void
resize
(
size_t
__size
,
_Tp
__c
=
_Tp
(
)
)
;
573
574
private
:
575
size_t
_M_size
;
576
_Tp
*
__restrict__
_M_data
;
577
578
friend
struct
_Array
<
_Tp
>
;
579
};
580
581
#if __cpp_deduction_guides >= 201606
582
template
<
typename
_Tp
,
size_t
_Nm
>
583
valarray
(
const
_Tp
(
&
)
[
_Nm
]
,
size_t
)
-
>
valarray
<
_Tp
>
;
584
#endif
585
586
template
<
typename
_Tp
>
587
inline
const
_Tp
&
588
valarray
<
_Tp
>
:
:
operator
[]
(
size_t
__i
)
const
_GLIBCXX_NOTHROW
589
{
590
__glibcxx_requires_subscript
(
__i
)
;
591
return
_M_data
[
__i
];
592
}
593
594
template
<
typename
_Tp
>
595
inline
_Tp
&
596
valarray
<
_Tp
>
:
:
operator
[]
(
size_t
__i
)
_GLIBCXX_NOTHROW
597
{
598
__glibcxx_requires_subscript
(
__i
)
;
599
return
_M_data
[
__i
];
600
}
601
602
/
/
/
@}
group
numeric_arrays
603
604
_GLIBCXX_END_NAMESPACE_VERSION
605
}
/
/
namespace
606
607
#include <bits/valarray_after.h>
608
#include <bits/slice_array.h>
609
#include <bits/gslice.h>
610
#include <bits/gslice_array.h>
611
#include <bits/mask_array.h>
612
#include <bits/indirect_array.h>
613
614
namespace
std
_GLIBCXX_VISIBILITY
(
default
)
615
{
616
_GLIBCXX_BEGIN_NAMESPACE_VERSION
617
618
/
*
*
619
*
@
addtogroup
numeric_arrays
620
*
@{
621
*
/
622
623
template
<
typename
_Tp
>
624
inline
625
valarray
<
_Tp
>
:
:
valarray
(
)
_GLIBCXX_NOTHROW
:
_M_size
(
0
)
,
_M_data
(
0
)
{}
626
627
template
<
typename
_Tp
>
628
inline
629
valarray
<
_Tp
>
:
:
valarray
(
size_t
__n
)
630
:
_M_size
(
__n
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__n
)
)
631
{
std
:
:
__valarray_default_construct
(
_M_data
,
_M_data
+
__n
)
; }
632
633
template
<
typename
_Tp
>
634
inline
635
valarray
<
_Tp
>
:
:
valarray
(
const
_Tp
&
__t
,
size_t
__n
)
636
:
_M_size
(
__n
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__n
)
)
637
{
std
:
:
__valarray_fill_construct
(
_M_data
,
_M_data
+
__n
,
__t
)
; }
638
639
template
<
typename
_Tp
>
640
inline
641
valarray
<
_Tp
>
:
:
valarray
(
const
_Tp
*
__restrict__
__p
,
size_t
__n
)
642
:
_M_size
(
__n
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__n
)
)
643
{
644
__glibcxx_assert
(
__p
!=
0
||
__n
==
0
)
;
645
std
:
:
__valarray_copy_construct
(
__p
,
__p
+
__n
,
_M_data
)
;
646
}
647
648
template
<
typename
_Tp
>
649
inline
650
valarray
<
_Tp
>
:
:
valarray
(
const
valarray
<
_Tp
>
&
__v
)
651
:
_M_size
(
__v
.
_M_size
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__v
.
_M_size
)
)
652
{
std
:
:
__valarray_copy_construct
(
__v
.
_M_data
,
__v
.
_M_data
+
_M_size
,
653
_M_data
)
; }
654
655
#if __cplusplus >= 201103L
656
template
<
typename
_Tp
>
657
inline
658
valarray
<
_Tp
>
:
:
valarray
(
valarray
<
_Tp
>
&&
__v
)
noexcept
659
:
_M_size
(
__v
.
_M_size
)
,
_M_data
(
__v
.
_M_data
)
660
{
661
__v
.
_M_size
=
0
;
662
__v
.
_M_data
=
0
;
663
}
664
#endif
665
666
template
<
typename
_Tp
>
667
inline
668
valarray
<
_Tp
>
:
:
valarray
(
const
slice_array
<
_Tp
>
&
__sa
)
669
:
_M_size
(
__sa
.
_M_sz
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__sa
.
_M_sz
)
)
670
{
671
std
:
:
__valarray_copy_construct
672
(
__sa
.
_M_array
,
__sa
.
_M_sz
,
__sa
.
_M_stride
,
_Array
<
_Tp
>
(
_M_data
)
)
;
673
}
674
675
template
<
typename
_Tp
>
676
inline
677
valarray
<
_Tp
>
:
:
valarray
(
const
gslice_array
<
_Tp
>
&
__ga
)
678
:
_M_size
(
__ga
.
_M_index
.
size
(
)
)
,
679
_M_data
(
__valarray_get_storage
<
_Tp
>
(
_M_size
)
)
680
{
681
std
:
:
__valarray_copy_construct
682
(
__ga
.
_M_array
,
_Array
<
size_t
>
(
__ga
.
_M_index
)
,
683
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
684
}
685
686
template
<
typename
_Tp
>
687
inline
688
valarray
<
_Tp
>
:
:
valarray
(
const
mask_array
<
_Tp
>
&
__ma
)
689
:
_M_size
(
__ma
.
_M_sz
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__ma
.
_M_sz
)
)
690
{
691
std
:
:
__valarray_copy_construct
692
(
__ma
.
_M_array
,
__ma
.
_M_mask
,
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
693
}
694
695
template
<
typename
_Tp
>
696
inline
697
valarray
<
_Tp
>
:
:
valarray
(
const
indirect_array
<
_Tp
>
&
__ia
)
698
:
_M_size
(
__ia
.
_M_sz
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__ia
.
_M_sz
)
)
699
{
700
std
:
:
__valarray_copy_construct
701
(
__ia
.
_M_array
,
__ia
.
_M_index
,
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
702
}
703
704
#if __cplusplus >= 201103L
705
template
<
typename
_Tp
>
706
inline
707
valarray
<
_Tp
>
:
:
valarray
(
initializer_list
<
_Tp
>
__l
)
708
:
_M_size
(
__l
.
size
(
)
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
__l
.
size
(
)
)
)
709
{
std
:
:
__valarray_copy_construct
(
__l
.
begin
(
)
,
__l
.
end
(), _M_data); }
710
#endif
711
712
template
<
typename
_Tp
>
template
<
class
_Dom
>
713
inline
714
valarray
<
_Tp
>
:
:
valarray
(
const
_Expr
<
_Dom
,
_Tp
>
&
__e
)
715
:
_M_size
(
__e
.
size
(
)
)
,
_M_data
(
__valarray_get_storage
<
_Tp
>
(
_M_size
)
)
716
{
std
:
:
__valarray_copy_construct
(
__e
,
_M_size
,
_Array
<
_Tp
>
(
_M_data
)
)
; }
717
718
template
<
typename
_Tp
>
719
inline
720
valarray
<
_Tp
>
:
:
~
valarray
(
)
_GLIBCXX_NOEXCEPT
721
{
722
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
723
std
:
:
__valarray_release_memory
(
_M_data
)
;
724
}
725
726
template
<
typename
_Tp
>
727
inline
valarray
<
_Tp
>
&
728
valarray
<
_Tp
>
:
:
operator
=
(
const
valarray
<
_Tp
>
&
__v
)
729
{
730
/
/
_GLIBCXX_RESOLVE_LIB_DEFECTS
731
/
/
630
.
arrays
of
valarray
.
732
if
(
_M_size
==
__v
.
_M_size
)
733
std
:
:
__valarray_copy
(
__v
.
_M_data
,
_M_size
,
_M_data
)
;
734
else
735
{
736
if
(
_M_data
)
737
{
738
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
739
std
:
:
__valarray_release_memory
(
_M_data
)
;
740
}
741
_M_size
=
__v
.
_M_size
;
742
_M_data
=
__valarray_get_storage
<
_Tp
>
(
_M_size
)
;
743
std
:
:
__valarray_copy_construct
(
__v
.
_M_data
,
__v
.
_M_data
+
_M_size
,
744
_M_data
)
;
745
}
746
return
*
this
;
747
}
748
749
#if __cplusplus >= 201103L
750
template
<
typename
_Tp
>
751
inline
valarray
<
_Tp
>
&
752
valarray
<
_Tp
>
:
:
operator
=
(
valarray
<
_Tp
>
&&
__v
)
noexcept
753
{
754
if
(
_M_data
)
755
{
756
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
757
std
:
:
__valarray_release_memory
(
_M_data
)
;
758
}
759
_M_size
=
__v
.
_M_size
;
760
_M_data
=
__v
.
_M_data
;
761
__v
.
_M_size
=
0
;
762
__v
.
_M_data
=
0
;
763
return
*
this
;
764
}
765
766
template
<
typename
_Tp
>
767
inline
valarray
<
_Tp
>
&
768
valarray
<
_Tp
>
:
:
operator
=
(
initializer_list
<
_Tp
>
__l
)
769
{
770
/
/
_GLIBCXX_RESOLVE_LIB_DEFECTS
771
/
/
630
.
arrays
of
valarray
.
772
if
(
_M_size
==
__l
.
size
(
)
)
773
std
:
:
__valarray_copy
(
__l
.
begin
(
)
,
__l
.
size
(
)
,
_M_data
)
;
774
else
775
{
776
if
(
_M_data
)
777
{
778
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
779
std
:
:
__valarray_release_memory
(
_M_data
)
;
780
}
781
_M_size
=
__l
.
size
(
)
;
782
_M_data
=
__valarray_get_storage
<
_Tp
>
(
_M_size
)
;
783
std
:
:
__valarray_copy_construct
(
__l
.
begin
(
)
,
__l
.
begin
(
)
+
_M_size
,
784
_M_data
)
;
785
}
786
return
*
this
;
787
}
788
#endif
789
790
template
<
typename
_Tp
>
791
inline
valarray
<
_Tp
>
&
792
valarray
<
_Tp
>
:
:
operator
=
(
const
_Tp
&
__t
)
793
{
794
std
:
:
__valarray_fill
(
_M_data
,
_M_size
,
__t
)
;
795
return
*
this
;
796
}
797
798
template
<
typename
_Tp
>
799
inline
valarray
<
_Tp
>
&
800
valarray
<
_Tp
>
:
:
operator
=
(
const
slice_array
<
_Tp
>
&
__sa
)
801
{
802
__glibcxx_assert
(
_M_size
==
__sa
.
_M_sz
)
;
803
std
:
:
__valarray_copy
(
__sa
.
_M_array
,
__sa
.
_M_sz
,
804
__sa
.
_M_stride
,
_Array
<
_Tp
>
(
_M_data
)
)
;
805
return
*
this
;
806
}
807
808
template
<
typename
_Tp
>
809
inline
valarray
<
_Tp
>
&
810
valarray
<
_Tp
>
:
:
operator
=
(
const
gslice_array
<
_Tp
>
&
__ga
)
811
{
812
__glibcxx_assert
(
_M_size
==
__ga
.
_M_index
.
size
(
)
)
;
813
std
:
:
__valarray_copy
(
__ga
.
_M_array
,
_Array
<
size_t
>
(
__ga
.
_M_index
)
,
814
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
815
return
*
this
;
816
}
817
818
template
<
typename
_Tp
>
819
inline
valarray
<
_Tp
>
&
820
valarray
<
_Tp
>
:
:
operator
=
(
const
mask_array
<
_Tp
>
&
__ma
)
821
{
822
__glibcxx_assert
(
_M_size
==
__ma
.
_M_sz
)
;
823
std
:
:
__valarray_copy
(
__ma
.
_M_array
,
__ma
.
_M_mask
,
824
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
825
return
*
this
;
826
}
827
828
template
<
typename
_Tp
>
829
inline
valarray
<
_Tp
>
&
830
valarray
<
_Tp
>
:
:
operator
=
(
const
indirect_array
<
_Tp
>
&
__ia
)
831
{
832
__glibcxx_assert
(
_M_size
==
__ia
.
_M_sz
)
;
833
std
:
:
__valarray_copy
(
__ia
.
_M_array
,
__ia
.
_M_index
,
834
_Array
<
_Tp
>
(
_M_data
)
,
_M_size
)
;
835
return
*
this
;
836
}
837
838
template
<
typename
_Tp
>
template
<
class
_Dom
>
839
inline
valarray
<
_Tp
>
&
840
valarray
<
_Tp
>
:
:
operator
=
(
const
_Expr
<
_Dom
,
_Tp
>
&
__e
)
841
{
842
/
/
_GLIBCXX_RESOLVE_LIB_DEFECTS
843
/
/
630
.
arrays
of
valarray
.
844
if
(
_M_size
==
__e
.
size
(
)
)
845
{
846
/
/
Copy
manually
instead
of
using
__valarray_copy
,
because
__e
might
847
/
/
alias
_M_data
and
the
_Array
param
type
of
__valarray_copy
uses
848
/
/
restrict
which
doesn
'
t
allow
aliasing
.
849
for
(
size_t
__i
=
0
;
__i
<
_M_size
;
+
+
__i
)
850
_M_data
[
__i
]
=
__e
[
__i
];
851
}
852
else
853
{
854
if
(
_M_data
)
855
{
856
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
857
std
:
:
__valarray_release_memory
(
_M_data
)
;
858
}
859
_M_size
=
__e
.
size
(
)
;
860
_M_data
=
__valarray_get_storage
<
_Tp
>
(
_M_size
)
;
861
std
:
:
__valarray_copy_construct
(
__e
,
_M_size
,
_Array
<
_Tp
>
(
_M_data
)
)
;
862
}
863
return
*
this
;
864
}
865
866
template
<
typename
_Tp
>
867
inline
_Expr
<
_SClos
<
_ValArray
,
_Tp
>
,
_Tp
>
868
valarray
<
_Tp
>
:
:
operator
[]
(
slice
__s
)
const
869
{
870
type
def
_SClos
<
_ValArray
,
_Tp
>
_Closure
;
871
return
_Expr
<
_Closure
,
_Tp
>
(
_Closure
(
_Array
<
_Tp
>
(
_M_data
)
,
__s
)
)
;
872
}
873
874
template
<
typename
_Tp
>
875
inline
slice_array
<
_Tp
>
876
valarray
<
_Tp
>
:
:
operator
[]
(
slice
__s
)
877
{
return
slice_array
<
_Tp
>
(
_Array
<
_Tp
>
(
_M_data
)
,
__s
)
; }
878
879
template
<
typename
_Tp
>
880
inline
_Expr
<
_GClos
<
_ValArray
,
_Tp
>
,
_Tp
>
881
valarray
<
_Tp
>
:
:
operator
[]
(
const
gslice
&
__gs
)
const
882
{
883
type
def
_GClos
<
_ValArray
,
_Tp
>
_Closure
;
884
return
_Expr
<
_Closure
,
_Tp
>
885
(
_Closure
(
_Array
<
_Tp
>
(
_M_data
)
,
__gs
.
_M_index
-
>
_M_index
)
)
;
886
}
887
888
template
<
typename
_Tp
>
889
inline
gslice_array
<
_Tp
>
890
valarray
<
_Tp
>
:
:
operator
[]
(
const
gslice
&
__gs
)
891
{
892
return
gslice_array
<
_Tp
>
893
(
_Array
<
_Tp
>
(
_M_data
)
,
__gs
.
_M_index
-
>
_M_index
)
;
894
}
895
896
template
<
typename
_Tp
>
897
inline
valarray
<
_Tp
>
898
valarray
<
_Tp
>
:
:
operator
[]
(
const
valarray
<
bool
>
&
__m
)
const
899
{
900
size_t
__s
=
0
;
901
size_t
__e
=
__m
.
size
(
)
;
902
for
(
size_t
__i
=
0
;
__i
<
__e
;
+
+
__i
)
903
if
(
__m
[
__i
]
)
+
+
__s
;
904
__glibcxx_assert
(
__s
<=
_M_size
)
;
905
return
valarray
<
_Tp
>
(
mask_array
<
_Tp
>
(
_Array
<
_Tp
>
(
_M_data
)
,
__s
,
906
_Array
<
bool
>
(
__m
)
)
)
;
907
}
908
909
template
<
typename
_Tp
>
910
inline
mask_array
<
_Tp
>
911
valarray
<
_Tp
>
:
:
operator
[]
(
const
valarray
<
bool
>
&
__m
)
912
{
913
size_t
__s
=
0
;
914
size_t
__e
=
__m
.
size
(
)
;
915
for
(
size_t
__i
=
0
;
__i
<
__e
;
+
+
__i
)
916
if
(
__m
[
__i
]
)
+
+
__s
;
917
__glibcxx_assert
(
__s
<=
_M_size
)
;
918
return
mask_array
<
_Tp
>
(
_Array
<
_Tp
>
(
_M_data
)
,
__s
,
_Array
<
bool
>
(
__m
)
)
;
919
}
920
921
template
<
typename
_Tp
>
922
inline
_Expr
<
_IClos
<
_ValArray
,
_Tp
>
,
_Tp
>
923
valarray
<
_Tp
>
:
:
operator
[]
(
const
valarray
<
size_t
>
&
__i
)
const
924
{
925
type
def
_IClos
<
_ValArray
,
_Tp
>
_Closure
;
926
return
_Expr
<
_Closure
,
_Tp
>
(
_Closure
(
*
this
,
__i
)
)
;
927
}
928
929
template
<
typename
_Tp
>
930
inline
indirect_array
<
_Tp
>
931
valarray
<
_Tp
>
:
:
operator
[]
(
const
valarray
<
size_t
>
&
__i
)
932
{
933
return
indirect_array
<
_Tp
>
(
_Array
<
_Tp
>
(
_M_data
)
,
__i
.
size
(
)
,
934
_Array
<
size_t
>
(
__i
)
)
;
935
}
936
937
#if __cplusplus >= 201103L
938
template
<
class
_Tp
>
939
inline
void
940
valarray
<
_Tp
>
:
:
swap
(
valarray
<
_Tp
>
&
__v
)
noexcept
941
{
942
std
:
:
swap
(
_M_size
,
__v
.
_M_size
)
;
943
std
:
:
swap
(
_M_data
,
__v
.
_M_data
)
;
944
}
945
#endif
946
947
template
<
class
_Tp
>
948
inline
size_t
949
valarray
<
_Tp
>
:
:
size
(
)
const
950
{
return
_M_size
; }
951
952
template
<
class
_Tp
>
953
inline
_Tp
954
valarray
<
_Tp
>
:
:
sum
(
)
const
955
{
956
__glibcxx_assert
(
_M_size
>
0
)
;
957
return
std
:
:
__valarray_sum
(
_M_data
,
_M_data
+
_M_size
)
;
958
}
959
960
template
<
class
_Tp
>
961
inline
valarray
<
_Tp
>
962
valarray
<
_Tp
>
:
:
shift
(
int
__n
)
const
963
{
964
valarray
<
_Tp
>
__ret
;
965
966
if
(
_M_size
==
0
)
967
return
__ret
;
968
969
_Tp
*
__restrict__
__tmp_M_data
=
970
std
:
:
__valarray_get_storage
<
_Tp
>
(
_M_size
)
;
971
972
if
(
__n
==
0
)
973
std
:
:
__valarray_copy_construct
(
_M_data
,
974
_M_data
+
_M_size
,
__tmp_M_data
)
;
975
else
if
(
__n
>
0
)
/
/
shift
left
976
{
977
if
(
size_t
(
__n
)
>
_M_size
)
978
__n
=
int
(
_M_size
)
;
979
980
std
:
:
__valarray_copy_construct
(
_M_data
+
__n
,
981
_M_data
+
_M_size
,
__tmp_M_data
)
;
982
std
:
:
__valarray_default_construct
(
__tmp_M_data
+
_M_size
-
__n
,
983
__tmp_M_data
+
_M_size
)
;
984
}
985
else
/
/
shift
right
986
{
987
if
(
-
size_t
(
__n
)
>
_M_size
)
988
__n
=
-
int
(
_M_size
)
;
989
990
std
:
:
__valarray_copy_construct
(
_M_data
,
_M_data
+
_M_size
+
__n
,
991
__tmp_M_data
-
__n
)
;
992
std
:
:
__valarray_default_construct
(
__tmp_M_data
,
993
__tmp_M_data
-
__n
)
;
994
}
995
996
__ret
.
_M_size
=
_M_size
;
997
__ret
.
_M_data
=
__tmp_M_data
;
998
return
__ret
;
999
}
1000
1001
template
<
class
_Tp
>
1002
inline
valarray
<
_Tp
>
1003
valarray
<
_Tp
>
:
:
cshift
(
int
__n
)
const
1004
{
1005
valarray
<
_Tp
>
__ret
;
1006
1007
if
(
_M_size
==
0
)
1008
return
__ret
;
1009
1010
_Tp
*
__restrict__
__tmp_M_data
=
1011
std
:
:
__valarray_get_storage
<
_Tp
>
(
_M_size
)
;
1012
1013
if
(
__n
==
0
)
1014
std
:
:
__valarray_copy_construct
(
_M_data
,
1015
_M_data
+
_M_size
,
__tmp_M_data
)
;
1016
else
if
(
__n
>
0
)
/
/
cshift
left
1017
{
1018
if
(
size_t
(
__n
)
>
_M_size
)
1019
__n
=
int
(
__n
%
_M_size
)
;
1020
1021
std
:
:
__valarray_copy_construct
(
_M_data
,
_M_data
+
__n
,
1022
__tmp_M_data
+
_M_size
-
__n
)
;
1023
std
:
:
__valarray_copy_construct
(
_M_data
+
__n
,
_M_data
+
_M_size
,
1024
__tmp_M_data
)
;
1025
}
1026
else
/
/
cshift
right
1027
{
1028
if
(
-
size_t
(
__n
)
>
_M_size
)
1029
__n
=
-
int
(
-
size_t
(
__n
)
%
_M_size
)
;
1030
1031
std
:
:
__valarray_copy_construct
(
_M_data
+
_M_size
+
__n
,
1032
_M_data
+
_M_size
,
__tmp_M_data
)
;
1033
std
:
:
__valarray_copy_construct
(
_M_data
,
_M_data
+
_M_size
+
__n
,
1034
__tmp_M_data
-
__n
)
;
1035
}
1036
1037
__ret
.
_M_size
=
_M_size
;
1038
__ret
.
_M_data
=
__tmp_M_data
;
1039
return
__ret
;
1040
}
1041
1042
template
<
class
_Tp
>
1043
inline
void
1044
valarray
<
_Tp
>
:
:
resize
(
size_t
__n
,
_Tp
__c
)
1045
{
1046
/
/
This
complication
is
so
to
make
valarray
<
valarray
<
T
>
>
work
1047
/
/
even
though
it
is
not
required
by
the
standard
.
Nobody
should
1048
/
/
be
saying
valarray
<
valarray
<
T
>
>
anyway
.
See
the
specs
.
1049
std
:
:
__valarray_destroy_elements
(
_M_data
,
_M_data
+
_M_size
)
;
1050
if
(
_M_size
!=
__n
)
1051
{
1052
std
:
:
__valarray_release_memory
(
_M_data
)
;
1053
_M_size
=
__n
;
1054
_M_data
=
__valarray_get_storage
<
_Tp
>
(
__n
)
;
1055
}
1056
std
:
:
__valarray_fill_construct
(
_M_data
,
_M_data
+
__n
,
__c
)
;
1057
}
1058
1059
template
<
typename
_Tp
>
1060
inline
_Tp
1061
valarray
<
_Tp
>
:
:
min
(
)
const
1062
{
1063
__glibcxx_assert
(
_M_size
>
0
)
;
1064
return
*
std
:
:
min_element
(
_M_data
,
_M_data
+
_M_size
)
;
1065
}
1066
1067
template
<
typename
_Tp
>
1068
inline
_Tp
1069
valarray
<
_Tp
>
:
:
max
(
)
const
1070
{
1071
__glibcxx_assert
(
_M_size
>
0
)
;
1072
return
*
std
:
:
max_element
(
_M_data
,
_M_data
+
_M_size
)
;
1073
}
1074
1075
template
<
class
_Tp
>
1076
inline
_Expr
<
_ValFunClos
<
_ValArray
,
_Tp
>
,
_Tp
>
1077
valarray
<
_Tp
>
:
:
apply
(
_Tp
__func
(
_Tp
)
)
const
1078
{
1079
type
def
_ValFunClos
<
_ValArray
,
_Tp
>
_Closure
;
1080
return
_Expr
<
_Closure
,
_Tp
>
(
_Closure
(
*
this
,
__func
)
)
;
1081
}
1082
1083
template
<
class
_Tp
>
1084
inline
_Expr
<
_RefFunClos
<
_ValArray
,
_Tp
>
,
_Tp
>
1085
valarray
<
_Tp
>
:
:
apply
(
_Tp
__func
(
const
_Tp
&
)
)
const
1086
{
1087
type
def
_RefFunClos
<
_ValArray
,
_Tp
>
_Closure
;
1088
return
_Expr
<
_Closure
,
_Tp
>
(
_Closure
(
*
this
,
__func
)
)
;
1089
}
1090
1091
/
/
/
@
cond
undocumented
1092
#define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \
1093
template
<
typename
_Tp
>
\
1094
inline
typename
valarray
<
_Tp
>
:
:
template
_UnaryOp
<
_Name
>
:
:
_Rt
\
1095
valarray
<
_Tp
>
:
:
operator
_Op
(
)
const
\
1096
{ \
1097
type
def
_UnClos
<
_Name
,
_ValArray
,
_Tp
>
_Closure
; \
1098
type
def
typename
__fun
<
_Name
,
_Tp
>
:
:
result_type
_Rt
; \
1099
return
_Expr
<
_Closure
,
_Rt
>
(
_Closure
(
*
this
)
)
; \
1100
}
1101
1102
_DEFINE_VALARRAY_UNARY_OPERATOR
(
+
,
__unary_plus
)
1103
_DEFINE_VALARRAY_UNARY_OPERATOR
(
-
,
__negate
)
1104
_DEFINE_VALARRAY_UNARY_OPERATOR
(
~
,
__bitwise_not
)
1105
_DEFINE_VALARRAY_UNARY_OPERATOR
(
!
,
__logical_not
)
1106
1107
#undef _DEFINE_VALARRAY_UNARY_OPERATOR
1108
1109
#define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \
1110
template
<
class
_Tp
>
\
1111
inline
valarray
<
_Tp
>
&
\
1112
valarray
<
_Tp
>
:
:
operator
_Op
##=(const _Tp &__t) \
1113
{ \
1114
_Array_augmented_
##_Name(_Array<_Tp>(_M_data), _M_size, __t); \
1115
return
*
this
; \
1116
} \
1117
\
1118
template
<
class
_Tp
>
\
1119
inline
valarray
<
_Tp
>
&
\
1120
valarray
<
_Tp
>
:
:
operator
_Op
##=(const valarray<_Tp> &__v) \
1121
{ \
1122
__glibcxx_assert
(
_M_size
==
__v
.
_M_size
)
; \
1123
_Array_augmented_
##_Name(_Array<_Tp>(_M_data), _M_size, \
1124
_Array
<
_Tp
>
(
__v
.
_M_data
)
)
; \
1125
return
*
this
; \
1126
}
1127
1128
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
+
,
__plus
)
1129
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
-
,
__minus
)
1130
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
*
,
__multiplies
)
1131
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
/
,
__divides
)
1132
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
%
,
__modulus
)
1133
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
^
,
__bitwise_xor
)
1134
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
&
,
__bitwise_and
)
1135
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
|
,
__bitwise_or
)
1136
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
<<
,
__shift_left
)
1137
_DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
(
>>
,
__shift_right
)
1138
1139
#undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
1140
1141
#define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \
1142
template
<
class
_Tp
>
template
<
class
_Dom
>
\
1143
inline
valarray
<
_Tp
>
&
\
1144
valarray
<
_Tp
>
:
:
operator
_Op
##=(const _Expr<_Dom, _Tp>& __e) \
1145
{ \
1146
_Array_augmented_
##_Name(_Array<_Tp>(_M_data), __e, _M_size); \
1147
return
*
this
; \
1148
}
1149
1150
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
+
,
__plus
)
1151
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
-
,
__minus
)
1152
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
*
,
__multiplies
)
1153
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
/
,
__divides
)
1154
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
%
,
__modulus
)
1155
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
^
,
__bitwise_xor
)
1156
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
&
,
__bitwise_and
)
1157
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
|
,
__bitwise_or
)
1158
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
<<
,
__shift_left
)
1159
_DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
(
>>
,
__shift_right
)
1160
1161
#undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
1162
1163
1164
#define _DEFINE_BINARY_OPERATOR(_Op, _Name) \
1165
template
<
typename
_Tp
>
\
1166
inline
_Expr
<
_BinClos
<
_Name
,
_ValArray
,
_ValArray
,
_Tp
,
_Tp
>
,
\
1167
type
name
__fun
<
_Name
,
_Tp
>
:
:
result_type
>
\
1168
operator
_Op
(
const
valarray
<
_Tp
>
&
__v
,
const
valarray
<
_Tp
>
&
__w
)
\
1169
{ \
1170
__glibcxx_assert
(
__v
.
size
(
)
==
__w
.
size
(
)
)
; \
1171
type
def
_BinClos
<
_Name
,
_ValArray
,
_ValArray
,
_Tp
,
_Tp
>
_Closure
; \
1172
type
def
typename
__fun
<
_Name
,
_Tp
>
:
:
result_type
_Rt
; \
1173
return
_Expr
<
_Closure
,
_Rt
>
(
_Closure
(
__v
,
__w
)
)
; \
1174
} \
1175
\
1176
template
<
typename
_Tp
>
\
1177
inline
_Expr
<
_BinClos
<
_Name
,
_ValArray
,
_Constant
,
_Tp
,
_Tp
>
,
\
1178
type
name
__fun
<
_Name
,
_Tp
>
:
:
result_type
>
\
1179
operator
_Op
(
const
valarray
<
_Tp
>
&
__v
,
\
1180
const
typename
valarray
<
_Tp
>
:
:
value_type
&
__t
)
\
1181
{ \
1182
type
def
_BinClos
<
_Name
,
_ValArray
,
_Constant
,
_Tp
,
_Tp
>
_Closure
; \
1183
type
def
typename
__fun
<
_Name
,
_Tp
>
:
:
result_type
_Rt
; \
1184
return
_Expr
<
_Closure
,
_Rt
>
(
_Closure
(
__v
,
__t
)
)
; \
1185
} \
1186
\
1187
template
<
typename
_Tp
>
\
1188
inline
_Expr
<
_BinClos
<
_Name
,
_Constant
,
_ValArray
,
_Tp
,
_Tp
>
,
\
1189
type
name
__fun
<
_Name
,
_Tp
>
:
:
result_type
>
\
1190
operator
_Op
(
const
typename
valarray
<
_Tp
>
:
:
value_type
&
__t
,
\
1191
const
valarray
<
_Tp
>
&
__v
)
\
1192
{ \
1193
type
def
_BinClos
<
_Name
,
_Constant
,
_ValArray
,
_Tp
,
_Tp
>
_Closure
; \
1194
type
def
typename
__fun
<
_Name
,
_Tp
>
:
:
result_type
_Rt
; \
1195
return
_Expr
<
_Closure
,
_Rt
>
(
_Closure
(
__t
,
__v
)
)
; \
1196
}
1197
1198
_DEFINE_BINARY_OPERATOR
(
+
,
__plus
)
1199
_DEFINE_BINARY_OPERATOR
(
-
,
__minus
)
1200
_DEFINE_BINARY_OPERATOR
(
*
,
__multiplies
)
1201
_DEFINE_BINARY_OPERATOR
(
/
,
__divides
)
1202
_DEFINE_BINARY_OPERATOR
(
%
,
__modulus
)
1203
_DEFINE_BINARY_OPERATOR
(
^
,
__bitwise_xor
)
1204
_DEFINE_BINARY_OPERATOR
(
&
,
__bitwise_and
)
1205
_DEFINE_BINARY_OPERATOR
(
|
,
__bitwise_or
)
1206
_DEFINE_BINARY_OPERATOR
(
<<
,
__shift_left
)
1207
_DEFINE_BINARY_OPERATOR
(
>>
,
__shift_right
)
1208
_DEFINE_BINARY_OPERATOR
(
&&
,
__logical_and
)
1209
_DEFINE_BINARY_OPERATOR
(
||
,
__logical_or
)
1210
_DEFINE_BINARY_OPERATOR
(
==
,
__equal_to
)
1211
_DEFINE_BINARY_OPERATOR
(
!=
,
__not_equal_to
)
1212
_DEFINE_BINARY_OPERATOR
(
<
,
__less
)
1213
_DEFINE_BINARY_OPERATOR
(
>
,
__greater
)
1214
_DEFINE_BINARY_OPERATOR
(
<=
,
__less_equal
)
1215
_DEFINE_BINARY_OPERATOR
(
>=
,
__greater_equal
)
1216
1217
#undef _DEFINE_BINARY_OPERATOR
1218
/
/
/
@
endcond
1219
1220
#if __cplusplus >= 201103L
1221
/
*
*
1222
*
@
brief
Return
an
iterator
pointing
to
the
first
element
of
1223
*
the
valarray
.
1224
*
@
param
__va
valarray
.
1225
*
/
1226
template
<
class
_Tp
>
1227
[[
__nodiscard__
]]
1228
inline
_Tp
*
1229
begin
(
valarray
<
_Tp
>
&
__va
)
noexcept
1230
{
return
__va
.
size
(
)
?
std
:
:
__addressof
(
__va
[
0
]
)
:
nullptr
; }
1231
1232
/
*
*
1233
*
@
brief
Return
an
iterator
pointing
to
the
first
element
of
1234
*
the
const
valarray
.
1235
*
@
param
__va
valarray
.
1236
*
/
1237
template
<
class
_Tp
>
1238
[[
__nodiscard__
]]
1239
inline
const
_Tp
*
1240
begin
(
const
valarray
<
_Tp
>
&
__va
)
noexcept
1241
{
return
__va
.
size
(
)
?
std
:
:
__addressof
(
__va
[
0
]
)
:
nullptr
; }
1242
1243
/
*
*
1244
*
@
brief
Return
an
iterator
pointing
to
one
past
the
last
element
of
1245
*
the
valarray
.
1246
*
@
param
__va
valarray
.
1247
*
/
1248
template
<
class
_Tp
>
1249
[[
__nodiscard__
]]
1250
inline
_Tp
*
1251
end
(valarray<_Tp>& __va) noexcept
1252
{
1253
if
(
auto
__n
=
__va
.
size
(
)
)
1254
return
std
:
:
__addressof
(
__va
[
0
]
)
+
__n
;
1255
else
1256
return
nullptr
;
1257
}
1258
1259
/
*
*
1260
*
@
brief
Return
an
iterator
pointing
to
one
past
the
last
element
of
1261
*
the
const
valarray
.
1262
*
@
param
__va
valarray
.
1263
*
/
1264
template
<
class
_Tp
>
1265
[[
__nodiscard__
]]
1266
inline
const
_Tp
*
1267
end
(const valarray<_Tp>& __va) noexcept
1268
{
1269
if
(
auto
__n
=
__va
.
size
(
)
)
1270
return
std
:
:
__addressof
(
__va
[
0
]
)
+
__n
;
1271
else
1272
return
nullptr
;
1273
}
1274
#endif // C++11
1275
1276
/
/
/
@}
group
numeric_arrays
1277
1278
_GLIBCXX_END_NAMESPACE_VERSION
1279
}
/
/
namespace
1280
1281
#endif /* _GLIBCXX_VALARRAY */
valarray
Generated by
1.13.2