100db7afdSDavid E. O'Brien // The template and inlines for the -*- C++ -*- internal _Array helper class.
200db7afdSDavid E. O'Brien
3*f8a1b7d9SAlexander Kabaev // Copyright (C) 1997, 1998, 1999, 2003, 2005 Free Software Foundation, Inc.
400db7afdSDavid E. O'Brien //
500db7afdSDavid E. O'Brien // This file is part of the GNU ISO C++ Library. This library is free
600db7afdSDavid E. O'Brien // software; you can redistribute it and/or modify it under the
700db7afdSDavid E. O'Brien // terms of the GNU General Public License as published by the
800db7afdSDavid E. O'Brien // Free Software Foundation; either version 2, or (at your option)
900db7afdSDavid E. O'Brien // any later version.
1000db7afdSDavid E. O'Brien
1100db7afdSDavid E. O'Brien // This library is distributed in the hope that it will be useful,
1200db7afdSDavid E. O'Brien // but WITHOUT ANY WARRANTY; without even the implied warranty of
1300db7afdSDavid E. O'Brien // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1400db7afdSDavid E. O'Brien // GNU General Public License for more details.
1500db7afdSDavid E. O'Brien
1600db7afdSDavid E. O'Brien // You should have received a copy of the GNU General Public License along
1700db7afdSDavid E. O'Brien // with this library; see the file COPYING. If not, write to the Free
18*f8a1b7d9SAlexander Kabaev // Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
1900db7afdSDavid E. O'Brien // USA.
2000db7afdSDavid E. O'Brien
2100db7afdSDavid E. O'Brien // As a special exception, you may use this file as part of a free software
2200db7afdSDavid E. O'Brien // library without restriction. Specifically, if other files instantiate
2300db7afdSDavid E. O'Brien // templates or use macros or inline functions from this file, or you compile
2400db7afdSDavid E. O'Brien // this file and link it with other files to produce an executable, this
2500db7afdSDavid E. O'Brien // file does not by itself cause the resulting executable to be covered by
2600db7afdSDavid E. O'Brien // the GNU General Public License. This exception does not however
2700db7afdSDavid E. O'Brien // invalidate any other reasons why the executable file might be covered by
2800db7afdSDavid E. O'Brien // the GNU General Public License.
2900db7afdSDavid E. O'Brien
30*f8a1b7d9SAlexander Kabaev /** @file valarray_array.tcc
31*f8a1b7d9SAlexander Kabaev * This is an internal header file, included by other library headers.
32*f8a1b7d9SAlexander Kabaev * You should not attempt to use it directly.
33*f8a1b7d9SAlexander Kabaev */
34*f8a1b7d9SAlexander Kabaev
3500db7afdSDavid E. O'Brien // Written by Gabriel Dos Reis <[email protected]>
3600db7afdSDavid E. O'Brien
37ffeaf689SAlexander Kabaev #ifndef _VALARRAY_ARRAY_TCC
38ffeaf689SAlexander Kabaev #define _VALARRAY_ARRAY_TCC 1
3900db7afdSDavid E. O'Brien
_GLIBCXX_BEGIN_NAMESPACE(std)40*f8a1b7d9SAlexander Kabaev _GLIBCXX_BEGIN_NAMESPACE(std)
41*f8a1b7d9SAlexander Kabaev
42ffeaf689SAlexander Kabaev template<typename _Tp>
4300db7afdSDavid E. O'Brien void
44ffeaf689SAlexander Kabaev __valarray_fill(_Array<_Tp> __a, size_t __n, _Array<bool> __m,
45ffeaf689SAlexander Kabaev const _Tp& __t)
4600db7afdSDavid E. O'Brien {
4700db7afdSDavid E. O'Brien _Tp* __p = __a._M_data;
4800db7afdSDavid E. O'Brien bool* __ok (__m._M_data);
49ffeaf689SAlexander Kabaev for (size_t __i=0; __i < __n; ++__i, ++__ok, ++__p)
50ffeaf689SAlexander Kabaev {
51ffeaf689SAlexander Kabaev while (!*__ok)
52ffeaf689SAlexander Kabaev {
5300db7afdSDavid E. O'Brien ++__ok;
5400db7afdSDavid E. O'Brien ++__p;
5500db7afdSDavid E. O'Brien }
5600db7afdSDavid E. O'Brien *__p = __t;
5700db7afdSDavid E. O'Brien }
5800db7afdSDavid E. O'Brien }
5900db7afdSDavid E. O'Brien
60ffeaf689SAlexander Kabaev // Copy n elements of a into consecutive elements of b. When m is
61ffeaf689SAlexander Kabaev // false, the corresponding element of a is skipped. m must contain
62ffeaf689SAlexander Kabaev // at least n true elements. a must contain at least n elements and
63ffeaf689SAlexander Kabaev // enough elements to match up with m through the nth true element
64ffeaf689SAlexander Kabaev // of m. I.e. if n is 10, m has 15 elements with 5 false followed
65ffeaf689SAlexander Kabaev // by 10 true, a must have 15 elements.
66ffeaf689SAlexander Kabaev template<typename _Tp>
6700db7afdSDavid E. O'Brien void
__valarray_copy(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)68ffeaf689SAlexander Kabaev __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, _Array<_Tp> __b,
69ffeaf689SAlexander Kabaev size_t __n)
7000db7afdSDavid E. O'Brien {
7100db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
7200db7afdSDavid E. O'Brien bool* __ok (__m._M_data);
73ffeaf689SAlexander Kabaev for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
74ffeaf689SAlexander Kabaev ++__q, ++__ok, ++__p)
75ffeaf689SAlexander Kabaev {
76ffeaf689SAlexander Kabaev while (! *__ok)
77ffeaf689SAlexander Kabaev {
7800db7afdSDavid E. O'Brien ++__ok;
7900db7afdSDavid E. O'Brien ++__p;
8000db7afdSDavid E. O'Brien }
8100db7afdSDavid E. O'Brien *__q = *__p;
8200db7afdSDavid E. O'Brien }
8300db7afdSDavid E. O'Brien }
8400db7afdSDavid E. O'Brien
85ffeaf689SAlexander Kabaev // Copy n consecutive elements from a into elements of b. Elements
86ffeaf689SAlexander Kabaev // of b are skipped if the corresponding element of m is false. m
87ffeaf689SAlexander Kabaev // must contain at least n true elements. b must have at least as
88ffeaf689SAlexander Kabaev // many elements as the index of the nth true element of m. I.e. if
89ffeaf689SAlexander Kabaev // m has 15 elements with 5 false followed by 10 true, b must have
90ffeaf689SAlexander Kabaev // at least 15 elements.
91ffeaf689SAlexander Kabaev template<typename _Tp>
9200db7afdSDavid E. O'Brien void
__valarray_copy(_Array<_Tp> __a,size_t __n,_Array<_Tp> __b,_Array<bool> __m)93ffeaf689SAlexander Kabaev __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
94ffeaf689SAlexander Kabaev _Array<bool> __m)
9500db7afdSDavid E. O'Brien {
9600db7afdSDavid E. O'Brien _Tp* __q (__b._M_data);
9700db7afdSDavid E. O'Brien bool* __ok (__m._M_data);
98ffeaf689SAlexander Kabaev for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
99ffeaf689SAlexander Kabaev ++__p, ++__ok, ++__q)
100ffeaf689SAlexander Kabaev {
101ffeaf689SAlexander Kabaev while (! *__ok)
102ffeaf689SAlexander Kabaev {
10300db7afdSDavid E. O'Brien ++__ok;
10400db7afdSDavid E. O'Brien ++__q;
10500db7afdSDavid E. O'Brien }
10600db7afdSDavid E. O'Brien *__q = *__p;
10700db7afdSDavid E. O'Brien }
10800db7afdSDavid E. O'Brien }
10900db7afdSDavid E. O'Brien
110ffeaf689SAlexander Kabaev // Copy n elements from a into elements of b. Elements of a are
111ffeaf689SAlexander Kabaev // skipped if the corresponding element of m is false. Elements of
112ffeaf689SAlexander Kabaev // b are skipped if the corresponding element of k is false. m and
113ffeaf689SAlexander Kabaev // k must contain at least n true elements. a and b must have at
114ffeaf689SAlexander Kabaev // least as many elements as the index of the nth true element of m.
115ffeaf689SAlexander Kabaev template<typename _Tp>
116ffeaf689SAlexander Kabaev void
__valarray_copy(_Array<_Tp> __a,_Array<bool> __m,size_t __n,_Array<_Tp> __b,_Array<bool> __k)117ffeaf689SAlexander Kabaev __valarray_copy(_Array<_Tp> __a, _Array<bool> __m, size_t __n,
118ffeaf689SAlexander Kabaev _Array<_Tp> __b, _Array<bool> __k)
119ffeaf689SAlexander Kabaev {
120ffeaf689SAlexander Kabaev _Tp* __p (__a._M_data);
121ffeaf689SAlexander Kabaev _Tp* __q (__b._M_data);
122ffeaf689SAlexander Kabaev bool* __srcok (__m._M_data);
123ffeaf689SAlexander Kabaev bool* __dstok (__k._M_data);
124ffeaf689SAlexander Kabaev for (size_t __i = 0; __i < __n;
125ffeaf689SAlexander Kabaev ++__srcok, ++__p, ++__dstok, ++__q, ++__i)
126ffeaf689SAlexander Kabaev {
127ffeaf689SAlexander Kabaev while (! *__srcok)
128ffeaf689SAlexander Kabaev {
129ffeaf689SAlexander Kabaev ++__srcok;
130ffeaf689SAlexander Kabaev ++__p;
131ffeaf689SAlexander Kabaev }
132ffeaf689SAlexander Kabaev while (! *__dstok)
133ffeaf689SAlexander Kabaev {
134ffeaf689SAlexander Kabaev ++__dstok;
135ffeaf689SAlexander Kabaev ++__q;
136ffeaf689SAlexander Kabaev }
137ffeaf689SAlexander Kabaev *__q = *__p;
138ffeaf689SAlexander Kabaev }
139ffeaf689SAlexander Kabaev }
140ffeaf689SAlexander Kabaev
141ffeaf689SAlexander Kabaev // Copy n consecutive elements of e into consecutive elements of a.
142ffeaf689SAlexander Kabaev // I.e. a[i] = e[i].
143ffeaf689SAlexander Kabaev template<typename _Tp, class _Dom>
14400db7afdSDavid E. O'Brien void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)14500db7afdSDavid E. O'Brien __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n, _Array<_Tp> __a)
14600db7afdSDavid E. O'Brien {
14700db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
148ffeaf689SAlexander Kabaev for (size_t __i = 0; __i < __n; ++__i, ++__p)
149ffeaf689SAlexander Kabaev *__p = __e[__i];
15000db7afdSDavid E. O'Brien }
15100db7afdSDavid E. O'Brien
152ffeaf689SAlexander Kabaev // Copy n consecutive elements of e into elements of a using stride
153ffeaf689SAlexander Kabaev // s. I.e., a[0] = e[0], a[s] = e[1], a[2*s] = e[2].
154ffeaf689SAlexander Kabaev template<typename _Tp, class _Dom>
15500db7afdSDavid E. O'Brien void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,size_t __s)15600db7afdSDavid E. O'Brien __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
15700db7afdSDavid E. O'Brien _Array<_Tp> __a, size_t __s)
15800db7afdSDavid E. O'Brien {
15900db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
160ffeaf689SAlexander Kabaev for (size_t __i = 0; __i < __n; ++__i, __p += __s)
161ffeaf689SAlexander Kabaev *__p = __e[__i];
16200db7afdSDavid E. O'Brien }
16300db7afdSDavid E. O'Brien
164ffeaf689SAlexander Kabaev // Copy n consecutive elements of e into elements of a indexed by
165ffeaf689SAlexander Kabaev // contents of i. I.e., a[i[0]] = e[0].
166ffeaf689SAlexander Kabaev template<typename _Tp, class _Dom>
16700db7afdSDavid E. O'Brien void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)16800db7afdSDavid E. O'Brien __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
16900db7afdSDavid E. O'Brien _Array<_Tp> __a, _Array<size_t> __i)
17000db7afdSDavid E. O'Brien {
17100db7afdSDavid E. O'Brien size_t* __j (__i._M_data);
172ffeaf689SAlexander Kabaev for (size_t __k = 0; __k < __n; ++__k, ++__j)
173ffeaf689SAlexander Kabaev __a._M_data[*__j] = __e[__k];
17400db7afdSDavid E. O'Brien }
17500db7afdSDavid E. O'Brien
176ffeaf689SAlexander Kabaev // Copy n elements of e indexed by contents of f into elements of a
177ffeaf689SAlexander Kabaev // indexed by contents of i. I.e., a[i[0]] = e[f[0]].
178ffeaf689SAlexander Kabaev template<typename _Tp>
179ffeaf689SAlexander Kabaev void
__valarray_copy(_Array<_Tp> __e,_Array<size_t> __f,size_t __n,_Array<_Tp> __a,_Array<size_t> __i)180ffeaf689SAlexander Kabaev __valarray_copy(_Array<_Tp> __e, _Array<size_t> __f,
181ffeaf689SAlexander Kabaev size_t __n,
182ffeaf689SAlexander Kabaev _Array<_Tp> __a, _Array<size_t> __i)
183ffeaf689SAlexander Kabaev {
184ffeaf689SAlexander Kabaev size_t* __g (__f._M_data);
185ffeaf689SAlexander Kabaev size_t* __j (__i._M_data);
186ffeaf689SAlexander Kabaev for (size_t __k = 0; __k < __n; ++__k, ++__j, ++__g)
187ffeaf689SAlexander Kabaev __a._M_data[*__j] = __e._M_data[*__g];
188ffeaf689SAlexander Kabaev }
189ffeaf689SAlexander Kabaev
190ffeaf689SAlexander Kabaev // Copy n consecutive elements of e into elements of a. Elements of
191ffeaf689SAlexander Kabaev // a are skipped if the corresponding element of m is false. m must
192ffeaf689SAlexander Kabaev // have at least n true elements and a must have at least as many
193ffeaf689SAlexander Kabaev // elements as the index of the nth true element of m. I.e. if m
194ffeaf689SAlexander Kabaev // has 5 false followed by 10 true elements and n == 10, a must have
195ffeaf689SAlexander Kabaev // at least 15 elements.
196ffeaf689SAlexander Kabaev template<typename _Tp, class _Dom>
19700db7afdSDavid E. O'Brien void
__valarray_copy(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a,_Array<bool> __m)19800db7afdSDavid E. O'Brien __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
19900db7afdSDavid E. O'Brien _Array<_Tp> __a, _Array<bool> __m)
20000db7afdSDavid E. O'Brien {
20100db7afdSDavid E. O'Brien bool* __ok (__m._M_data);
20200db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
203ffeaf689SAlexander Kabaev for (size_t __i = 0; __i < __n; ++__i, ++__ok, ++__p)
204ffeaf689SAlexander Kabaev {
205ffeaf689SAlexander Kabaev while (! *__ok)
206ffeaf689SAlexander Kabaev {
20700db7afdSDavid E. O'Brien ++__ok;
20800db7afdSDavid E. O'Brien ++__p;
20900db7afdSDavid E. O'Brien }
21000db7afdSDavid E. O'Brien *__p = __e[__i];
21100db7afdSDavid E. O'Brien }
21200db7afdSDavid E. O'Brien }
21300db7afdSDavid E. O'Brien
21400db7afdSDavid E. O'Brien
215ffeaf689SAlexander Kabaev template<typename _Tp, class _Dom>
21600db7afdSDavid E. O'Brien void
__valarray_copy_construct(const _Expr<_Dom,_Tp> & __e,size_t __n,_Array<_Tp> __a)21700db7afdSDavid E. O'Brien __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_t __n,
21800db7afdSDavid E. O'Brien _Array<_Tp> __a)
21900db7afdSDavid E. O'Brien {
22000db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
221ffeaf689SAlexander Kabaev for (size_t __i = 0; __i < __n; ++__i, ++__p)
222ffeaf689SAlexander Kabaev new (__p) _Tp(__e[__i]);
22300db7afdSDavid E. O'Brien }
22400db7afdSDavid E. O'Brien
22500db7afdSDavid E. O'Brien
226ffeaf689SAlexander Kabaev template<typename _Tp>
22700db7afdSDavid E. O'Brien void
__valarray_copy_construct(_Array<_Tp> __a,_Array<bool> __m,_Array<_Tp> __b,size_t __n)22800db7afdSDavid E. O'Brien __valarray_copy_construct(_Array<_Tp> __a, _Array<bool> __m,
22900db7afdSDavid E. O'Brien _Array<_Tp> __b, size_t __n)
23000db7afdSDavid E. O'Brien {
23100db7afdSDavid E. O'Brien _Tp* __p (__a._M_data);
23200db7afdSDavid E. O'Brien bool* __ok (__m._M_data);
233ffeaf689SAlexander Kabaev for (_Tp* __q = __b._M_data; __q < __b._M_data+__n; ++__q, ++__ok, ++__p)
234ffeaf689SAlexander Kabaev {
235ffeaf689SAlexander Kabaev while (! *__ok)
236ffeaf689SAlexander Kabaev {
23700db7afdSDavid E. O'Brien ++__ok;
23800db7afdSDavid E. O'Brien ++__p;
23900db7afdSDavid E. O'Brien }
24000db7afdSDavid E. O'Brien new (__q) _Tp(*__p);
24100db7afdSDavid E. O'Brien }
24200db7afdSDavid E. O'Brien }
243*f8a1b7d9SAlexander Kabaev
244*f8a1b7d9SAlexander Kabaev _GLIBCXX_END_NAMESPACE
24500db7afdSDavid E. O'Brien
246ffeaf689SAlexander Kabaev #endif /* _VALARRAY_ARRAY_TCC */
247