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