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