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