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