xref: /openbsd-src/gnu/gcc/libstdc++-v3/include/bits/valarray_array.tcc (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
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