Clang Project

include/c++/7/bits/valarray_array.tcc
1// The template and inlines for the -*- C++ -*- internal _Array helper class.
2
3// Copyright (C) 1997-2017 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 3, 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// 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.
19
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/>.
24
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}
28 */
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
35namespace std _GLIBCXX_VISIBILITY(default)
36{
37_GLIBCXX_BEGIN_NAMESPACE_VERSION
38
39  template<typename _Tp>
40    void
41    __valarray_fill(_Array<_Tp> __asize_t __n_Array<bool__m,
42     const _Tp& __t)
43    {
44      _Tp* __p = __a._M_data;
45      bool__ok (__m._M_data);
46      for (size_t __i=0__i < __n; ++__i, ++__ok, ++__p)
47 {
48   while (!*__ok)
49   {
50     ++__ok;
51     ++__p;
52   }
53   *__p = __t;
54 }
55    }
56
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>
64    void
65    __valarray_copy(_Array<_Tp> __a_Array<bool__m_Array<_Tp> __b,
66     size_t __n)
67    {
68      _Tp* __p (__a._M_data);
69      bool__ok (__m._M_data);
70      for (_Tp* __q = __b._M_data; __q < __b._M_data + __n;
71    ++__q, ++__ok, ++__p)
72 {
73   while (! *__ok)
74     {
75       ++__ok;
76       ++__p;
77     }
78   *__q = *__p;
79 }
80    }
81
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>
89    void
90    __valarray_copy(_Array<_Tp> __asize_t __n_Array<_Tp> __b,
91     _Array<bool__m)
92    {
93      _Tp* __q (__b._M_data);
94      bool__ok (__m._M_data);
95      for (_Tp* __p = __a._M_data; __p < __a._M_data+__n;
96    ++__p, ++__ok, ++__q)
97 {
98   while (! *__ok)
99     {
100       ++__ok;
101       ++__q;
102     }
103   *__q = *__p;
104 }
105    }
106
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>
113    void
114    __valarray_copy(_Array<_Tp> __a_Array<bool__msize_t __n,
115     _Array<_Tp> __b_Array<bool__k)
116    {
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)
123 {
124   while (! *__srcok)
125     {
126       ++__srcok;
127       ++__p;
128     }
129   while (! *__dstok
130     {
131       ++__dstok;
132       ++__q;
133     }
134   *__q = *__p;
135 }
136    }
137
138  // Copy n consecutive elements of e into consecutive elements of a.
139  // I.e. a[i] = e[i].
140  template<typename _Tp, class _Dom>
141    void
142    __valarray_copy(const _Expr<_Dom, _Tp>& __esize_t __n_Array<_Tp> __a)
143    {
144      _Tp* __p (__a._M_data);
145      for (size_t __i = 0__i < __n; ++__i, ++__p)
146 *__p = __e[__i];
147    }
148
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>
152    void
153    __valarray_copy(const _Expr<_Dom, _Tp>& __esize_t __n,
154      _Array<_Tp> __asize_t __s)
155    {
156      _Tp* __p (__a._M_data);
157      for (size_t __i = 0__i < __n; ++__i__p += __s)
158 *__p = __e[__i];
159    }
160
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>
164    void
165    __valarray_copy(const _Expr<_Dom, _Tp>& __esize_t __n,
166     _Array<_Tp> __a_Array<size_t__i)
167    {
168      size_t__j (__i._M_data);
169      for (size_t __k = 0__k < __n; ++__k, ++__j)
170 __a._M_data[*__j] = __e[__k];
171    }
172
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>
176    void
177    __valarray_copy(_Array<_Tp> __e_Array<size_t__f,
178     size_t __n
179     _Array<_Tp> __a_Array<size_t__i)
180    {
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];
185    }
186
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>
194    void
195    __valarray_copy(const _Expr<_Dom, _Tp>& __esize_t __n,
196     _Array<_Tp> __a_Array<bool__m)
197    {
198      bool__ok (__m._M_data);
199      _Tp* __p (__a._M_data);
200      for (size_t __i = 0__i < __n; ++__i, ++__ok, ++__p)
201 {
202   while (! *__ok)
203     {
204       ++__ok;
205       ++__p;
206     }
207   *__p = __e[__i];
208 }
209    }
210
211
212  template<typename _Tp, class _Dom>
213    void
214    __valarray_copy_construct(const _Expr<_Dom, _Tp>& __esize_t __n,
215       _Array<_Tp> __a)
216    {
217      _Tp* __p (__a._M_data);
218      for (size_t __i = 0__i < __n; ++__i, ++__p)
219 new (__p) _Tp(__e[__i]);
220    }
221
222
223  template<typename _Tp>
224    void
225    __valarray_copy_construct(_Array<_Tp> __a_Array<bool__m,
226       _Array<_Tp> __bsize_t __n)
227    {
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)
231 {
232   while (! *__ok)
233     {
234       ++__ok;
235       ++__p;
236     }
237   new (__q) _Tp(*__p);
238 }
239    }
240
241_GLIBCXX_END_NAMESPACE_VERSION
242// namespace
243
244#endif /* _VALARRAY_ARRAY_TCC */
245