xref: /dflybsd-src/contrib/gcc-4.7/libstdc++-v3/include/bits/valarray_before.h (revision 04febcfb30580676d3e95f58a16c5137ee478b32)
1*e4b17023SJohn Marino // The template and inlines for the -*- C++ -*- internal _Meta class.
2*e4b17023SJohn Marino 
3*e4b17023SJohn Marino // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005,
4*e4b17023SJohn Marino // 2006, 2007, 2008, 2009, 2010  Free Software Foundation, Inc.
5*e4b17023SJohn Marino //
6*e4b17023SJohn Marino // This file is part of the GNU ISO C++ Library.  This library is free
7*e4b17023SJohn Marino // software; you can redistribute it and/or modify it under the
8*e4b17023SJohn Marino // terms of the GNU General Public License as published by the
9*e4b17023SJohn Marino // Free Software Foundation; either version 3, or (at your option)
10*e4b17023SJohn Marino // any later version.
11*e4b17023SJohn Marino 
12*e4b17023SJohn Marino // This library is distributed in the hope that it will be useful,
13*e4b17023SJohn Marino // but WITHOUT ANY WARRANTY; without even the implied warranty of
14*e4b17023SJohn Marino // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*e4b17023SJohn Marino // GNU General Public License for more details.
16*e4b17023SJohn Marino 
17*e4b17023SJohn Marino // Under Section 7 of GPL version 3, you are granted additional
18*e4b17023SJohn Marino // permissions described in the GCC Runtime Library Exception, version
19*e4b17023SJohn Marino // 3.1, as published by the Free Software Foundation.
20*e4b17023SJohn Marino 
21*e4b17023SJohn Marino // You should have received a copy of the GNU General Public License and
22*e4b17023SJohn Marino // a copy of the GCC Runtime Library Exception along with this program;
23*e4b17023SJohn Marino // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24*e4b17023SJohn Marino // <http://www.gnu.org/licenses/>.
25*e4b17023SJohn Marino 
26*e4b17023SJohn Marino /** @file bits/valarray_before.h
27*e4b17023SJohn Marino  *  This is an internal header file, included by other library headers.
28*e4b17023SJohn Marino  *  Do not attempt to use it directly. @headername{valarray}
29*e4b17023SJohn Marino  */
30*e4b17023SJohn Marino 
31*e4b17023SJohn Marino // Written by Gabriel Dos Reis <Gabriel.Dos-Reis@cmla.ens-cachan.fr>
32*e4b17023SJohn Marino 
33*e4b17023SJohn Marino #ifndef _VALARRAY_BEFORE_H
34*e4b17023SJohn Marino #define _VALARRAY_BEFORE_H 1
35*e4b17023SJohn Marino 
36*e4b17023SJohn Marino #pragma GCC system_header
37*e4b17023SJohn Marino 
38*e4b17023SJohn Marino #include <bits/slice_array.h>
39*e4b17023SJohn Marino 
_GLIBCXX_VISIBILITY(default)40*e4b17023SJohn Marino namespace std _GLIBCXX_VISIBILITY(default)
41*e4b17023SJohn Marino {
42*e4b17023SJohn Marino _GLIBCXX_BEGIN_NAMESPACE_VERSION
43*e4b17023SJohn Marino 
44*e4b17023SJohn Marino   //
45*e4b17023SJohn Marino   // Implementing a loosened valarray return value is tricky.
46*e4b17023SJohn Marino   // First we need to meet 26.3.1/3: we should not add more than
47*e4b17023SJohn Marino   // two levels of template nesting. Therefore we resort to template
48*e4b17023SJohn Marino   // template to "flatten" loosened return value types.
49*e4b17023SJohn Marino   // At some point we use partial specialization to remove one level
50*e4b17023SJohn Marino   // template nesting due to _Expr<>
51*e4b17023SJohn Marino   //
52*e4b17023SJohn Marino 
53*e4b17023SJohn Marino   // This class is NOT defined. It doesn't need to.
54*e4b17023SJohn Marino   template<typename _Tp1, typename _Tp2> class _Constant;
55*e4b17023SJohn Marino 
56*e4b17023SJohn Marino   // Implementations of unary functions applied to valarray<>s.
57*e4b17023SJohn Marino   // I use hard-coded object functions here instead of a generic
58*e4b17023SJohn Marino   // approach like pointers to function:
59*e4b17023SJohn Marino   //    1) correctness: some functions take references, others values.
60*e4b17023SJohn Marino   //       we can't deduce the correct type afterwards.
61*e4b17023SJohn Marino   //    2) efficiency -- object functions can be easily inlined
62*e4b17023SJohn Marino   //    3) be Koenig-lookup-friendly
63*e4b17023SJohn Marino 
64*e4b17023SJohn Marino   struct _Abs
65*e4b17023SJohn Marino   {
66*e4b17023SJohn Marino     template<typename _Tp>
67*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
68*e4b17023SJohn Marino       { return abs(__t); }
69*e4b17023SJohn Marino   };
70*e4b17023SJohn Marino 
71*e4b17023SJohn Marino   struct _Cos
72*e4b17023SJohn Marino   {
73*e4b17023SJohn Marino     template<typename _Tp>
74*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
75*e4b17023SJohn Marino       { return cos(__t); }
76*e4b17023SJohn Marino   };
77*e4b17023SJohn Marino 
78*e4b17023SJohn Marino   struct _Acos
79*e4b17023SJohn Marino   {
80*e4b17023SJohn Marino     template<typename _Tp>
81*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
82*e4b17023SJohn Marino       { return acos(__t); }
83*e4b17023SJohn Marino   };
84*e4b17023SJohn Marino 
85*e4b17023SJohn Marino   struct _Cosh
86*e4b17023SJohn Marino   {
87*e4b17023SJohn Marino     template<typename _Tp>
88*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
89*e4b17023SJohn Marino       { return cosh(__t); }
90*e4b17023SJohn Marino   };
91*e4b17023SJohn Marino 
92*e4b17023SJohn Marino   struct _Sin
93*e4b17023SJohn Marino   {
94*e4b17023SJohn Marino     template<typename _Tp>
95*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
96*e4b17023SJohn Marino       { return sin(__t); }
97*e4b17023SJohn Marino   };
98*e4b17023SJohn Marino 
99*e4b17023SJohn Marino   struct _Asin
100*e4b17023SJohn Marino   {
101*e4b17023SJohn Marino     template<typename _Tp>
102*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
103*e4b17023SJohn Marino       { return asin(__t); }
104*e4b17023SJohn Marino   };
105*e4b17023SJohn Marino 
106*e4b17023SJohn Marino   struct _Sinh
107*e4b17023SJohn Marino   {
108*e4b17023SJohn Marino     template<typename _Tp>
109*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
110*e4b17023SJohn Marino       { return sinh(__t); }
111*e4b17023SJohn Marino   };
112*e4b17023SJohn Marino 
113*e4b17023SJohn Marino   struct _Tan
114*e4b17023SJohn Marino   {
115*e4b17023SJohn Marino     template<typename _Tp>
116*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
117*e4b17023SJohn Marino       { return tan(__t); }
118*e4b17023SJohn Marino   };
119*e4b17023SJohn Marino 
120*e4b17023SJohn Marino   struct _Atan
121*e4b17023SJohn Marino   {
122*e4b17023SJohn Marino     template<typename _Tp>
123*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
124*e4b17023SJohn Marino       { return atan(__t); }
125*e4b17023SJohn Marino   };
126*e4b17023SJohn Marino 
127*e4b17023SJohn Marino   struct _Tanh
128*e4b17023SJohn Marino   {
129*e4b17023SJohn Marino     template<typename _Tp>
130*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
131*e4b17023SJohn Marino       { return tanh(__t); }
132*e4b17023SJohn Marino   };
133*e4b17023SJohn Marino 
134*e4b17023SJohn Marino   struct _Exp
135*e4b17023SJohn Marino   {
136*e4b17023SJohn Marino     template<typename _Tp>
137*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
138*e4b17023SJohn Marino       { return exp(__t); }
139*e4b17023SJohn Marino   };
140*e4b17023SJohn Marino 
141*e4b17023SJohn Marino   struct _Log
142*e4b17023SJohn Marino   {
143*e4b17023SJohn Marino     template<typename _Tp>
144*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
145*e4b17023SJohn Marino       { return log(__t); }
146*e4b17023SJohn Marino   };
147*e4b17023SJohn Marino 
148*e4b17023SJohn Marino   struct _Log10
149*e4b17023SJohn Marino   {
150*e4b17023SJohn Marino     template<typename _Tp>
151*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
152*e4b17023SJohn Marino       { return log10(__t); }
153*e4b17023SJohn Marino   };
154*e4b17023SJohn Marino 
155*e4b17023SJohn Marino   struct _Sqrt
156*e4b17023SJohn Marino   {
157*e4b17023SJohn Marino     template<typename _Tp>
158*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
159*e4b17023SJohn Marino       { return sqrt(__t); }
160*e4b17023SJohn Marino   };
161*e4b17023SJohn Marino 
162*e4b17023SJohn Marino   // In the past, we used to tailor operator applications semantics
163*e4b17023SJohn Marino   // to the specialization of standard function objects (i.e. plus<>, etc.)
164*e4b17023SJohn Marino   // That is incorrect.  Therefore we provide our own surrogates.
165*e4b17023SJohn Marino 
166*e4b17023SJohn Marino   struct __unary_plus
167*e4b17023SJohn Marino   {
168*e4b17023SJohn Marino     template<typename _Tp>
169*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
170*e4b17023SJohn Marino       { return +__t; }
171*e4b17023SJohn Marino   };
172*e4b17023SJohn Marino 
173*e4b17023SJohn Marino   struct __negate
174*e4b17023SJohn Marino   {
175*e4b17023SJohn Marino     template<typename _Tp>
176*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
177*e4b17023SJohn Marino       { return -__t; }
178*e4b17023SJohn Marino   };
179*e4b17023SJohn Marino 
180*e4b17023SJohn Marino   struct __bitwise_not
181*e4b17023SJohn Marino   {
182*e4b17023SJohn Marino     template<typename _Tp>
183*e4b17023SJohn Marino       _Tp operator()(const _Tp& __t) const
184*e4b17023SJohn Marino       { return ~__t; }
185*e4b17023SJohn Marino   };
186*e4b17023SJohn Marino 
187*e4b17023SJohn Marino   struct __plus
188*e4b17023SJohn Marino   {
189*e4b17023SJohn Marino     template<typename _Tp>
190*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
191*e4b17023SJohn Marino       { return __x + __y; }
192*e4b17023SJohn Marino   };
193*e4b17023SJohn Marino 
194*e4b17023SJohn Marino   struct __minus
195*e4b17023SJohn Marino   {
196*e4b17023SJohn Marino     template<typename _Tp>
197*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
198*e4b17023SJohn Marino       { return __x - __y; }
199*e4b17023SJohn Marino   };
200*e4b17023SJohn Marino 
201*e4b17023SJohn Marino   struct __multiplies
202*e4b17023SJohn Marino   {
203*e4b17023SJohn Marino     template<typename _Tp>
204*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
205*e4b17023SJohn Marino       { return __x * __y; }
206*e4b17023SJohn Marino   };
207*e4b17023SJohn Marino 
208*e4b17023SJohn Marino   struct __divides
209*e4b17023SJohn Marino   {
210*e4b17023SJohn Marino     template<typename _Tp>
211*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
212*e4b17023SJohn Marino       { return __x / __y; }
213*e4b17023SJohn Marino   };
214*e4b17023SJohn Marino 
215*e4b17023SJohn Marino   struct __modulus
216*e4b17023SJohn Marino   {
217*e4b17023SJohn Marino     template<typename _Tp>
218*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
219*e4b17023SJohn Marino       { return __x % __y; }
220*e4b17023SJohn Marino   };
221*e4b17023SJohn Marino 
222*e4b17023SJohn Marino   struct __bitwise_xor
223*e4b17023SJohn Marino   {
224*e4b17023SJohn Marino     template<typename _Tp>
225*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
226*e4b17023SJohn Marino       { return __x ^ __y; }
227*e4b17023SJohn Marino   };
228*e4b17023SJohn Marino 
229*e4b17023SJohn Marino   struct __bitwise_and
230*e4b17023SJohn Marino   {
231*e4b17023SJohn Marino     template<typename _Tp>
232*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
233*e4b17023SJohn Marino       { return __x & __y; }
234*e4b17023SJohn Marino   };
235*e4b17023SJohn Marino 
236*e4b17023SJohn Marino   struct __bitwise_or
237*e4b17023SJohn Marino   {
238*e4b17023SJohn Marino     template<typename _Tp>
239*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
240*e4b17023SJohn Marino       { return __x | __y; }
241*e4b17023SJohn Marino   };
242*e4b17023SJohn Marino 
243*e4b17023SJohn Marino   struct __shift_left
244*e4b17023SJohn Marino   {
245*e4b17023SJohn Marino     template<typename _Tp>
246*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
247*e4b17023SJohn Marino       { return __x << __y; }
248*e4b17023SJohn Marino   };
249*e4b17023SJohn Marino 
250*e4b17023SJohn Marino   struct __shift_right
251*e4b17023SJohn Marino   {
252*e4b17023SJohn Marino     template<typename _Tp>
253*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
254*e4b17023SJohn Marino       { return __x >> __y; }
255*e4b17023SJohn Marino   };
256*e4b17023SJohn Marino 
257*e4b17023SJohn Marino   struct __logical_and
258*e4b17023SJohn Marino   {
259*e4b17023SJohn Marino     template<typename _Tp>
260*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
261*e4b17023SJohn Marino       { return __x && __y; }
262*e4b17023SJohn Marino   };
263*e4b17023SJohn Marino 
264*e4b17023SJohn Marino   struct __logical_or
265*e4b17023SJohn Marino   {
266*e4b17023SJohn Marino     template<typename _Tp>
267*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
268*e4b17023SJohn Marino       { return __x || __y; }
269*e4b17023SJohn Marino   };
270*e4b17023SJohn Marino 
271*e4b17023SJohn Marino   struct __logical_not
272*e4b17023SJohn Marino   {
273*e4b17023SJohn Marino     template<typename _Tp>
274*e4b17023SJohn Marino       bool operator()(const _Tp& __x) const
275*e4b17023SJohn Marino       { return !__x; }
276*e4b17023SJohn Marino   };
277*e4b17023SJohn Marino 
278*e4b17023SJohn Marino   struct __equal_to
279*e4b17023SJohn Marino   {
280*e4b17023SJohn Marino     template<typename _Tp>
281*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
282*e4b17023SJohn Marino       { return __x == __y; }
283*e4b17023SJohn Marino   };
284*e4b17023SJohn Marino 
285*e4b17023SJohn Marino   struct __not_equal_to
286*e4b17023SJohn Marino   {
287*e4b17023SJohn Marino     template<typename _Tp>
288*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
289*e4b17023SJohn Marino       { return __x != __y; }
290*e4b17023SJohn Marino   };
291*e4b17023SJohn Marino 
292*e4b17023SJohn Marino   struct __less
293*e4b17023SJohn Marino   {
294*e4b17023SJohn Marino     template<typename _Tp>
295*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
296*e4b17023SJohn Marino       { return __x < __y; }
297*e4b17023SJohn Marino   };
298*e4b17023SJohn Marino 
299*e4b17023SJohn Marino   struct __greater
300*e4b17023SJohn Marino   {
301*e4b17023SJohn Marino     template<typename _Tp>
302*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
303*e4b17023SJohn Marino       { return __x > __y; }
304*e4b17023SJohn Marino   };
305*e4b17023SJohn Marino 
306*e4b17023SJohn Marino   struct __less_equal
307*e4b17023SJohn Marino   {
308*e4b17023SJohn Marino     template<typename _Tp>
309*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
310*e4b17023SJohn Marino       { return __x <= __y; }
311*e4b17023SJohn Marino   };
312*e4b17023SJohn Marino 
313*e4b17023SJohn Marino   struct __greater_equal
314*e4b17023SJohn Marino   {
315*e4b17023SJohn Marino     template<typename _Tp>
316*e4b17023SJohn Marino       bool operator()(const _Tp& __x, const _Tp& __y) const
317*e4b17023SJohn Marino       { return __x >= __y; }
318*e4b17023SJohn Marino   };
319*e4b17023SJohn Marino 
320*e4b17023SJohn Marino   // The few binary functions we miss.
321*e4b17023SJohn Marino   struct _Atan2
322*e4b17023SJohn Marino   {
323*e4b17023SJohn Marino     template<typename _Tp>
324*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
325*e4b17023SJohn Marino       { return atan2(__x, __y); }
326*e4b17023SJohn Marino   };
327*e4b17023SJohn Marino 
328*e4b17023SJohn Marino   struct _Pow
329*e4b17023SJohn Marino   {
330*e4b17023SJohn Marino     template<typename _Tp>
331*e4b17023SJohn Marino       _Tp operator()(const _Tp& __x, const _Tp& __y) const
332*e4b17023SJohn Marino       { return pow(__x, __y); }
333*e4b17023SJohn Marino   };
334*e4b17023SJohn Marino 
335*e4b17023SJohn Marino 
336*e4b17023SJohn Marino   // We need these bits in order to recover the return type of
337*e4b17023SJohn Marino   // some functions/operators now that we're no longer using
338*e4b17023SJohn Marino   // function templates.
339*e4b17023SJohn Marino   template<typename, typename _Tp>
340*e4b17023SJohn Marino     struct __fun
341*e4b17023SJohn Marino     {
342*e4b17023SJohn Marino       typedef _Tp result_type;
343*e4b17023SJohn Marino     };
344*e4b17023SJohn Marino 
345*e4b17023SJohn Marino   // several specializations for relational operators.
346*e4b17023SJohn Marino   template<typename _Tp>
347*e4b17023SJohn Marino     struct __fun<__logical_not, _Tp>
348*e4b17023SJohn Marino     {
349*e4b17023SJohn Marino       typedef bool result_type;
350*e4b17023SJohn Marino     };
351*e4b17023SJohn Marino 
352*e4b17023SJohn Marino   template<typename _Tp>
353*e4b17023SJohn Marino     struct __fun<__logical_and, _Tp>
354*e4b17023SJohn Marino     {
355*e4b17023SJohn Marino       typedef bool result_type;
356*e4b17023SJohn Marino     };
357*e4b17023SJohn Marino 
358*e4b17023SJohn Marino   template<typename _Tp>
359*e4b17023SJohn Marino     struct __fun<__logical_or, _Tp>
360*e4b17023SJohn Marino     {
361*e4b17023SJohn Marino       typedef bool result_type;
362*e4b17023SJohn Marino     };
363*e4b17023SJohn Marino 
364*e4b17023SJohn Marino   template<typename _Tp>
365*e4b17023SJohn Marino     struct __fun<__less, _Tp>
366*e4b17023SJohn Marino     {
367*e4b17023SJohn Marino       typedef bool result_type;
368*e4b17023SJohn Marino     };
369*e4b17023SJohn Marino 
370*e4b17023SJohn Marino   template<typename _Tp>
371*e4b17023SJohn Marino     struct __fun<__greater, _Tp>
372*e4b17023SJohn Marino     {
373*e4b17023SJohn Marino       typedef bool result_type;
374*e4b17023SJohn Marino     };
375*e4b17023SJohn Marino 
376*e4b17023SJohn Marino   template<typename _Tp>
377*e4b17023SJohn Marino     struct __fun<__less_equal, _Tp>
378*e4b17023SJohn Marino     {
379*e4b17023SJohn Marino       typedef bool result_type;
380*e4b17023SJohn Marino     };
381*e4b17023SJohn Marino 
382*e4b17023SJohn Marino   template<typename _Tp>
383*e4b17023SJohn Marino     struct __fun<__greater_equal, _Tp>
384*e4b17023SJohn Marino     {
385*e4b17023SJohn Marino       typedef bool result_type;
386*e4b17023SJohn Marino     };
387*e4b17023SJohn Marino 
388*e4b17023SJohn Marino   template<typename _Tp>
389*e4b17023SJohn Marino     struct __fun<__equal_to, _Tp>
390*e4b17023SJohn Marino     {
391*e4b17023SJohn Marino       typedef bool result_type;
392*e4b17023SJohn Marino     };
393*e4b17023SJohn Marino 
394*e4b17023SJohn Marino   template<typename _Tp>
395*e4b17023SJohn Marino     struct __fun<__not_equal_to, _Tp>
396*e4b17023SJohn Marino     {
397*e4b17023SJohn Marino       typedef bool result_type;
398*e4b17023SJohn Marino     };
399*e4b17023SJohn Marino 
400*e4b17023SJohn Marino   //
401*e4b17023SJohn Marino   // Apply function taking a value/const reference closure
402*e4b17023SJohn Marino   //
403*e4b17023SJohn Marino 
404*e4b17023SJohn Marino   template<typename _Dom, typename _Arg>
405*e4b17023SJohn Marino     class _FunBase
406*e4b17023SJohn Marino     {
407*e4b17023SJohn Marino     public:
408*e4b17023SJohn Marino       typedef typename _Dom::value_type value_type;
409*e4b17023SJohn Marino 
410*e4b17023SJohn Marino       _FunBase(const _Dom& __e, value_type __f(_Arg))
411*e4b17023SJohn Marino       : _M_expr(__e), _M_func(__f) {}
412*e4b17023SJohn Marino 
413*e4b17023SJohn Marino       value_type operator[](size_t __i) const
414*e4b17023SJohn Marino       { return _M_func (_M_expr[__i]); }
415*e4b17023SJohn Marino 
416*e4b17023SJohn Marino       size_t size() const { return _M_expr.size ();}
417*e4b17023SJohn Marino 
418*e4b17023SJohn Marino     private:
419*e4b17023SJohn Marino       const _Dom& _M_expr;
420*e4b17023SJohn Marino       value_type (*_M_func)(_Arg);
421*e4b17023SJohn Marino     };
422*e4b17023SJohn Marino 
423*e4b17023SJohn Marino   template<class _Dom>
424*e4b17023SJohn Marino     struct _ValFunClos<_Expr,_Dom> : _FunBase<_Dom, typename _Dom::value_type>
425*e4b17023SJohn Marino     {
426*e4b17023SJohn Marino       typedef _FunBase<_Dom, typename _Dom::value_type> _Base;
427*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
428*e4b17023SJohn Marino       typedef value_type _Tp;
429*e4b17023SJohn Marino 
430*e4b17023SJohn Marino       _ValFunClos(const _Dom& __e, _Tp __f(_Tp)) : _Base(__e, __f) {}
431*e4b17023SJohn Marino     };
432*e4b17023SJohn Marino 
433*e4b17023SJohn Marino   template<typename _Tp>
434*e4b17023SJohn Marino     struct _ValFunClos<_ValArray,_Tp> : _FunBase<valarray<_Tp>, _Tp>
435*e4b17023SJohn Marino     {
436*e4b17023SJohn Marino       typedef _FunBase<valarray<_Tp>, _Tp> _Base;
437*e4b17023SJohn Marino       typedef _Tp value_type;
438*e4b17023SJohn Marino 
439*e4b17023SJohn Marino       _ValFunClos(const valarray<_Tp>& __v, _Tp __f(_Tp)) : _Base(__v, __f) {}
440*e4b17023SJohn Marino     };
441*e4b17023SJohn Marino 
442*e4b17023SJohn Marino   template<class _Dom>
443*e4b17023SJohn Marino     struct _RefFunClos<_Expr, _Dom>
444*e4b17023SJohn Marino     : _FunBase<_Dom, const typename _Dom::value_type&>
445*e4b17023SJohn Marino     {
446*e4b17023SJohn Marino       typedef _FunBase<_Dom, const typename _Dom::value_type&> _Base;
447*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
448*e4b17023SJohn Marino       typedef value_type _Tp;
449*e4b17023SJohn Marino 
450*e4b17023SJohn Marino       _RefFunClos(const _Dom& __e, _Tp __f(const _Tp&))
451*e4b17023SJohn Marino       : _Base(__e, __f) {}
452*e4b17023SJohn Marino     };
453*e4b17023SJohn Marino 
454*e4b17023SJohn Marino   template<typename _Tp>
455*e4b17023SJohn Marino     struct _RefFunClos<_ValArray, _Tp>
456*e4b17023SJohn Marino     : _FunBase<valarray<_Tp>, const _Tp&>
457*e4b17023SJohn Marino     {
458*e4b17023SJohn Marino       typedef _FunBase<valarray<_Tp>, const _Tp&> _Base;
459*e4b17023SJohn Marino       typedef _Tp value_type;
460*e4b17023SJohn Marino 
461*e4b17023SJohn Marino       _RefFunClos(const valarray<_Tp>& __v, _Tp __f(const _Tp&))
462*e4b17023SJohn Marino       : _Base(__v, __f) {}
463*e4b17023SJohn Marino     };
464*e4b17023SJohn Marino 
465*e4b17023SJohn Marino   //
466*e4b17023SJohn Marino   // Unary expression closure.
467*e4b17023SJohn Marino   //
468*e4b17023SJohn Marino 
469*e4b17023SJohn Marino   template<class _Oper, class _Arg>
470*e4b17023SJohn Marino     class _UnBase
471*e4b17023SJohn Marino     {
472*e4b17023SJohn Marino     public:
473*e4b17023SJohn Marino       typedef typename _Arg::value_type _Vt;
474*e4b17023SJohn Marino       typedef typename __fun<_Oper, _Vt>::result_type value_type;
475*e4b17023SJohn Marino 
476*e4b17023SJohn Marino       _UnBase(const _Arg& __e) : _M_expr(__e) {}
477*e4b17023SJohn Marino 
478*e4b17023SJohn Marino       value_type operator[](size_t __i) const
479*e4b17023SJohn Marino       { return _Oper()(_M_expr[__i]); }
480*e4b17023SJohn Marino 
481*e4b17023SJohn Marino       size_t size() const { return _M_expr.size(); }
482*e4b17023SJohn Marino 
483*e4b17023SJohn Marino     private:
484*e4b17023SJohn Marino       const _Arg& _M_expr;
485*e4b17023SJohn Marino     };
486*e4b17023SJohn Marino 
487*e4b17023SJohn Marino   template<class _Oper, class _Dom>
488*e4b17023SJohn Marino     struct _UnClos<_Oper, _Expr, _Dom>
489*e4b17023SJohn Marino     : _UnBase<_Oper, _Dom>
490*e4b17023SJohn Marino     {
491*e4b17023SJohn Marino       typedef _Dom _Arg;
492*e4b17023SJohn Marino       typedef _UnBase<_Oper, _Dom> _Base;
493*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
494*e4b17023SJohn Marino 
495*e4b17023SJohn Marino       _UnClos(const _Arg& __e) : _Base(__e) {}
496*e4b17023SJohn Marino     };
497*e4b17023SJohn Marino 
498*e4b17023SJohn Marino   template<class _Oper, typename _Tp>
499*e4b17023SJohn Marino     struct _UnClos<_Oper, _ValArray, _Tp>
500*e4b17023SJohn Marino     : _UnBase<_Oper, valarray<_Tp> >
501*e4b17023SJohn Marino     {
502*e4b17023SJohn Marino       typedef valarray<_Tp> _Arg;
503*e4b17023SJohn Marino       typedef _UnBase<_Oper, valarray<_Tp> > _Base;
504*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
505*e4b17023SJohn Marino 
506*e4b17023SJohn Marino       _UnClos(const _Arg& __e) : _Base(__e) {}
507*e4b17023SJohn Marino     };
508*e4b17023SJohn Marino 
509*e4b17023SJohn Marino 
510*e4b17023SJohn Marino   //
511*e4b17023SJohn Marino   // Binary expression closure.
512*e4b17023SJohn Marino   //
513*e4b17023SJohn Marino 
514*e4b17023SJohn Marino   template<class _Oper, class _FirstArg, class _SecondArg>
515*e4b17023SJohn Marino     class _BinBase
516*e4b17023SJohn Marino     {
517*e4b17023SJohn Marino     public:
518*e4b17023SJohn Marino       typedef typename _FirstArg::value_type _Vt;
519*e4b17023SJohn Marino       typedef typename __fun<_Oper, _Vt>::result_type value_type;
520*e4b17023SJohn Marino 
521*e4b17023SJohn Marino       _BinBase(const _FirstArg& __e1, const _SecondArg& __e2)
522*e4b17023SJohn Marino       : _M_expr1(__e1), _M_expr2(__e2) {}
523*e4b17023SJohn Marino 
524*e4b17023SJohn Marino       value_type operator[](size_t __i) const
525*e4b17023SJohn Marino       { return _Oper()(_M_expr1[__i], _M_expr2[__i]); }
526*e4b17023SJohn Marino 
527*e4b17023SJohn Marino       size_t size() const { return _M_expr1.size(); }
528*e4b17023SJohn Marino 
529*e4b17023SJohn Marino     private:
530*e4b17023SJohn Marino       const _FirstArg& _M_expr1;
531*e4b17023SJohn Marino       const _SecondArg& _M_expr2;
532*e4b17023SJohn Marino     };
533*e4b17023SJohn Marino 
534*e4b17023SJohn Marino 
535*e4b17023SJohn Marino   template<class _Oper, class _Clos>
536*e4b17023SJohn Marino     class _BinBase2
537*e4b17023SJohn Marino     {
538*e4b17023SJohn Marino     public:
539*e4b17023SJohn Marino       typedef typename _Clos::value_type _Vt;
540*e4b17023SJohn Marino       typedef typename __fun<_Oper, _Vt>::result_type value_type;
541*e4b17023SJohn Marino 
542*e4b17023SJohn Marino       _BinBase2(const _Clos& __e, const _Vt& __t)
543*e4b17023SJohn Marino       : _M_expr1(__e), _M_expr2(__t) {}
544*e4b17023SJohn Marino 
545*e4b17023SJohn Marino       value_type operator[](size_t __i) const
546*e4b17023SJohn Marino       { return _Oper()(_M_expr1[__i], _M_expr2); }
547*e4b17023SJohn Marino 
548*e4b17023SJohn Marino       size_t size() const { return _M_expr1.size(); }
549*e4b17023SJohn Marino 
550*e4b17023SJohn Marino     private:
551*e4b17023SJohn Marino       const _Clos& _M_expr1;
552*e4b17023SJohn Marino       const _Vt& _M_expr2;
553*e4b17023SJohn Marino     };
554*e4b17023SJohn Marino 
555*e4b17023SJohn Marino   template<class _Oper, class _Clos>
556*e4b17023SJohn Marino     class _BinBase1
557*e4b17023SJohn Marino     {
558*e4b17023SJohn Marino     public:
559*e4b17023SJohn Marino       typedef typename _Clos::value_type _Vt;
560*e4b17023SJohn Marino       typedef typename __fun<_Oper, _Vt>::result_type value_type;
561*e4b17023SJohn Marino 
562*e4b17023SJohn Marino       _BinBase1(const _Vt& __t, const _Clos& __e)
563*e4b17023SJohn Marino       : _M_expr1(__t), _M_expr2(__e) {}
564*e4b17023SJohn Marino 
565*e4b17023SJohn Marino       value_type operator[](size_t __i) const
566*e4b17023SJohn Marino       { return _Oper()(_M_expr1, _M_expr2[__i]); }
567*e4b17023SJohn Marino 
568*e4b17023SJohn Marino       size_t size() const { return _M_expr2.size(); }
569*e4b17023SJohn Marino 
570*e4b17023SJohn Marino     private:
571*e4b17023SJohn Marino       const _Vt& _M_expr1;
572*e4b17023SJohn Marino       const _Clos& _M_expr2;
573*e4b17023SJohn Marino     };
574*e4b17023SJohn Marino 
575*e4b17023SJohn Marino   template<class _Oper, class _Dom1, class _Dom2>
576*e4b17023SJohn Marino     struct _BinClos<_Oper, _Expr, _Expr, _Dom1, _Dom2>
577*e4b17023SJohn Marino     : _BinBase<_Oper, _Dom1, _Dom2>
578*e4b17023SJohn Marino     {
579*e4b17023SJohn Marino       typedef _BinBase<_Oper, _Dom1, _Dom2> _Base;
580*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
581*e4b17023SJohn Marino 
582*e4b17023SJohn Marino       _BinClos(const _Dom1& __e1, const _Dom2& __e2) : _Base(__e1, __e2) {}
583*e4b17023SJohn Marino     };
584*e4b17023SJohn Marino 
585*e4b17023SJohn Marino   template<class _Oper, typename _Tp>
586*e4b17023SJohn Marino     struct _BinClos<_Oper,_ValArray, _ValArray, _Tp, _Tp>
587*e4b17023SJohn Marino     : _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> >
588*e4b17023SJohn Marino     {
589*e4b17023SJohn Marino       typedef _BinBase<_Oper, valarray<_Tp>, valarray<_Tp> > _Base;
590*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
591*e4b17023SJohn Marino 
592*e4b17023SJohn Marino       _BinClos(const valarray<_Tp>& __v, const valarray<_Tp>& __w)
593*e4b17023SJohn Marino       : _Base(__v, __w) {}
594*e4b17023SJohn Marino     };
595*e4b17023SJohn Marino 
596*e4b17023SJohn Marino   template<class _Oper, class _Dom>
597*e4b17023SJohn Marino     struct _BinClos<_Oper, _Expr, _ValArray, _Dom, typename _Dom::value_type>
598*e4b17023SJohn Marino     : _BinBase<_Oper, _Dom, valarray<typename _Dom::value_type> >
599*e4b17023SJohn Marino     {
600*e4b17023SJohn Marino       typedef typename _Dom::value_type _Tp;
601*e4b17023SJohn Marino       typedef _BinBase<_Oper,_Dom,valarray<_Tp> > _Base;
602*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
603*e4b17023SJohn Marino 
604*e4b17023SJohn Marino       _BinClos(const _Dom& __e1, const valarray<_Tp>& __e2)
605*e4b17023SJohn Marino       : _Base(__e1, __e2) {}
606*e4b17023SJohn Marino     };
607*e4b17023SJohn Marino 
608*e4b17023SJohn Marino   template<class _Oper, class _Dom>
609*e4b17023SJohn Marino     struct _BinClos<_Oper, _ValArray, _Expr, typename _Dom::value_type, _Dom>
610*e4b17023SJohn Marino     : _BinBase<_Oper, valarray<typename _Dom::value_type>,_Dom>
611*e4b17023SJohn Marino     {
612*e4b17023SJohn Marino       typedef typename _Dom::value_type _Tp;
613*e4b17023SJohn Marino       typedef _BinBase<_Oper, valarray<_Tp>, _Dom> _Base;
614*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
615*e4b17023SJohn Marino 
616*e4b17023SJohn Marino       _BinClos(const valarray<_Tp>& __e1, const _Dom& __e2)
617*e4b17023SJohn Marino       : _Base(__e1, __e2) {}
618*e4b17023SJohn Marino     };
619*e4b17023SJohn Marino 
620*e4b17023SJohn Marino   template<class _Oper, class _Dom>
621*e4b17023SJohn Marino     struct _BinClos<_Oper, _Expr, _Constant, _Dom, typename _Dom::value_type>
622*e4b17023SJohn Marino     : _BinBase2<_Oper, _Dom>
623*e4b17023SJohn Marino     {
624*e4b17023SJohn Marino       typedef typename _Dom::value_type _Tp;
625*e4b17023SJohn Marino       typedef _BinBase2<_Oper,_Dom> _Base;
626*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
627*e4b17023SJohn Marino 
628*e4b17023SJohn Marino       _BinClos(const _Dom& __e1, const _Tp& __e2) : _Base(__e1, __e2) {}
629*e4b17023SJohn Marino     };
630*e4b17023SJohn Marino 
631*e4b17023SJohn Marino   template<class _Oper, class _Dom>
632*e4b17023SJohn Marino     struct _BinClos<_Oper, _Constant, _Expr, typename _Dom::value_type, _Dom>
633*e4b17023SJohn Marino     : _BinBase1<_Oper, _Dom>
634*e4b17023SJohn Marino     {
635*e4b17023SJohn Marino       typedef typename _Dom::value_type _Tp;
636*e4b17023SJohn Marino       typedef _BinBase1<_Oper, _Dom> _Base;
637*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
638*e4b17023SJohn Marino 
639*e4b17023SJohn Marino       _BinClos(const _Tp& __e1, const _Dom& __e2) : _Base(__e1, __e2) {}
640*e4b17023SJohn Marino     };
641*e4b17023SJohn Marino 
642*e4b17023SJohn Marino   template<class _Oper, typename _Tp>
643*e4b17023SJohn Marino     struct _BinClos<_Oper, _ValArray, _Constant, _Tp, _Tp>
644*e4b17023SJohn Marino     : _BinBase2<_Oper, valarray<_Tp> >
645*e4b17023SJohn Marino     {
646*e4b17023SJohn Marino       typedef _BinBase2<_Oper,valarray<_Tp> > _Base;
647*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
648*e4b17023SJohn Marino 
649*e4b17023SJohn Marino       _BinClos(const valarray<_Tp>& __v, const _Tp& __t) : _Base(__v, __t) {}
650*e4b17023SJohn Marino     };
651*e4b17023SJohn Marino 
652*e4b17023SJohn Marino   template<class _Oper, typename _Tp>
653*e4b17023SJohn Marino     struct _BinClos<_Oper, _Constant, _ValArray, _Tp, _Tp>
654*e4b17023SJohn Marino     : _BinBase1<_Oper, valarray<_Tp> >
655*e4b17023SJohn Marino     {
656*e4b17023SJohn Marino       typedef _BinBase1<_Oper, valarray<_Tp> > _Base;
657*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
658*e4b17023SJohn Marino 
659*e4b17023SJohn Marino       _BinClos(const _Tp& __t, const valarray<_Tp>& __v) : _Base(__t, __v) {}
660*e4b17023SJohn Marino     };
661*e4b17023SJohn Marino 
662*e4b17023SJohn Marino     //
663*e4b17023SJohn Marino     // slice_array closure.
664*e4b17023SJohn Marino     //
665*e4b17023SJohn Marino   template<typename _Dom>
666*e4b17023SJohn Marino     class _SBase
667*e4b17023SJohn Marino     {
668*e4b17023SJohn Marino     public:
669*e4b17023SJohn Marino       typedef typename _Dom::value_type value_type;
670*e4b17023SJohn Marino 
671*e4b17023SJohn Marino       _SBase (const _Dom& __e, const slice& __s)
672*e4b17023SJohn Marino       : _M_expr (__e), _M_slice (__s) {}
673*e4b17023SJohn Marino 
674*e4b17023SJohn Marino       value_type
675*e4b17023SJohn Marino       operator[] (size_t __i) const
676*e4b17023SJohn Marino       { return _M_expr[_M_slice.start () + __i * _M_slice.stride ()]; }
677*e4b17023SJohn Marino 
678*e4b17023SJohn Marino       size_t
679*e4b17023SJohn Marino       size() const
680*e4b17023SJohn Marino       { return _M_slice.size (); }
681*e4b17023SJohn Marino 
682*e4b17023SJohn Marino     private:
683*e4b17023SJohn Marino       const _Dom& _M_expr;
684*e4b17023SJohn Marino       const slice& _M_slice;
685*e4b17023SJohn Marino     };
686*e4b17023SJohn Marino 
687*e4b17023SJohn Marino   template<typename _Tp>
688*e4b17023SJohn Marino     class _SBase<_Array<_Tp> >
689*e4b17023SJohn Marino     {
690*e4b17023SJohn Marino     public:
691*e4b17023SJohn Marino       typedef _Tp value_type;
692*e4b17023SJohn Marino 
693*e4b17023SJohn Marino       _SBase (_Array<_Tp> __a, const slice& __s)
694*e4b17023SJohn Marino       : _M_array (__a._M_data+__s.start()), _M_size (__s.size()),
695*e4b17023SJohn Marino 	_M_stride (__s.stride()) {}
696*e4b17023SJohn Marino 
697*e4b17023SJohn Marino       value_type
698*e4b17023SJohn Marino       operator[] (size_t __i) const
699*e4b17023SJohn Marino       { return _M_array._M_data[__i * _M_stride]; }
700*e4b17023SJohn Marino 
701*e4b17023SJohn Marino       size_t
702*e4b17023SJohn Marino       size() const
703*e4b17023SJohn Marino       { return _M_size; }
704*e4b17023SJohn Marino 
705*e4b17023SJohn Marino     private:
706*e4b17023SJohn Marino       const _Array<_Tp> _M_array;
707*e4b17023SJohn Marino       const size_t _M_size;
708*e4b17023SJohn Marino       const size_t _M_stride;
709*e4b17023SJohn Marino     };
710*e4b17023SJohn Marino 
711*e4b17023SJohn Marino   template<class _Dom>
712*e4b17023SJohn Marino     struct _SClos<_Expr, _Dom>
713*e4b17023SJohn Marino     : _SBase<_Dom>
714*e4b17023SJohn Marino     {
715*e4b17023SJohn Marino       typedef _SBase<_Dom> _Base;
716*e4b17023SJohn Marino       typedef typename _Base::value_type value_type;
717*e4b17023SJohn Marino 
718*e4b17023SJohn Marino       _SClos (const _Dom& __e, const slice& __s) : _Base (__e, __s) {}
719*e4b17023SJohn Marino     };
720*e4b17023SJohn Marino 
721*e4b17023SJohn Marino   template<typename _Tp>
722*e4b17023SJohn Marino     struct _SClos<_ValArray, _Tp>
723*e4b17023SJohn Marino     : _SBase<_Array<_Tp> >
724*e4b17023SJohn Marino     {
725*e4b17023SJohn Marino       typedef  _SBase<_Array<_Tp> > _Base;
726*e4b17023SJohn Marino       typedef _Tp value_type;
727*e4b17023SJohn Marino 
728*e4b17023SJohn Marino       _SClos (_Array<_Tp> __a, const slice& __s) : _Base (__a, __s) {}
729*e4b17023SJohn Marino     };
730*e4b17023SJohn Marino 
731*e4b17023SJohn Marino _GLIBCXX_END_NAMESPACE_VERSION
732*e4b17023SJohn Marino } // namespace
733*e4b17023SJohn Marino 
734*e4b17023SJohn Marino #endif /* _CPP_VALARRAY_BEFORE_H */
735