Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5134 serge 1
// The template and inlines for the -*- C++ -*- internal _Array helper class.
2
 
3
// Copyright (C) 1997-2013 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
// .
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 
31
 
32
#ifndef _VALARRAY_ARRAY_TCC
33
#define _VALARRAY_ARRAY_TCC 1
34
 
35
namespace std _GLIBCXX_VISIBILITY(default)
36
{
37
_GLIBCXX_BEGIN_NAMESPACE_VERSION
38
 
39
  template
40
    void
41
    __valarray_fill(_Array<_Tp> __a, size_t __n, _Array __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
64
    void
65
    __valarray_copy(_Array<_Tp> __a, _Array __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
89
    void
90
    __valarray_copy(_Array<_Tp> __a, size_t __n, _Array<_Tp> __b,
91
		    _Array __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
113
    void
114
    __valarray_copy(_Array<_Tp> __a, _Array __m, size_t __n,
115
		    _Array<_Tp> __b, _Array __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
141
    void
142
    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_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
152
    void
153
    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
154
		     _Array<_Tp> __a, size_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
164
    void
165
    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
166
		    _Array<_Tp> __a, _Array __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
176
    void
177
    __valarray_copy(_Array<_Tp> __e, _Array __f,
178
		    size_t __n,
179
		    _Array<_Tp> __a, _Array __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
194
    void
195
    __valarray_copy(const _Expr<_Dom, _Tp>& __e, size_t __n,
196
		    _Array<_Tp> __a, _Array __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
213
    void
214
    __valarray_copy_construct(const _Expr<_Dom, _Tp>& __e, size_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
224
    void
225
    __valarray_copy_construct(_Array<_Tp> __a, _Array __m,
226
			      _Array<_Tp> __b, size_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 */