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