1*404b540aSrobert // The template and inlines for the -*- C++ -*- internal _Array helper class.
2*404b540aSrobert
3*404b540aSrobert // Copyright (C) 1997, 1998, 1999, 2003, 2005 Free Software Foundation, Inc.
4*404b540aSrobert //
5*404b540aSrobert // This file is part of the GNU ISO C++ Library. This library is free
6*404b540aSrobert // software; you can redistribute it and/or modify it under the
7*404b540aSrobert // terms of the GNU General Public License as published by the
8*404b540aSrobert // Free Software Foundation; either version 2, or (at your option)
9*404b540aSrobert // any later version.
10*404b540aSrobert
11*404b540aSrobert // This library is distributed in the hope that it will be useful,
12*404b540aSrobert // but WITHOUT ANY WARRANTY; without even the implied warranty of
13*404b540aSrobert // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14*404b540aSrobert // GNU General Public License for more details.
15*404b540aSrobert
16*404b540aSrobert // You should have received a copy of the GNU General Public License along
17*404b540aSrobert // with this library; see the file COPYING. If not, write to the Free
18*404b540aSrobert // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19*404b540aSrobert // USA.
20*404b540aSrobert
21*404b540aSrobert // As a special exception, you may use this file as part of a free software
22*404b540aSrobert // library without restriction. Specifically, if other files instantiate
23*404b540aSrobert // templates or use macros or inline functions from this file, or you compile
24*404b540aSrobert // this file and link it with other files to produce an executable, this
25*404b540aSrobert // file does not by itself cause the resulting executable to be covered by
26*404b540aSrobert // the GNU General Public License. This exception does not however
27*404b540aSrobert // invalidate any other reasons why the executable file might be covered by
28*404b540aSrobert // the GNU General Public License.
29*404b540aSrobert
30*404b540aSrobert /** @file valarray_array.tcc
31*404b540aSrobert * This is an internal header file, included by other library headers.
32*404b540aSrobert * You should not attempt to use it directly.
33*404b540aSrobert */
34*404b540aSrobert
35*404b540aSrobert // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
36*404b540aSrobert
37*404b540aSrobert #ifndef _VALARRAY_ARRAY_TCC
38*404b540aSrobert #define _VALARRAY_ARRAY_TCC 1
39*404b540aSrobert
_GLIBCXX_BEGIN_NAMESPACE(std)40*404b540aSrobert _GLIBCXX_BEGIN_NAMESPACE(std)
41*404b540aSrobert
42*404b540aSrobert template<typename _Tp>
43*404b540aSrobert void
44*404b540aSrobert __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m,
45*404b540aSrobert const _Tp& __t)
46*404b540aSrobert {
47*404b540aSrobert _Tp* __p = __a._M_data;
48*404b540aSrobert bool* __ok (__m._M_data);
49*404b540aSrobert for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p)
50*404b540aSrobert {
51*404b540aSrobert while (!*__ok)
52*404b540aSrobert {
53*404b540aSrobert ++__ok;
54*404b540aSrobert ++__p;
55*404b540aSrobert }
56*404b540aSrobert *__p = __t;
57*404b540aSrobert }
58*404b540aSrobert }
59*404b540aSrobert
60*404b540aSrobert // Copy n elements of a into consecutive elements of b. When m is
61*404b540aSrobert // false, the corresponding element of a is skipped. m must contain
62*404b540aSrobert // at least n true elements. a must contain at least n elements and
63*404b540aSrobert // enough elements to match up with m through the nth true element
64*404b540aSrobert // of m. I.e. if n is 10, m has 15 elements with 5 false followed
65*404b540aSrobert // by 10 true, a must have 15 elements.
66*404b540aSrobert template<typename _Tp>
67*404b540aSrobert void
__valarray_copy(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)68*404b540aSrobert __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b,
69*404b540aSrobert size_t __n)
70*404b540aSrobert {
71*404b540aSrobert _Tp* __p (__a._M_data);
72*404b540aSrobert bool* __ok (__m._M_data);
73*404b540aSrobert for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
74*404b540aSrobert ++__q, ++__ok, ++__p)
75*404b540aSrobert {
76*404b540aSrobert while (! *__ok)
77*404b540aSrobert {
78*404b540aSrobert ++__ok;
79*404b540aSrobert ++__p;
80*404b540aSrobert }
81*404b540aSrobert *__q = *__p;
82*404b540aSrobert }
83*404b540aSrobert }
84*404b540aSrobert
85*404b540aSrobert // Copy n consecutive elements from a into elements of b. Elements
86*404b540aSrobert // of b are skipped if the corresponding element of m is false. m
87*404b540aSrobert // must contain at least n true elements. b must have at least as
88*404b540aSrobert // many elements as the index of the nth true element of m. I.e. if
89*404b540aSrobert // m has 15 elements with 5 false followed by 10 true, b must have
90*404b540aSrobert // at least 15 elements.
91*404b540aSrobert template<typename _Tp>
92*404b540aSrobert void
__valarray_copy(_Array<_Tp> __a,size_t __n,_Array<_Tp> __b,_Array<bool> __m)93*404b540aSrobert __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
94*404b540aSrobert _Array<bool> __m)
95*404b540aSrobert {
96*404b540aSrobert _Tp* __q (__b._M_data);
97*404b540aSrobert bool* __ok (__m._M_data);
98*404b540aSrobert for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
99*404b540aSrobert ++__p, ++__ok, ++__q)
100*404b540aSrobert {
101*404b540aSrobert while (! *__ok)
102*404b540aSrobert {
103*404b540aSrobert ++__ok;
104*404b540aSrobert ++__q;
105*404b540aSrobert }
106*404b540aSrobert *__q = *__p;
107*404b540aSrobert }
108*404b540aSrobert }
109*404b540aSrobert
110*404b540aSrobert // Copy n elements from a into elements of b. Elements of a are
111*404b540aSrobert // skipped if the corresponding element of m is false. Elements of
112*404b540aSrobert // b are skipped if the corresponding element of k is false. m and
113*404b540aSrobert // k must contain at least n true elements. a and b must have at
114*404b540aSrobert // least as many elements as the index of the nth true element of m.
115*404b540aSrobert template<typename _Tp>
116*404b540aSrobert void
__valarray_copy(_Array<_Tp> __a,_Array<bool> __m,size_t __n,_Array<_Tp> __b,_Array<bool> __k)117*404b540aSrobert __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n,
118*404b540aSrobert _Array<_Tp> __b, _Array<bool> __k)
119*404b540aSrobert {
120*404b540aSrobert _Tp* __p (__a._M_data);
121*404b540aSrobert _Tp* __q (__b._M_data);
122*404b540aSrobert bool* __srcok (__m._M_data);
123*404b540aSrobert bool* __dstok (__k._M_data);
124*404b540aSrobert for (size_t __i = 0; __i < __n;
125*404b540aSrobert ++__srcok, ++__p, ++__dstok, ++__q, ++__i)
126*404b540aSrobert {
127*404b540aSrobert while (! *__srcok)
128*404b540aSrobert {
129*404b540aSrobert ++__srcok;
130*404b540aSrobert ++__p;
131*404b540aSrobert }
132*404b540aSrobert while (! *__dstok)
133*404b540aSrobert {
134*404b540aSrobert ++__dstok;
135*404b540aSrobert ++__q;
136*404b540aSrobert }
137*404b540aSrobert *__q = *__p;
138*404b540aSrobert }
139*404b540aSrobert }
140*404b540aSrobert
141*404b540aSrobert // Copy n consecutive elements of e into consecutive elements of a.
142*404b540aSrobert // I.e. a[i] = e[i].
143*404b540aSrobert template<typename _Tp, class _Dom>
144*404b540aSrobert void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)145*404b540aSrobert __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a)
146*404b540aSrobert {
147*404b540aSrobert _Tp* __p (__a._M_data);
148*404b540aSrobert for (size_t __i = 0; __i < __n; ++__i, ++__p)
149*404b540aSrobert *__p = __e[__i];
150*404b540aSrobert }
151*404b540aSrobert
152*404b540aSrobert // Copy n consecutive elements of e into elements of a using stride
153*404b540aSrobert // s. I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
154*404b540aSrobert template<typename _Tp, class _Dom>
155*404b540aSrobert void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,size_t __s)156*404b540aSrobert __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
157*404b540aSrobert _Array<_Tp> __a, size_t __s)
158*404b540aSrobert {
159*404b540aSrobert _Tp* __p (__a._M_data);
160*404b540aSrobert for (size_t __i = 0; __i < __n; ++__i, __p += __s)
161*404b540aSrobert *__p = __e[__i];
162*404b540aSrobert }
163*404b540aSrobert
164*404b540aSrobert // Copy n consecutive elements of e into elements of a indexed by
165*404b540aSrobert // contents of i. I.e., a[i[0]] = e[0].
166*404b540aSrobert template<typename _Tp, class _Dom>
167*404b540aSrobert void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)168*404b540aSrobert __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
169*404b540aSrobert _Array<_Tp> __a, _Array<size_t> __i)
170*404b540aSrobert {
171*404b540aSrobert size_t* __j (__i._M_data);
172*404b540aSrobert for (size_t __k = 0; __k < __n; ++__k, ++__j)
173*404b540aSrobert __a._M_data[*__j] = __e[__k];
174*404b540aSrobert }
175*404b540aSrobert
176*404b540aSrobert // Copy n elements of e indexed by contents of f into elements of a
177*404b540aSrobert // indexed by contents of i. I.e., a[i[0]] = e[f[0]].
178*404b540aSrobert template<typename _Tp>
179*404b540aSrobert void
__valarray_copy(_Array<_Tp> __e,_Array<size_t> __f,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)180*404b540aSrobert __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f,
181*404b540aSrobert size_t __n,
182*404b540aSrobert _Array<_Tp> __a, _Array<size_t> __i)
183*404b540aSrobert {
184*404b540aSrobert size_t* __g (__f._M_data);
185*404b540aSrobert size_t* __j (__i._M_data);
186*404b540aSrobert for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g)
187*404b540aSrobert __a._M_data[*__j] = __e._M_data[*__g];
188*404b540aSrobert }
189*404b540aSrobert
190*404b540aSrobert // Copy n consecutive elements of e into elements of a. Elements of
191*404b540aSrobert // a are skipped if the corresponding element of m is false. m must
192*404b540aSrobert // have at least n true elements and a must have at least as many
193*404b540aSrobert // elements as the index of the nth true element of m. I.e. if m
194*404b540aSrobert // has 5 false followed by 10 true elements and n == 10, a must have
195*404b540aSrobert // at least 15 elements.
196*404b540aSrobert template<typename _Tp, class _Dom>
197*404b540aSrobert void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<bool> __m)198*404b540aSrobert __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
199*404b540aSrobert _Array<_Tp> __a, _Array<bool> __m)
200*404b540aSrobert {
201*404b540aSrobert bool* __ok (__m._M_data);
202*404b540aSrobert _Tp* __p (__a._M_data);
203*404b540aSrobert for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)
204*404b540aSrobert {
205*404b540aSrobert while (! *__ok)
206*404b540aSrobert {
207*404b540aSrobert ++__ok;
208*404b540aSrobert ++__p;
209*404b540aSrobert }
210*404b540aSrobert *__p = __e[__i];
211*404b540aSrobert }
212*404b540aSrobert }
213*404b540aSrobert
214*404b540aSrobert
215*404b540aSrobert template<typename _Tp, class _Dom>
216*404b540aSrobert void
__valarray_copy_construct(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)217*404b540aSrobert __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n,
218*404b540aSrobert _Array<_Tp> __a)
219*404b540aSrobert {
220*404b540aSrobert _Tp* __p (__a._M_data);
221*404b540aSrobert for (size_t __i = 0; __i < __n; ++__i, ++__p)
222*404b540aSrobert new (__p) _Tp(__e[__i]);
223*404b540aSrobert }
224*404b540aSrobert
225*404b540aSrobert
226*404b540aSrobert template<typename _Tp>
227*404b540aSrobert void
__valarray_copy_construct(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)228*404b540aSrobert __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m,
229*404b540aSrobert _Array<_Tp> __b, size_t __n)
230*404b540aSrobert {
231*404b540aSrobert _Tp* __p (__a._M_data);
232*404b540aSrobert bool* __ok (__m._M_data);
233*404b540aSrobert for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p)
234*404b540aSrobert {
235*404b540aSrobert while (! *__ok)
236*404b540aSrobert {
237*404b540aSrobert ++__ok;
238*404b540aSrobert ++__p;
239*404b540aSrobert }
240*404b540aSrobert new (__q) _Tp(*__p);
241*404b540aSrobert }
242*404b540aSrobert }
243*404b540aSrobert
244*404b540aSrobert _GLIBCXX_END_NAMESPACE
245*404b540aSrobert
246*404b540aSrobert #endif /* _VALARRAY_ARRAY_TCC */
247