1 // The template and inlines for the -*- C++ -*- internal _Array helper class.
3 // Copyright (C) 1997-2013 Free Software Foundation, Inc.
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 3, or (at your option)
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.
16 // Under Section 7 of GPL version 3, you are granted additional
17 // permissions described in the GCC Runtime Library Exception, version
18 // 3.1, as published by the Free Software Foundation.
20 // You should have received a copy of the GNU General Public License and
21 // a copy of the GCC Runtime Library Exception along with this program;
22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
23 // <http://www.gnu.org/licenses/>.
25 /** @file bits/valarray_array.tcc
26 * This is an internal header file, included by other library headers.
27 * Do not attempt to use it directly. @headername{valarray}
30 // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@DPTMaths.ENS-Cachan.Fr>
32 #ifndef _VALARRAY_ARRAY_TCC
33 #define _VALARRAY_ARRAY_TCC 1
35 namespace std _GLIBCXX_VISIBILITY(default)
37 _GLIBCXX_BEGIN_NAMESPACE_VERSION
39 template<typename _Tp>
41 __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m,
44 _Tp* __p = __a._M_data;
45 bool* __ok (__m._M_data);
46 for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p)
57 // Copy n elements of a into consecutive elements of b. When m is
58 // false, the corresponding element of a is skipped. m must contain
59 // at least n true elements. a must contain at least n elements and
60 // enough elements to match up with m through the nth true element
61 // of m. I.e. if n is 10, m has 15 elements with 5 false followed
62 // by 10 true, a must have 15 elements.
63 template<typename _Tp>
65 __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b,
68 _Tp* __p (__a._M_data);
69 bool* __ok (__m._M_data);
70 for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
82 // Copy n consecutive elements from a into elements of b. Elements
83 // of b are skipped if the corresponding element of m is false. m
84 // must contain at least n true elements. b must have at least as
85 // many elements as the index of the nth true element of m. I.e. if
86 // m has 15 elements with 5 false followed by 10 true, b must have
87 // at least 15 elements.
88 template<typename _Tp>
90 __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
93 _Tp* __q (__b._M_data);
94 bool* __ok (__m._M_data);
95 for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
107 // Copy n elements from a into elements of b. Elements of a are
108 // skipped if the corresponding element of m is false. Elements of
109 // b are skipped if the corresponding element of k is false. m and
110 // k must contain at least n true elements. a and b must have at
111 // least as many elements as the index of the nth true element of m.
112 template<typename _Tp>
114 __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n,
115 _Array<_Tp> __b, _Array<bool> __k)
117 _Tp* __p (__a._M_data);
118 _Tp* __q (__b._M_data);
119 bool* __srcok (__m._M_data);
120 bool* __dstok (__k._M_data);
121 for (size_t __i = 0; __i < __n;
122 ++__srcok, ++__p, ++__dstok, ++__q, ++__i)
138 // Copy n consecutive elements of e into consecutive elements of a.
140 template<typename _Tp, class _Dom>
142 __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a)
144 _Tp* __p (__a._M_data);
145 for (size_t __i = 0; __i < __n; ++__i, ++__p)
149 // Copy n consecutive elements of e into elements of a using stride
150 // s. I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
151 template<typename _Tp, class _Dom>
153 __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
154 _Array<_Tp> __a, size_t __s)
156 _Tp* __p (__a._M_data);
157 for (size_t __i = 0; __i < __n; ++__i, __p += __s)
161 // Copy n consecutive elements of e into elements of a indexed by
162 // contents of i. I.e., a[i[0]] = e[0].
163 template<typename _Tp, class _Dom>
165 __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
166 _Array<_Tp> __a, _Array<size_t> __i)
168 size_t* __j (__i._M_data);
169 for (size_t __k = 0; __k < __n; ++__k, ++__j)
170 __a._M_data[*__j] = __e[__k];
173 // Copy n elements of e indexed by contents of f into elements of a
174 // indexed by contents of i. I.e., a[i[0]] = e[f[0]].
175 template<typename _Tp>
177 __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f,
179 _Array<_Tp> __a, _Array<size_t> __i)
181 size_t* __g (__f._M_data);
182 size_t* __j (__i._M_data);
183 for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g)
184 __a._M_data[*__j] = __e._M_data[*__g];
187 // Copy n consecutive elements of e into elements of a. Elements of
188 // a are skipped if the corresponding element of m is false. m must
189 // have at least n true elements and a must have at least as many
190 // elements as the index of the nth true element of m. I.e. if m
191 // has 5 false followed by 10 true elements and n == 10, a must have
192 // at least 15 elements.
193 template<typename _Tp, class _Dom>
195 __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
196 _Array<_Tp> __a, _Array<bool> __m)
198 bool* __ok (__m._M_data);
199 _Tp* __p (__a._M_data);
200 for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)
212 template<typename _Tp, class _Dom>
214 __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n,
217 _Tp* __p (__a._M_data);
218 for (size_t __i = 0; __i < __n; ++__i, ++__p)
219 new (__p) _Tp(__e[__i]);
223 template<typename _Tp>
225 __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m,
226 _Array<_Tp> __b, size_t __n)
228 _Tp* __p (__a._M_data);
229 bool* __ok (__m._M_data);
230 for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p)
241 _GLIBCXX_END_NAMESPACE_VERSION
244 #endif /* _VALARRAY_ARRAY_TCC */