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