xref: /freebsd/contrib/llvm-project/libcxx/include/valarray (revision e8d8bef961a50d4dc22501cde4fb9fb0be1b2532)
10b57cec5SDimitry Andric// -*- C++ -*-
20b57cec5SDimitry Andric//===-------------------------- valarray ----------------------------------===//
30b57cec5SDimitry Andric//
40b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
50b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information.
60b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
70b57cec5SDimitry Andric//
80b57cec5SDimitry Andric//===----------------------------------------------------------------------===//
90b57cec5SDimitry Andric
100b57cec5SDimitry Andric#ifndef _LIBCPP_VALARRAY
110b57cec5SDimitry Andric#define _LIBCPP_VALARRAY
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric/*
140b57cec5SDimitry Andric    valarray synopsis
150b57cec5SDimitry Andric
160b57cec5SDimitry Andricnamespace std
170b57cec5SDimitry Andric{
180b57cec5SDimitry Andric
190b57cec5SDimitry Andrictemplate<class T>
200b57cec5SDimitry Andricclass valarray
210b57cec5SDimitry Andric{
220b57cec5SDimitry Andricpublic:
230b57cec5SDimitry Andric    typedef T value_type;
240b57cec5SDimitry Andric
250b57cec5SDimitry Andric    // construct/destroy:
260b57cec5SDimitry Andric    valarray();
270b57cec5SDimitry Andric    explicit valarray(size_t n);
280b57cec5SDimitry Andric    valarray(const value_type& x, size_t n);
290b57cec5SDimitry Andric    valarray(const value_type* px, size_t n);
300b57cec5SDimitry Andric    valarray(const valarray& v);
310b57cec5SDimitry Andric    valarray(valarray&& v) noexcept;
320b57cec5SDimitry Andric    valarray(const slice_array<value_type>& sa);
330b57cec5SDimitry Andric    valarray(const gslice_array<value_type>& ga);
340b57cec5SDimitry Andric    valarray(const mask_array<value_type>& ma);
350b57cec5SDimitry Andric    valarray(const indirect_array<value_type>& ia);
360b57cec5SDimitry Andric    valarray(initializer_list<value_type> il);
370b57cec5SDimitry Andric    ~valarray();
380b57cec5SDimitry Andric
390b57cec5SDimitry Andric    // assignment:
400b57cec5SDimitry Andric    valarray& operator=(const valarray& v);
410b57cec5SDimitry Andric    valarray& operator=(valarray&& v) noexcept;
420b57cec5SDimitry Andric    valarray& operator=(initializer_list<value_type> il);
430b57cec5SDimitry Andric    valarray& operator=(const value_type& x);
440b57cec5SDimitry Andric    valarray& operator=(const slice_array<value_type>& sa);
450b57cec5SDimitry Andric    valarray& operator=(const gslice_array<value_type>& ga);
460b57cec5SDimitry Andric    valarray& operator=(const mask_array<value_type>& ma);
470b57cec5SDimitry Andric    valarray& operator=(const indirect_array<value_type>& ia);
480b57cec5SDimitry Andric
490b57cec5SDimitry Andric    // element access:
500b57cec5SDimitry Andric    const value_type& operator[](size_t i) const;
510b57cec5SDimitry Andric    value_type&       operator[](size_t i);
520b57cec5SDimitry Andric
530b57cec5SDimitry Andric    // subset operations:
540b57cec5SDimitry Andric    valarray                   operator[](slice s) const;
550b57cec5SDimitry Andric    slice_array<value_type>    operator[](slice s);
560b57cec5SDimitry Andric    valarray                   operator[](const gslice& gs) const;
570b57cec5SDimitry Andric    gslice_array<value_type>   operator[](const gslice& gs);
580b57cec5SDimitry Andric    valarray                   operator[](const valarray<bool>& vb) const;
590b57cec5SDimitry Andric    mask_array<value_type>     operator[](const valarray<bool>& vb);
600b57cec5SDimitry Andric    valarray                   operator[](const valarray<size_t>& vs) const;
610b57cec5SDimitry Andric    indirect_array<value_type> operator[](const valarray<size_t>& vs);
620b57cec5SDimitry Andric
630b57cec5SDimitry Andric    // unary operators:
640b57cec5SDimitry Andric    valarray       operator+() const;
650b57cec5SDimitry Andric    valarray       operator-() const;
660b57cec5SDimitry Andric    valarray       operator~() const;
670b57cec5SDimitry Andric    valarray<bool> operator!() const;
680b57cec5SDimitry Andric
690b57cec5SDimitry Andric    // computed assignment:
700b57cec5SDimitry Andric    valarray& operator*= (const value_type& x);
710b57cec5SDimitry Andric    valarray& operator/= (const value_type& x);
720b57cec5SDimitry Andric    valarray& operator%= (const value_type& x);
730b57cec5SDimitry Andric    valarray& operator+= (const value_type& x);
740b57cec5SDimitry Andric    valarray& operator-= (const value_type& x);
750b57cec5SDimitry Andric    valarray& operator^= (const value_type& x);
760b57cec5SDimitry Andric    valarray& operator&= (const value_type& x);
770b57cec5SDimitry Andric    valarray& operator|= (const value_type& x);
780b57cec5SDimitry Andric    valarray& operator<<=(const value_type& x);
790b57cec5SDimitry Andric    valarray& operator>>=(const value_type& x);
800b57cec5SDimitry Andric
810b57cec5SDimitry Andric    valarray& operator*= (const valarray& v);
820b57cec5SDimitry Andric    valarray& operator/= (const valarray& v);
830b57cec5SDimitry Andric    valarray& operator%= (const valarray& v);
840b57cec5SDimitry Andric    valarray& operator+= (const valarray& v);
850b57cec5SDimitry Andric    valarray& operator-= (const valarray& v);
860b57cec5SDimitry Andric    valarray& operator^= (const valarray& v);
870b57cec5SDimitry Andric    valarray& operator|= (const valarray& v);
880b57cec5SDimitry Andric    valarray& operator&= (const valarray& v);
890b57cec5SDimitry Andric    valarray& operator<<=(const valarray& v);
900b57cec5SDimitry Andric    valarray& operator>>=(const valarray& v);
910b57cec5SDimitry Andric
920b57cec5SDimitry Andric    // member functions:
930b57cec5SDimitry Andric    void swap(valarray& v) noexcept;
940b57cec5SDimitry Andric
950b57cec5SDimitry Andric    size_t size() const;
960b57cec5SDimitry Andric
970b57cec5SDimitry Andric    value_type sum() const;
980b57cec5SDimitry Andric    value_type min() const;
990b57cec5SDimitry Andric    value_type max() const;
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric    valarray shift (int i) const;
1020b57cec5SDimitry Andric    valarray cshift(int i) const;
1030b57cec5SDimitry Andric    valarray apply(value_type f(value_type)) const;
1040b57cec5SDimitry Andric    valarray apply(value_type f(const value_type&)) const;
1050b57cec5SDimitry Andric    void resize(size_t n, value_type x = value_type());
1060b57cec5SDimitry Andric};
1070b57cec5SDimitry Andric
1080b57cec5SDimitry Andricclass slice
1090b57cec5SDimitry Andric{
1100b57cec5SDimitry Andricpublic:
1110b57cec5SDimitry Andric    slice();
1120b57cec5SDimitry Andric    slice(size_t start, size_t size, size_t stride);
1130b57cec5SDimitry Andric
1140b57cec5SDimitry Andric    size_t start()  const;
1150b57cec5SDimitry Andric    size_t size()   const;
1160b57cec5SDimitry Andric    size_t stride() const;
1170b57cec5SDimitry Andric};
1180b57cec5SDimitry Andric
1190b57cec5SDimitry Andrictemplate <class T>
1200b57cec5SDimitry Andricclass slice_array
1210b57cec5SDimitry Andric{
1220b57cec5SDimitry Andricpublic:
1230b57cec5SDimitry Andric    typedef T value_type;
1240b57cec5SDimitry Andric
1250b57cec5SDimitry Andric    const slice_array& operator=(const slice_array& sa) const;
1260b57cec5SDimitry Andric    void operator=  (const valarray<value_type>& v) const;
1270b57cec5SDimitry Andric    void operator*= (const valarray<value_type>& v) const;
1280b57cec5SDimitry Andric    void operator/= (const valarray<value_type>& v) const;
1290b57cec5SDimitry Andric    void operator%= (const valarray<value_type>& v) const;
1300b57cec5SDimitry Andric    void operator+= (const valarray<value_type>& v) const;
1310b57cec5SDimitry Andric    void operator-= (const valarray<value_type>& v) const;
1320b57cec5SDimitry Andric    void operator^= (const valarray<value_type>& v) const;
1330b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
1340b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
1350b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
1360b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
1370b57cec5SDimitry Andric
1380b57cec5SDimitry Andric    void operator=(const value_type& x) const;
139*e8d8bef9SDimitry Andric    void operator=(const valarray<T>& val_arr) const;
1400b57cec5SDimitry Andric
1410b57cec5SDimitry Andric    slice_array() = delete;
1420b57cec5SDimitry Andric};
1430b57cec5SDimitry Andric
1440b57cec5SDimitry Andricclass gslice
1450b57cec5SDimitry Andric{
1460b57cec5SDimitry Andricpublic:
1470b57cec5SDimitry Andric    gslice();
1480b57cec5SDimitry Andric    gslice(size_t start, const valarray<size_t>& size,
1490b57cec5SDimitry Andric                         const valarray<size_t>& stride);
1500b57cec5SDimitry Andric
1510b57cec5SDimitry Andric    size_t           start()  const;
1520b57cec5SDimitry Andric    valarray<size_t> size()   const;
1530b57cec5SDimitry Andric    valarray<size_t> stride() const;
1540b57cec5SDimitry Andric};
1550b57cec5SDimitry Andric
1560b57cec5SDimitry Andrictemplate <class T>
1570b57cec5SDimitry Andricclass gslice_array
1580b57cec5SDimitry Andric{
1590b57cec5SDimitry Andricpublic:
1600b57cec5SDimitry Andric    typedef T value_type;
1610b57cec5SDimitry Andric
1620b57cec5SDimitry Andric    void operator=  (const valarray<value_type>& v) const;
1630b57cec5SDimitry Andric    void operator*= (const valarray<value_type>& v) const;
1640b57cec5SDimitry Andric    void operator/= (const valarray<value_type>& v) const;
1650b57cec5SDimitry Andric    void operator%= (const valarray<value_type>& v) const;
1660b57cec5SDimitry Andric    void operator+= (const valarray<value_type>& v) const;
1670b57cec5SDimitry Andric    void operator-= (const valarray<value_type>& v) const;
1680b57cec5SDimitry Andric    void operator^= (const valarray<value_type>& v) const;
1690b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
1700b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
1710b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
1720b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
1730b57cec5SDimitry Andric
1740b57cec5SDimitry Andric    gslice_array(const gslice_array& ga);
1750b57cec5SDimitry Andric    ~gslice_array();
1760b57cec5SDimitry Andric    const gslice_array& operator=(const gslice_array& ga) const;
1770b57cec5SDimitry Andric    void operator=(const value_type& x) const;
1780b57cec5SDimitry Andric
1790b57cec5SDimitry Andric    gslice_array() = delete;
1800b57cec5SDimitry Andric};
1810b57cec5SDimitry Andric
1820b57cec5SDimitry Andrictemplate <class T>
1830b57cec5SDimitry Andricclass mask_array
1840b57cec5SDimitry Andric{
1850b57cec5SDimitry Andricpublic:
1860b57cec5SDimitry Andric    typedef T value_type;
1870b57cec5SDimitry Andric
1880b57cec5SDimitry Andric    void operator=  (const valarray<value_type>& v) const;
1890b57cec5SDimitry Andric    void operator*= (const valarray<value_type>& v) const;
1900b57cec5SDimitry Andric    void operator/= (const valarray<value_type>& v) const;
1910b57cec5SDimitry Andric    void operator%= (const valarray<value_type>& v) const;
1920b57cec5SDimitry Andric    void operator+= (const valarray<value_type>& v) const;
1930b57cec5SDimitry Andric    void operator-= (const valarray<value_type>& v) const;
1940b57cec5SDimitry Andric    void operator^= (const valarray<value_type>& v) const;
1950b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
1960b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
1970b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
1980b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
1990b57cec5SDimitry Andric
2000b57cec5SDimitry Andric    mask_array(const mask_array& ma);
2010b57cec5SDimitry Andric    ~mask_array();
2020b57cec5SDimitry Andric    const mask_array& operator=(const mask_array& ma) const;
2030b57cec5SDimitry Andric    void operator=(const value_type& x) const;
2040b57cec5SDimitry Andric
2050b57cec5SDimitry Andric    mask_array() = delete;
2060b57cec5SDimitry Andric};
2070b57cec5SDimitry Andric
2080b57cec5SDimitry Andrictemplate <class T>
2090b57cec5SDimitry Andricclass indirect_array
2100b57cec5SDimitry Andric{
2110b57cec5SDimitry Andricpublic:
2120b57cec5SDimitry Andric    typedef T value_type;
2130b57cec5SDimitry Andric
2140b57cec5SDimitry Andric    void operator=  (const valarray<value_type>& v) const;
2150b57cec5SDimitry Andric    void operator*= (const valarray<value_type>& v) const;
2160b57cec5SDimitry Andric    void operator/= (const valarray<value_type>& v) const;
2170b57cec5SDimitry Andric    void operator%= (const valarray<value_type>& v) const;
2180b57cec5SDimitry Andric    void operator+= (const valarray<value_type>& v) const;
2190b57cec5SDimitry Andric    void operator-= (const valarray<value_type>& v) const;
2200b57cec5SDimitry Andric    void operator^= (const valarray<value_type>& v) const;
2210b57cec5SDimitry Andric    void operator&= (const valarray<value_type>& v) const;
2220b57cec5SDimitry Andric    void operator|= (const valarray<value_type>& v) const;
2230b57cec5SDimitry Andric    void operator<<=(const valarray<value_type>& v) const;
2240b57cec5SDimitry Andric    void operator>>=(const valarray<value_type>& v) const;
2250b57cec5SDimitry Andric
2260b57cec5SDimitry Andric    indirect_array(const indirect_array& ia);
2270b57cec5SDimitry Andric    ~indirect_array();
2280b57cec5SDimitry Andric    const indirect_array& operator=(const indirect_array& ia) const;
2290b57cec5SDimitry Andric    void operator=(const value_type& x) const;
2300b57cec5SDimitry Andric
2310b57cec5SDimitry Andric    indirect_array() = delete;
2320b57cec5SDimitry Andric};
2330b57cec5SDimitry Andric
2340b57cec5SDimitry Andrictemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
2350b57cec5SDimitry Andric
2360b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
2370b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
2380b57cec5SDimitry Andrictemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
2390b57cec5SDimitry Andric
2400b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
2410b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
2420b57cec5SDimitry Andrictemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
2430b57cec5SDimitry Andric
2440b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
2450b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
2460b57cec5SDimitry Andrictemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
2470b57cec5SDimitry Andric
2480b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
2490b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
2500b57cec5SDimitry Andrictemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
2510b57cec5SDimitry Andric
2520b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
2530b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
2540b57cec5SDimitry Andrictemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
2550b57cec5SDimitry Andric
2560b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
2570b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
2580b57cec5SDimitry Andrictemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
2590b57cec5SDimitry Andric
2600b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
2610b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
2620b57cec5SDimitry Andrictemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
2630b57cec5SDimitry Andric
2640b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
2650b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
2660b57cec5SDimitry Andrictemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
2670b57cec5SDimitry Andric
2680b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
2690b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
2700b57cec5SDimitry Andrictemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
2710b57cec5SDimitry Andric
2720b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
2730b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
2740b57cec5SDimitry Andrictemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
2750b57cec5SDimitry Andric
2760b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
2770b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
2780b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
2790b57cec5SDimitry Andric
2800b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
2810b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
2820b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
2850b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
2860b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
2870b57cec5SDimitry Andric
2880b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
2890b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
2900b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
2910b57cec5SDimitry Andric
2920b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
2930b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
2940b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
2950b57cec5SDimitry Andric
2960b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
2970b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
2980b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
2990b57cec5SDimitry Andric
3000b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
3010b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
3020b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
3030b57cec5SDimitry Andric
3040b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
3050b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
3060b57cec5SDimitry Andrictemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
3070b57cec5SDimitry Andric
3080b57cec5SDimitry Andrictemplate<class T> valarray<T> abs (const valarray<T>& x);
3090b57cec5SDimitry Andrictemplate<class T> valarray<T> acos (const valarray<T>& x);
3100b57cec5SDimitry Andrictemplate<class T> valarray<T> asin (const valarray<T>& x);
3110b57cec5SDimitry Andrictemplate<class T> valarray<T> atan (const valarray<T>& x);
3120b57cec5SDimitry Andric
3130b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
3140b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
3150b57cec5SDimitry Andrictemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andrictemplate<class T> valarray<T> cos (const valarray<T>& x);
3180b57cec5SDimitry Andrictemplate<class T> valarray<T> cosh (const valarray<T>& x);
3190b57cec5SDimitry Andrictemplate<class T> valarray<T> exp (const valarray<T>& x);
3200b57cec5SDimitry Andrictemplate<class T> valarray<T> log (const valarray<T>& x);
3210b57cec5SDimitry Andrictemplate<class T> valarray<T> log10(const valarray<T>& x);
3220b57cec5SDimitry Andric
3230b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
3240b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y);
3250b57cec5SDimitry Andrictemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y);
3260b57cec5SDimitry Andric
3270b57cec5SDimitry Andrictemplate<class T> valarray<T> sin (const valarray<T>& x);
3280b57cec5SDimitry Andrictemplate<class T> valarray<T> sinh (const valarray<T>& x);
3290b57cec5SDimitry Andrictemplate<class T> valarray<T> sqrt (const valarray<T>& x);
3300b57cec5SDimitry Andrictemplate<class T> valarray<T> tan (const valarray<T>& x);
3310b57cec5SDimitry Andrictemplate<class T> valarray<T> tanh (const valarray<T>& x);
3320b57cec5SDimitry Andric
3330b57cec5SDimitry Andrictemplate <class T> unspecified1 begin(valarray<T>& v);
3340b57cec5SDimitry Andrictemplate <class T> unspecified2 begin(const valarray<T>& v);
3350b57cec5SDimitry Andrictemplate <class T> unspecified1 end(valarray<T>& v);
3360b57cec5SDimitry Andrictemplate <class T> unspecified2 end(const valarray<T>& v);
3370b57cec5SDimitry Andric
3380b57cec5SDimitry Andric}  // std
3390b57cec5SDimitry Andric
3400b57cec5SDimitry Andric*/
3410b57cec5SDimitry Andric
3420b57cec5SDimitry Andric#include <__config>
3430b57cec5SDimitry Andric#include <cstddef>
3440b57cec5SDimitry Andric#include <cmath>
3450b57cec5SDimitry Andric#include <initializer_list>
3460b57cec5SDimitry Andric#include <algorithm>
3470b57cec5SDimitry Andric#include <functional>
3480b57cec5SDimitry Andric#include <new>
3490b57cec5SDimitry Andric
3500b57cec5SDimitry Andric#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3510b57cec5SDimitry Andric#pragma GCC system_header
3520b57cec5SDimitry Andric#endif
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andric_LIBCPP_PUSH_MACROS
3550b57cec5SDimitry Andric#include <__undef_macros>
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric
3580b57cec5SDimitry Andric_LIBCPP_BEGIN_NAMESPACE_STD
3590b57cec5SDimitry Andric
3600b57cec5SDimitry Andrictemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
3610b57cec5SDimitry Andric
3620b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice
3630b57cec5SDimitry Andric{
3640b57cec5SDimitry Andric    size_t __start_;
3650b57cec5SDimitry Andric    size_t __size_;
3660b57cec5SDimitry Andric    size_t __stride_;
3670b57cec5SDimitry Andricpublic:
3680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
3690b57cec5SDimitry Andric    slice()
3700b57cec5SDimitry Andric        : __start_(0),
3710b57cec5SDimitry Andric          __size_(0),
3720b57cec5SDimitry Andric          __stride_(0)
3730b57cec5SDimitry Andric          {}
3740b57cec5SDimitry Andric
3750b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
3760b57cec5SDimitry Andric    slice(size_t __start, size_t __size, size_t __stride)
3770b57cec5SDimitry Andric        : __start_(__start),
3780b57cec5SDimitry Andric          __size_(__size),
3790b57cec5SDimitry Andric          __stride_(__stride)
3800b57cec5SDimitry Andric          {}
3810b57cec5SDimitry Andric
3820b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_t start()  const {return __start_;}
3830b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_t size()   const {return __size_;}
3840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
3850b57cec5SDimitry Andric};
3860b57cec5SDimitry Andric
3870b57cec5SDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
3880b57cec5SDimitry Andricclass _LIBCPP_TYPE_VIS gslice;
3890b57cec5SDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
3900b57cec5SDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
3910b57cec5SDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
3920b57cec5SDimitry Andric
3930b57cec5SDimitry Andrictemplate <class _Tp>
3940b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
3950b57cec5SDimitry Andric_Tp*
3960b57cec5SDimitry Andricbegin(valarray<_Tp>& __v);
3970b57cec5SDimitry Andric
3980b57cec5SDimitry Andrictemplate <class _Tp>
3990b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4000b57cec5SDimitry Andricconst _Tp*
4010b57cec5SDimitry Andricbegin(const valarray<_Tp>& __v);
4020b57cec5SDimitry Andric
4030b57cec5SDimitry Andrictemplate <class _Tp>
4040b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4050b57cec5SDimitry Andric_Tp*
4060b57cec5SDimitry Andricend(valarray<_Tp>& __v);
4070b57cec5SDimitry Andric
4080b57cec5SDimitry Andrictemplate <class _Tp>
4090b57cec5SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4100b57cec5SDimitry Andricconst _Tp*
4110b57cec5SDimitry Andricend(const valarray<_Tp>& __v);
4120b57cec5SDimitry Andric
4130b57cec5SDimitry Andrictemplate <class _Op, class _A0>
4140b57cec5SDimitry Andricstruct _UnaryOp
4150b57cec5SDimitry Andric{
4160b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
4170b57cec5SDimitry Andric    typedef typename _A0::value_type value_type;
4180b57cec5SDimitry Andric
4190b57cec5SDimitry Andric    _Op __op_;
4200b57cec5SDimitry Andric    _A0 __a0_;
4210b57cec5SDimitry Andric
4220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4230b57cec5SDimitry Andric    _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
4240b57cec5SDimitry Andric
4250b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4260b57cec5SDimitry Andric    result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
4270b57cec5SDimitry Andric
4280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4290b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
4300b57cec5SDimitry Andric};
4310b57cec5SDimitry Andric
4320b57cec5SDimitry Andrictemplate <class _Op, class _A0, class _A1>
4330b57cec5SDimitry Andricstruct _BinaryOp
4340b57cec5SDimitry Andric{
4350b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
4360b57cec5SDimitry Andric    typedef typename _A0::value_type value_type;
4370b57cec5SDimitry Andric
4380b57cec5SDimitry Andric    _Op __op_;
4390b57cec5SDimitry Andric    _A0 __a0_;
4400b57cec5SDimitry Andric    _A1 __a1_;
4410b57cec5SDimitry Andric
4420b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4430b57cec5SDimitry Andric    _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
4440b57cec5SDimitry Andric        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
4450b57cec5SDimitry Andric
4460b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4470b57cec5SDimitry Andric    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
4480b57cec5SDimitry Andric
4490b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4500b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
4510b57cec5SDimitry Andric};
4520b57cec5SDimitry Andric
4530b57cec5SDimitry Andrictemplate <class _Tp>
4540b57cec5SDimitry Andricclass __scalar_expr
4550b57cec5SDimitry Andric{
4560b57cec5SDimitry Andricpublic:
4570b57cec5SDimitry Andric    typedef _Tp        value_type;
4580b57cec5SDimitry Andric    typedef const _Tp& result_type;
4590b57cec5SDimitry Andricprivate:
4600b57cec5SDimitry Andric    const value_type& __t_;
4610b57cec5SDimitry Andric    size_t __s_;
4620b57cec5SDimitry Andricpublic:
4630b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4640b57cec5SDimitry Andric    explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
4650b57cec5SDimitry Andric
4660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4670b57cec5SDimitry Andric    result_type operator[](size_t) const {return __t_;}
4680b57cec5SDimitry Andric
4690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4700b57cec5SDimitry Andric    size_t size() const {return __s_;}
4710b57cec5SDimitry Andric};
4720b57cec5SDimitry Andric
4730b57cec5SDimitry Andrictemplate <class _Tp>
4740b57cec5SDimitry Andricstruct __unary_plus : unary_function<_Tp, _Tp>
4750b57cec5SDimitry Andric{
4760b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4770b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
4780b57cec5SDimitry Andric        {return +__x;}
4790b57cec5SDimitry Andric};
4800b57cec5SDimitry Andric
4810b57cec5SDimitry Andrictemplate <class _Tp>
4820b57cec5SDimitry Andricstruct __bit_not  : unary_function<_Tp, _Tp>
4830b57cec5SDimitry Andric{
4840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4850b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
4860b57cec5SDimitry Andric        {return ~__x;}
4870b57cec5SDimitry Andric};
4880b57cec5SDimitry Andric
4890b57cec5SDimitry Andrictemplate <class _Tp>
4900b57cec5SDimitry Andricstruct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
4910b57cec5SDimitry Andric{
4920b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
4930b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x, const _Tp& __y) const
4940b57cec5SDimitry Andric        {return __x << __y;}
4950b57cec5SDimitry Andric};
4960b57cec5SDimitry Andric
4970b57cec5SDimitry Andrictemplate <class _Tp>
4980b57cec5SDimitry Andricstruct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
4990b57cec5SDimitry Andric{
5000b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5010b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5020b57cec5SDimitry Andric        {return __x >> __y;}
5030b57cec5SDimitry Andric};
5040b57cec5SDimitry Andric
5050b57cec5SDimitry Andrictemplate <class _Tp, class _Fp>
5060b57cec5SDimitry Andricstruct __apply_expr   : unary_function<_Tp, _Tp>
5070b57cec5SDimitry Andric{
5080b57cec5SDimitry Andricprivate:
5090b57cec5SDimitry Andric    _Fp __f_;
5100b57cec5SDimitry Andricpublic:
5110b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5120b57cec5SDimitry Andric    explicit __apply_expr(_Fp __f) : __f_(__f) {}
5130b57cec5SDimitry Andric
5140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5150b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5160b57cec5SDimitry Andric        {return __f_(__x);}
5170b57cec5SDimitry Andric};
5180b57cec5SDimitry Andric
5190b57cec5SDimitry Andrictemplate <class _Tp>
5200b57cec5SDimitry Andricstruct __abs_expr : unary_function<_Tp, _Tp>
5210b57cec5SDimitry Andric{
5220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5230b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5240b57cec5SDimitry Andric        {return abs(__x);}
5250b57cec5SDimitry Andric};
5260b57cec5SDimitry Andric
5270b57cec5SDimitry Andrictemplate <class _Tp>
5280b57cec5SDimitry Andricstruct __acos_expr : unary_function<_Tp, _Tp>
5290b57cec5SDimitry Andric{
5300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5310b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5320b57cec5SDimitry Andric        {return acos(__x);}
5330b57cec5SDimitry Andric};
5340b57cec5SDimitry Andric
5350b57cec5SDimitry Andrictemplate <class _Tp>
5360b57cec5SDimitry Andricstruct __asin_expr : unary_function<_Tp, _Tp>
5370b57cec5SDimitry Andric{
5380b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5390b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5400b57cec5SDimitry Andric        {return asin(__x);}
5410b57cec5SDimitry Andric};
5420b57cec5SDimitry Andric
5430b57cec5SDimitry Andrictemplate <class _Tp>
5440b57cec5SDimitry Andricstruct __atan_expr : unary_function<_Tp, _Tp>
5450b57cec5SDimitry Andric{
5460b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5470b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5480b57cec5SDimitry Andric        {return atan(__x);}
5490b57cec5SDimitry Andric};
5500b57cec5SDimitry Andric
5510b57cec5SDimitry Andrictemplate <class _Tp>
5520b57cec5SDimitry Andricstruct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
5530b57cec5SDimitry Andric{
5540b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5550b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5560b57cec5SDimitry Andric        {return atan2(__x, __y);}
5570b57cec5SDimitry Andric};
5580b57cec5SDimitry Andric
5590b57cec5SDimitry Andrictemplate <class _Tp>
5600b57cec5SDimitry Andricstruct __cos_expr : unary_function<_Tp, _Tp>
5610b57cec5SDimitry Andric{
5620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5630b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5640b57cec5SDimitry Andric        {return cos(__x);}
5650b57cec5SDimitry Andric};
5660b57cec5SDimitry Andric
5670b57cec5SDimitry Andrictemplate <class _Tp>
5680b57cec5SDimitry Andricstruct __cosh_expr : unary_function<_Tp, _Tp>
5690b57cec5SDimitry Andric{
5700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5710b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5720b57cec5SDimitry Andric        {return cosh(__x);}
5730b57cec5SDimitry Andric};
5740b57cec5SDimitry Andric
5750b57cec5SDimitry Andrictemplate <class _Tp>
5760b57cec5SDimitry Andricstruct __exp_expr : unary_function<_Tp, _Tp>
5770b57cec5SDimitry Andric{
5780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5790b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5800b57cec5SDimitry Andric        {return exp(__x);}
5810b57cec5SDimitry Andric};
5820b57cec5SDimitry Andric
5830b57cec5SDimitry Andrictemplate <class _Tp>
5840b57cec5SDimitry Andricstruct __log_expr : unary_function<_Tp, _Tp>
5850b57cec5SDimitry Andric{
5860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5870b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5880b57cec5SDimitry Andric        {return log(__x);}
5890b57cec5SDimitry Andric};
5900b57cec5SDimitry Andric
5910b57cec5SDimitry Andrictemplate <class _Tp>
5920b57cec5SDimitry Andricstruct __log10_expr : unary_function<_Tp, _Tp>
5930b57cec5SDimitry Andric{
5940b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
5950b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
5960b57cec5SDimitry Andric        {return log10(__x);}
5970b57cec5SDimitry Andric};
5980b57cec5SDimitry Andric
5990b57cec5SDimitry Andrictemplate <class _Tp>
6000b57cec5SDimitry Andricstruct __pow_expr : binary_function<_Tp, _Tp, _Tp>
6010b57cec5SDimitry Andric{
6020b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6030b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x, const _Tp& __y) const
6040b57cec5SDimitry Andric        {return pow(__x, __y);}
6050b57cec5SDimitry Andric};
6060b57cec5SDimitry Andric
6070b57cec5SDimitry Andrictemplate <class _Tp>
6080b57cec5SDimitry Andricstruct __sin_expr : unary_function<_Tp, _Tp>
6090b57cec5SDimitry Andric{
6100b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6110b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
6120b57cec5SDimitry Andric        {return sin(__x);}
6130b57cec5SDimitry Andric};
6140b57cec5SDimitry Andric
6150b57cec5SDimitry Andrictemplate <class _Tp>
6160b57cec5SDimitry Andricstruct __sinh_expr : unary_function<_Tp, _Tp>
6170b57cec5SDimitry Andric{
6180b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6190b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
6200b57cec5SDimitry Andric        {return sinh(__x);}
6210b57cec5SDimitry Andric};
6220b57cec5SDimitry Andric
6230b57cec5SDimitry Andrictemplate <class _Tp>
6240b57cec5SDimitry Andricstruct __sqrt_expr : unary_function<_Tp, _Tp>
6250b57cec5SDimitry Andric{
6260b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6270b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
6280b57cec5SDimitry Andric        {return sqrt(__x);}
6290b57cec5SDimitry Andric};
6300b57cec5SDimitry Andric
6310b57cec5SDimitry Andrictemplate <class _Tp>
6320b57cec5SDimitry Andricstruct __tan_expr : unary_function<_Tp, _Tp>
6330b57cec5SDimitry Andric{
6340b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6350b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
6360b57cec5SDimitry Andric        {return tan(__x);}
6370b57cec5SDimitry Andric};
6380b57cec5SDimitry Andric
6390b57cec5SDimitry Andrictemplate <class _Tp>
6400b57cec5SDimitry Andricstruct __tanh_expr : unary_function<_Tp, _Tp>
6410b57cec5SDimitry Andric{
6420b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6430b57cec5SDimitry Andric    _Tp operator()(const _Tp& __x) const
6440b57cec5SDimitry Andric        {return tanh(__x);}
6450b57cec5SDimitry Andric};
6460b57cec5SDimitry Andric
6470b57cec5SDimitry Andrictemplate <class _ValExpr>
6480b57cec5SDimitry Andricclass __slice_expr
6490b57cec5SDimitry Andric{
6500b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
6510b57cec5SDimitry Andricpublic:
6520b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
6530b57cec5SDimitry Andric    typedef value_type result_type;
6540b57cec5SDimitry Andric
6550b57cec5SDimitry Andricprivate:
6560b57cec5SDimitry Andric    _ValExpr __expr_;
6570b57cec5SDimitry Andric    size_t __start_;
6580b57cec5SDimitry Andric    size_t __size_;
6590b57cec5SDimitry Andric    size_t __stride_;
6600b57cec5SDimitry Andric
6610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6620b57cec5SDimitry Andric    __slice_expr(const slice& __sl, const _RmExpr& __e)
6630b57cec5SDimitry Andric        : __expr_(__e),
6640b57cec5SDimitry Andric          __start_(__sl.start()),
6650b57cec5SDimitry Andric          __size_(__sl.size()),
6660b57cec5SDimitry Andric          __stride_(__sl.stride())
6670b57cec5SDimitry Andric        {}
6680b57cec5SDimitry Andricpublic:
6690b57cec5SDimitry Andric
6700b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6710b57cec5SDimitry Andric    result_type operator[](size_t __i) const
6720b57cec5SDimitry Andric        {return __expr_[__start_ + __i * __stride_];}
6730b57cec5SDimitry Andric
6740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
6750b57cec5SDimitry Andric    size_t size() const {return __size_;}
6760b57cec5SDimitry Andric
6770b57cec5SDimitry Andric    template <class> friend class __val_expr;
6780b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
6790b57cec5SDimitry Andric};
6800b57cec5SDimitry Andric
6810b57cec5SDimitry Andrictemplate <class _ValExpr>
6820b57cec5SDimitry Andricclass __mask_expr;
6830b57cec5SDimitry Andric
6840b57cec5SDimitry Andrictemplate <class _ValExpr>
6850b57cec5SDimitry Andricclass __indirect_expr;
6860b57cec5SDimitry Andric
6870b57cec5SDimitry Andrictemplate <class _ValExpr>
6880b57cec5SDimitry Andricclass __shift_expr
6890b57cec5SDimitry Andric{
6900b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
6910b57cec5SDimitry Andricpublic:
6920b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
6930b57cec5SDimitry Andric    typedef value_type result_type;
6940b57cec5SDimitry Andric
6950b57cec5SDimitry Andricprivate:
6960b57cec5SDimitry Andric    _ValExpr __expr_;
6970b57cec5SDimitry Andric    size_t __size_;
6980b57cec5SDimitry Andric    ptrdiff_t __ul_;
6990b57cec5SDimitry Andric    ptrdiff_t __sn_;
7000b57cec5SDimitry Andric    ptrdiff_t __n_;
7010b57cec5SDimitry Andric    static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
7020b57cec5SDimitry Andric                                    sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
7030b57cec5SDimitry Andric
7040b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7050b57cec5SDimitry Andric    __shift_expr(int __n, const _RmExpr& __e)
7060b57cec5SDimitry Andric        : __expr_(__e),
7070b57cec5SDimitry Andric          __size_(__e.size()),
7080b57cec5SDimitry Andric          __n_(__n)
7090b57cec5SDimitry Andric        {
7100b57cec5SDimitry Andric            ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
7110b57cec5SDimitry Andric            __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
7120b57cec5SDimitry Andric            __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
7130b57cec5SDimitry Andric        }
7140b57cec5SDimitry Andricpublic:
7150b57cec5SDimitry Andric
7160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7170b57cec5SDimitry Andric    result_type operator[](size_t __j) const
7180b57cec5SDimitry Andric        {
7190b57cec5SDimitry Andric            ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
7200b57cec5SDimitry Andric            ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
7210b57cec5SDimitry Andric            return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
7220b57cec5SDimitry Andric        }
7230b57cec5SDimitry Andric
7240b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7250b57cec5SDimitry Andric    size_t size() const {return __size_;}
7260b57cec5SDimitry Andric
7270b57cec5SDimitry Andric    template <class> friend class __val_expr;
7280b57cec5SDimitry Andric};
7290b57cec5SDimitry Andric
7300b57cec5SDimitry Andrictemplate <class _ValExpr>
7310b57cec5SDimitry Andricclass __cshift_expr
7320b57cec5SDimitry Andric{
7330b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
7340b57cec5SDimitry Andricpublic:
7350b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
7360b57cec5SDimitry Andric    typedef value_type result_type;
7370b57cec5SDimitry Andric
7380b57cec5SDimitry Andricprivate:
7390b57cec5SDimitry Andric    _ValExpr __expr_;
7400b57cec5SDimitry Andric    size_t __size_;
7410b57cec5SDimitry Andric    size_t __m_;
7420b57cec5SDimitry Andric    size_t __o1_;
7430b57cec5SDimitry Andric    size_t __o2_;
7440b57cec5SDimitry Andric
7450b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7460b57cec5SDimitry Andric    __cshift_expr(int __n, const _RmExpr& __e)
7470b57cec5SDimitry Andric        : __expr_(__e),
7480b57cec5SDimitry Andric          __size_(__e.size())
7490b57cec5SDimitry Andric        {
7500b57cec5SDimitry Andric            __n %= static_cast<int>(__size_);
7510b57cec5SDimitry Andric            if (__n >= 0)
7520b57cec5SDimitry Andric            {
7530b57cec5SDimitry Andric                __m_ = __size_ - __n;
7540b57cec5SDimitry Andric                __o1_ = __n;
7550b57cec5SDimitry Andric                __o2_ = __n - __size_;
7560b57cec5SDimitry Andric            }
7570b57cec5SDimitry Andric            else
7580b57cec5SDimitry Andric            {
7590b57cec5SDimitry Andric                __m_ = -__n;
7600b57cec5SDimitry Andric                __o1_ = __n + __size_;
7610b57cec5SDimitry Andric                __o2_ = __n;
7620b57cec5SDimitry Andric            }
7630b57cec5SDimitry Andric        }
7640b57cec5SDimitry Andricpublic:
7650b57cec5SDimitry Andric
7660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7670b57cec5SDimitry Andric    result_type operator[](size_t __i) const
7680b57cec5SDimitry Andric        {
7690b57cec5SDimitry Andric            if (__i < __m_)
7700b57cec5SDimitry Andric                return __expr_[__i + __o1_];
7710b57cec5SDimitry Andric            return __expr_[__i + __o2_];
7720b57cec5SDimitry Andric        }
7730b57cec5SDimitry Andric
7740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
7750b57cec5SDimitry Andric    size_t size() const {return __size_;}
7760b57cec5SDimitry Andric
7770b57cec5SDimitry Andric    template <class> friend class __val_expr;
7780b57cec5SDimitry Andric};
7790b57cec5SDimitry Andric
7800b57cec5SDimitry Andrictemplate<class _ValExpr>
7810b57cec5SDimitry Andricclass __val_expr;
7820b57cec5SDimitry Andric
7830b57cec5SDimitry Andrictemplate<class _ValExpr>
7840b57cec5SDimitry Andricstruct __is_val_expr : false_type {};
7850b57cec5SDimitry Andric
7860b57cec5SDimitry Andrictemplate<class _ValExpr>
7870b57cec5SDimitry Andricstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
7880b57cec5SDimitry Andric
7890b57cec5SDimitry Andrictemplate<class _Tp>
7900b57cec5SDimitry Andricstruct __is_val_expr<valarray<_Tp> > : true_type {};
7910b57cec5SDimitry Andric
7920b57cec5SDimitry Andrictemplate<class _Tp>
7930b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS valarray
7940b57cec5SDimitry Andric{
7950b57cec5SDimitry Andricpublic:
7960b57cec5SDimitry Andric    typedef _Tp value_type;
7970b57cec5SDimitry Andric    typedef _Tp result_type;
7980b57cec5SDimitry Andric
7990b57cec5SDimitry Andricprivate:
8000b57cec5SDimitry Andric    value_type* __begin_;
8010b57cec5SDimitry Andric    value_type* __end_;
8020b57cec5SDimitry Andric
8030b57cec5SDimitry Andricpublic:
8040b57cec5SDimitry Andric    // construct/destroy:
8050b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
806*e8d8bef9SDimitry Andric    valarray() : __begin_(nullptr), __end_(nullptr) {}
8070b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
8080b57cec5SDimitry Andric    explicit valarray(size_t __n);
8090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8100b57cec5SDimitry Andric    valarray(const value_type& __x, size_t __n);
8110b57cec5SDimitry Andric    valarray(const value_type* __p, size_t __n);
8120b57cec5SDimitry Andric    valarray(const valarray& __v);
8130b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8150b57cec5SDimitry Andric    valarray(valarray&& __v) _NOEXCEPT;
8160b57cec5SDimitry Andric    valarray(initializer_list<value_type> __il);
8170b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8180b57cec5SDimitry Andric    valarray(const slice_array<value_type>& __sa);
8190b57cec5SDimitry Andric    valarray(const gslice_array<value_type>& __ga);
8200b57cec5SDimitry Andric    valarray(const mask_array<value_type>& __ma);
8210b57cec5SDimitry Andric    valarray(const indirect_array<value_type>& __ia);
8220b57cec5SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
8230b57cec5SDimitry Andric    ~valarray();
8240b57cec5SDimitry Andric
8250b57cec5SDimitry Andric    // assignment:
8260b57cec5SDimitry Andric    valarray& operator=(const valarray& __v);
8270b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8280b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8290b57cec5SDimitry Andric    valarray& operator=(valarray&& __v) _NOEXCEPT;
8300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8310b57cec5SDimitry Andric    valarray& operator=(initializer_list<value_type>);
8320b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8330b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8340b57cec5SDimitry Andric    valarray& operator=(const value_type& __x);
8350b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8360b57cec5SDimitry Andric    valarray& operator=(const slice_array<value_type>& __sa);
8370b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8380b57cec5SDimitry Andric    valarray& operator=(const gslice_array<value_type>& __ga);
8390b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8400b57cec5SDimitry Andric    valarray& operator=(const mask_array<value_type>& __ma);
8410b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8420b57cec5SDimitry Andric    valarray& operator=(const indirect_array<value_type>& __ia);
8430b57cec5SDimitry Andric    template <class _ValExpr>
8440b57cec5SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8450b57cec5SDimitry Andric        valarray& operator=(const __val_expr<_ValExpr>& __v);
8460b57cec5SDimitry Andric
8470b57cec5SDimitry Andric    // element access:
8480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8490b57cec5SDimitry Andric    const value_type& operator[](size_t __i) const {return __begin_[__i];}
8500b57cec5SDimitry Andric
8510b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8520b57cec5SDimitry Andric    value_type&       operator[](size_t __i)       {return __begin_[__i];}
8530b57cec5SDimitry Andric
8540b57cec5SDimitry Andric    // subset operations:
8550b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8560b57cec5SDimitry Andric    __val_expr<__slice_expr<const valarray&> >    operator[](slice __s) const;
8570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8580b57cec5SDimitry Andric    slice_array<value_type>                       operator[](slice __s);
8590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8600b57cec5SDimitry Andric    __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
8610b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8620b57cec5SDimitry Andric    gslice_array<value_type>   operator[](const gslice& __gs);
8630b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8640b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8650b57cec5SDimitry Andric    __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
8660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8670b57cec5SDimitry Andric    gslice_array<value_type>                      operator[](gslice&& __gs);
8680b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8700b57cec5SDimitry Andric    __val_expr<__mask_expr<const valarray&> >     operator[](const valarray<bool>& __vb) const;
8710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8720b57cec5SDimitry Andric    mask_array<value_type>                        operator[](const valarray<bool>& __vb);
8730b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8750b57cec5SDimitry Andric    __val_expr<__mask_expr<const valarray&> >     operator[](valarray<bool>&& __vb) const;
8760b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8770b57cec5SDimitry Andric    mask_array<value_type>                        operator[](valarray<bool>&& __vb);
8780b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8790b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8800b57cec5SDimitry Andric    __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
8810b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8820b57cec5SDimitry Andric    indirect_array<value_type>                    operator[](const valarray<size_t>& __vs);
8830b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8850b57cec5SDimitry Andric    __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
8860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8870b57cec5SDimitry Andric    indirect_array<value_type>                    operator[](valarray<size_t>&& __vs);
8880b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8890b57cec5SDimitry Andric
8900b57cec5SDimitry Andric    // unary operators:
8910b57cec5SDimitry Andric    valarray       operator+() const;
8920b57cec5SDimitry Andric    valarray       operator-() const;
8930b57cec5SDimitry Andric    valarray       operator~() const;
8940b57cec5SDimitry Andric    valarray<bool> operator!() const;
8950b57cec5SDimitry Andric
8960b57cec5SDimitry Andric    // computed assignment:
8970b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8980b57cec5SDimitry Andric    valarray& operator*= (const value_type& __x);
8990b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9000b57cec5SDimitry Andric    valarray& operator/= (const value_type& __x);
9010b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9020b57cec5SDimitry Andric    valarray& operator%= (const value_type& __x);
9030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9040b57cec5SDimitry Andric    valarray& operator+= (const value_type& __x);
9050b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9060b57cec5SDimitry Andric    valarray& operator-= (const value_type& __x);
9070b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9080b57cec5SDimitry Andric    valarray& operator^= (const value_type& __x);
9090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9100b57cec5SDimitry Andric    valarray& operator&= (const value_type& __x);
9110b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9120b57cec5SDimitry Andric    valarray& operator|= (const value_type& __x);
9130b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9140b57cec5SDimitry Andric    valarray& operator<<=(const value_type& __x);
9150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9160b57cec5SDimitry Andric    valarray& operator>>=(const value_type& __x);
9170b57cec5SDimitry Andric
9180b57cec5SDimitry Andric    template <class _Expr>
9190b57cec5SDimitry Andric    typename enable_if
9200b57cec5SDimitry Andric    <
9210b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9220b57cec5SDimitry Andric        valarray&
9230b57cec5SDimitry Andric    >::type
9240b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9250b57cec5SDimitry Andric    operator*= (const _Expr& __v);
9260b57cec5SDimitry Andric
9270b57cec5SDimitry Andric    template <class _Expr>
9280b57cec5SDimitry Andric    typename enable_if
9290b57cec5SDimitry Andric    <
9300b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9310b57cec5SDimitry Andric        valarray&
9320b57cec5SDimitry Andric    >::type
9330b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9340b57cec5SDimitry Andric    operator/= (const _Expr& __v);
9350b57cec5SDimitry Andric
9360b57cec5SDimitry Andric    template <class _Expr>
9370b57cec5SDimitry Andric    typename enable_if
9380b57cec5SDimitry Andric    <
9390b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9400b57cec5SDimitry Andric        valarray&
9410b57cec5SDimitry Andric    >::type
9420b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9430b57cec5SDimitry Andric    operator%= (const _Expr& __v);
9440b57cec5SDimitry Andric
9450b57cec5SDimitry Andric    template <class _Expr>
9460b57cec5SDimitry Andric    typename enable_if
9470b57cec5SDimitry Andric    <
9480b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9490b57cec5SDimitry Andric        valarray&
9500b57cec5SDimitry Andric    >::type
9510b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9520b57cec5SDimitry Andric    operator+= (const _Expr& __v);
9530b57cec5SDimitry Andric
9540b57cec5SDimitry Andric    template <class _Expr>
9550b57cec5SDimitry Andric    typename enable_if
9560b57cec5SDimitry Andric    <
9570b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9580b57cec5SDimitry Andric        valarray&
9590b57cec5SDimitry Andric    >::type
9600b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9610b57cec5SDimitry Andric    operator-= (const _Expr& __v);
9620b57cec5SDimitry Andric
9630b57cec5SDimitry Andric    template <class _Expr>
9640b57cec5SDimitry Andric    typename enable_if
9650b57cec5SDimitry Andric    <
9660b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9670b57cec5SDimitry Andric        valarray&
9680b57cec5SDimitry Andric    >::type
9690b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9700b57cec5SDimitry Andric    operator^= (const _Expr& __v);
9710b57cec5SDimitry Andric
9720b57cec5SDimitry Andric    template <class _Expr>
9730b57cec5SDimitry Andric    typename enable_if
9740b57cec5SDimitry Andric    <
9750b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9760b57cec5SDimitry Andric        valarray&
9770b57cec5SDimitry Andric    >::type
9780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9790b57cec5SDimitry Andric    operator|= (const _Expr& __v);
9800b57cec5SDimitry Andric
9810b57cec5SDimitry Andric    template <class _Expr>
9820b57cec5SDimitry Andric    typename enable_if
9830b57cec5SDimitry Andric    <
9840b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9850b57cec5SDimitry Andric        valarray&
9860b57cec5SDimitry Andric    >::type
9870b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9880b57cec5SDimitry Andric    operator&= (const _Expr& __v);
9890b57cec5SDimitry Andric
9900b57cec5SDimitry Andric    template <class _Expr>
9910b57cec5SDimitry Andric    typename enable_if
9920b57cec5SDimitry Andric    <
9930b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
9940b57cec5SDimitry Andric        valarray&
9950b57cec5SDimitry Andric    >::type
9960b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9970b57cec5SDimitry Andric    operator<<= (const _Expr& __v);
9980b57cec5SDimitry Andric
9990b57cec5SDimitry Andric    template <class _Expr>
10000b57cec5SDimitry Andric    typename enable_if
10010b57cec5SDimitry Andric    <
10020b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
10030b57cec5SDimitry Andric        valarray&
10040b57cec5SDimitry Andric    >::type
10050b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10060b57cec5SDimitry Andric    operator>>= (const _Expr& __v);
10070b57cec5SDimitry Andric
10080b57cec5SDimitry Andric    // member functions:
10090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10100b57cec5SDimitry Andric    void swap(valarray& __v) _NOEXCEPT;
10110b57cec5SDimitry Andric
10120b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10130b57cec5SDimitry Andric    size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
10140b57cec5SDimitry Andric
10150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10160b57cec5SDimitry Andric    value_type sum() const;
10170b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10180b57cec5SDimitry Andric    value_type min() const;
10190b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10200b57cec5SDimitry Andric    value_type max() const;
10210b57cec5SDimitry Andric
10220b57cec5SDimitry Andric    valarray shift (int __i) const;
10230b57cec5SDimitry Andric    valarray cshift(int __i) const;
10240b57cec5SDimitry Andric    valarray apply(value_type __f(value_type)) const;
10250b57cec5SDimitry Andric    valarray apply(value_type __f(const value_type&)) const;
10260b57cec5SDimitry Andric    void     resize(size_t __n, value_type __x = value_type());
10270b57cec5SDimitry Andric
10280b57cec5SDimitry Andricprivate:
10290b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
10300b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
10310b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
10320b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
10330b57cec5SDimitry Andric    template <class> friend class __mask_expr;
10340b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
10350b57cec5SDimitry Andric    template <class> friend class __indirect_expr;
10360b57cec5SDimitry Andric    template <class> friend class __val_expr;
10370b57cec5SDimitry Andric
10380b57cec5SDimitry Andric    template <class _Up>
10390b57cec5SDimitry Andric    friend
10400b57cec5SDimitry Andric    _Up*
10410b57cec5SDimitry Andric    begin(valarray<_Up>& __v);
10420b57cec5SDimitry Andric
10430b57cec5SDimitry Andric    template <class _Up>
10440b57cec5SDimitry Andric    friend
10450b57cec5SDimitry Andric    const _Up*
10460b57cec5SDimitry Andric    begin(const valarray<_Up>& __v);
10470b57cec5SDimitry Andric
10480b57cec5SDimitry Andric    template <class _Up>
10490b57cec5SDimitry Andric    friend
10500b57cec5SDimitry Andric    _Up*
10510b57cec5SDimitry Andric    end(valarray<_Up>& __v);
10520b57cec5SDimitry Andric
10530b57cec5SDimitry Andric    template <class _Up>
10540b57cec5SDimitry Andric    friend
10550b57cec5SDimitry Andric    const _Up*
10560b57cec5SDimitry Andric    end(const valarray<_Up>& __v);
10570b57cec5SDimitry Andric
10580b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10590b57cec5SDimitry Andric    void __clear(size_t __capacity);
10600b57cec5SDimitry Andric    valarray& __assign_range(const value_type* __f, const value_type* __l);
10610b57cec5SDimitry Andric};
10620b57cec5SDimitry Andric
10630b57cec5SDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
10640b57cec5SDimitry Andric
10650b57cec5SDimitry Andrictemplate <class _Op, class _Tp>
10660b57cec5SDimitry Andricstruct _UnaryOp<_Op, valarray<_Tp> >
10670b57cec5SDimitry Andric{
10680b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
10690b57cec5SDimitry Andric    typedef _Tp value_type;
10700b57cec5SDimitry Andric
10710b57cec5SDimitry Andric    _Op __op_;
10720b57cec5SDimitry Andric    const valarray<_Tp>& __a0_;
10730b57cec5SDimitry Andric
10740b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10750b57cec5SDimitry Andric    _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
10760b57cec5SDimitry Andric
10770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10780b57cec5SDimitry Andric    result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
10790b57cec5SDimitry Andric
10800b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10810b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
10820b57cec5SDimitry Andric};
10830b57cec5SDimitry Andric
10840b57cec5SDimitry Andrictemplate <class _Op, class _Tp, class _A1>
10850b57cec5SDimitry Andricstruct _BinaryOp<_Op, valarray<_Tp>, _A1>
10860b57cec5SDimitry Andric{
10870b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
10880b57cec5SDimitry Andric    typedef _Tp value_type;
10890b57cec5SDimitry Andric
10900b57cec5SDimitry Andric    _Op __op_;
10910b57cec5SDimitry Andric    const valarray<_Tp>& __a0_;
10920b57cec5SDimitry Andric    _A1 __a1_;
10930b57cec5SDimitry Andric
10940b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10950b57cec5SDimitry Andric    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
10960b57cec5SDimitry Andric        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
10970b57cec5SDimitry Andric
10980b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10990b57cec5SDimitry Andric    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11000b57cec5SDimitry Andric
11010b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11020b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
11030b57cec5SDimitry Andric};
11040b57cec5SDimitry Andric
11050b57cec5SDimitry Andrictemplate <class _Op, class _A0, class _Tp>
11060b57cec5SDimitry Andricstruct _BinaryOp<_Op, _A0, valarray<_Tp> >
11070b57cec5SDimitry Andric{
11080b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
11090b57cec5SDimitry Andric    typedef _Tp value_type;
11100b57cec5SDimitry Andric
11110b57cec5SDimitry Andric    _Op __op_;
11120b57cec5SDimitry Andric    _A0 __a0_;
11130b57cec5SDimitry Andric    const valarray<_Tp>& __a1_;
11140b57cec5SDimitry Andric
11150b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11160b57cec5SDimitry Andric    _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
11170b57cec5SDimitry Andric        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
11180b57cec5SDimitry Andric
11190b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11200b57cec5SDimitry Andric    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11210b57cec5SDimitry Andric
11220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11230b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
11240b57cec5SDimitry Andric};
11250b57cec5SDimitry Andric
11260b57cec5SDimitry Andrictemplate <class _Op, class _Tp>
11270b57cec5SDimitry Andricstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
11280b57cec5SDimitry Andric{
11290b57cec5SDimitry Andric    typedef typename _Op::result_type result_type;
11300b57cec5SDimitry Andric    typedef _Tp value_type;
11310b57cec5SDimitry Andric
11320b57cec5SDimitry Andric    _Op __op_;
11330b57cec5SDimitry Andric    const valarray<_Tp>& __a0_;
11340b57cec5SDimitry Andric    const valarray<_Tp>& __a1_;
11350b57cec5SDimitry Andric
11360b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11370b57cec5SDimitry Andric    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
11380b57cec5SDimitry Andric        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
11390b57cec5SDimitry Andric
11400b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11410b57cec5SDimitry Andric    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11420b57cec5SDimitry Andric
11430b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11440b57cec5SDimitry Andric    size_t size() const {return __a0_.size();}
11450b57cec5SDimitry Andric};
11460b57cec5SDimitry Andric
11470b57cec5SDimitry Andric// slice_array
11480b57cec5SDimitry Andric
11490b57cec5SDimitry Andrictemplate <class _Tp>
11500b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice_array
11510b57cec5SDimitry Andric{
11520b57cec5SDimitry Andricpublic:
11530b57cec5SDimitry Andric    typedef _Tp value_type;
11540b57cec5SDimitry Andric
11550b57cec5SDimitry Andricprivate:
11560b57cec5SDimitry Andric    value_type* __vp_;
11570b57cec5SDimitry Andric    size_t __size_;
11580b57cec5SDimitry Andric    size_t __stride_;
11590b57cec5SDimitry Andric
11600b57cec5SDimitry Andricpublic:
11610b57cec5SDimitry Andric    template <class _Expr>
11620b57cec5SDimitry Andric    typename enable_if
11630b57cec5SDimitry Andric    <
11640b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
11650b57cec5SDimitry Andric        void
11660b57cec5SDimitry Andric    >::type
11670b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11680b57cec5SDimitry Andric    operator=(const _Expr& __v) const;
11690b57cec5SDimitry Andric
11700b57cec5SDimitry Andric    template <class _Expr>
11710b57cec5SDimitry Andric    typename enable_if
11720b57cec5SDimitry Andric    <
11730b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
11740b57cec5SDimitry Andric        void
11750b57cec5SDimitry Andric    >::type
11760b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11770b57cec5SDimitry Andric    operator*=(const _Expr& __v) const;
11780b57cec5SDimitry Andric
11790b57cec5SDimitry Andric    template <class _Expr>
11800b57cec5SDimitry Andric    typename enable_if
11810b57cec5SDimitry Andric    <
11820b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
11830b57cec5SDimitry Andric        void
11840b57cec5SDimitry Andric    >::type
11850b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11860b57cec5SDimitry Andric    operator/=(const _Expr& __v) const;
11870b57cec5SDimitry Andric
11880b57cec5SDimitry Andric    template <class _Expr>
11890b57cec5SDimitry Andric    typename enable_if
11900b57cec5SDimitry Andric    <
11910b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
11920b57cec5SDimitry Andric        void
11930b57cec5SDimitry Andric    >::type
11940b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11950b57cec5SDimitry Andric    operator%=(const _Expr& __v) const;
11960b57cec5SDimitry Andric
11970b57cec5SDimitry Andric    template <class _Expr>
11980b57cec5SDimitry Andric    typename enable_if
11990b57cec5SDimitry Andric    <
12000b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12010b57cec5SDimitry Andric        void
12020b57cec5SDimitry Andric    >::type
12030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12040b57cec5SDimitry Andric    operator+=(const _Expr& __v) const;
12050b57cec5SDimitry Andric
12060b57cec5SDimitry Andric    template <class _Expr>
12070b57cec5SDimitry Andric    typename enable_if
12080b57cec5SDimitry Andric    <
12090b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12100b57cec5SDimitry Andric        void
12110b57cec5SDimitry Andric    >::type
12120b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12130b57cec5SDimitry Andric    operator-=(const _Expr& __v) const;
12140b57cec5SDimitry Andric
12150b57cec5SDimitry Andric    template <class _Expr>
12160b57cec5SDimitry Andric    typename enable_if
12170b57cec5SDimitry Andric    <
12180b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12190b57cec5SDimitry Andric        void
12200b57cec5SDimitry Andric    >::type
12210b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12220b57cec5SDimitry Andric    operator^=(const _Expr& __v) const;
12230b57cec5SDimitry Andric
12240b57cec5SDimitry Andric    template <class _Expr>
12250b57cec5SDimitry Andric    typename enable_if
12260b57cec5SDimitry Andric    <
12270b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12280b57cec5SDimitry Andric        void
12290b57cec5SDimitry Andric    >::type
12300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12310b57cec5SDimitry Andric    operator&=(const _Expr& __v) const;
12320b57cec5SDimitry Andric
12330b57cec5SDimitry Andric    template <class _Expr>
12340b57cec5SDimitry Andric    typename enable_if
12350b57cec5SDimitry Andric    <
12360b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12370b57cec5SDimitry Andric        void
12380b57cec5SDimitry Andric    >::type
12390b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12400b57cec5SDimitry Andric    operator|=(const _Expr& __v) const;
12410b57cec5SDimitry Andric
12420b57cec5SDimitry Andric    template <class _Expr>
12430b57cec5SDimitry Andric    typename enable_if
12440b57cec5SDimitry Andric    <
12450b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12460b57cec5SDimitry Andric        void
12470b57cec5SDimitry Andric    >::type
12480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12490b57cec5SDimitry Andric    operator<<=(const _Expr& __v) const;
12500b57cec5SDimitry Andric
12510b57cec5SDimitry Andric    template <class _Expr>
12520b57cec5SDimitry Andric    typename enable_if
12530b57cec5SDimitry Andric    <
12540b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
12550b57cec5SDimitry Andric        void
12560b57cec5SDimitry Andric    >::type
12570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12580b57cec5SDimitry Andric    operator>>=(const _Expr& __v) const;
12590b57cec5SDimitry Andric
1260cd0c3137SDimitry Andric    slice_array(slice_array const&) = default;
1261cd0c3137SDimitry Andric
12620b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12630b57cec5SDimitry Andric    const slice_array& operator=(const slice_array& __sa) const;
12640b57cec5SDimitry Andric
12650b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12660b57cec5SDimitry Andric    void operator=(const value_type& __x) const;
12670b57cec5SDimitry Andric
1268*e8d8bef9SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1269*e8d8bef9SDimitry Andric    void operator=(const valarray<value_type>& __va) const;
1270*e8d8bef9SDimitry Andric
12710b57cec5SDimitry Andricprivate:
12720b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12730b57cec5SDimitry Andric    slice_array(const slice& __sl, const valarray<value_type>& __v)
12740b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
12750b57cec5SDimitry Andric          __size_(__sl.size()),
12760b57cec5SDimitry Andric          __stride_(__sl.stride())
12770b57cec5SDimitry Andric        {}
12780b57cec5SDimitry Andric
12790b57cec5SDimitry Andric    template <class> friend class valarray;
12800b57cec5SDimitry Andric    template <class> friend class sliceExpr;
12810b57cec5SDimitry Andric};
12820b57cec5SDimitry Andric
12830b57cec5SDimitry Andrictemplate <class _Tp>
12840b57cec5SDimitry Andricinline
12850b57cec5SDimitry Andricconst slice_array<_Tp>&
12860b57cec5SDimitry Andricslice_array<_Tp>::operator=(const slice_array& __sa) const
12870b57cec5SDimitry Andric{
12880b57cec5SDimitry Andric    value_type* __t = __vp_;
12890b57cec5SDimitry Andric    const value_type* __s = __sa.__vp_;
12900b57cec5SDimitry Andric    for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
12910b57cec5SDimitry Andric        *__t = *__s;
12920b57cec5SDimitry Andric    return *this;
12930b57cec5SDimitry Andric}
12940b57cec5SDimitry Andric
12950b57cec5SDimitry Andrictemplate <class _Tp>
12960b57cec5SDimitry Andrictemplate <class _Expr>
12970b57cec5SDimitry Andricinline
12980b57cec5SDimitry Andrictypename enable_if
12990b57cec5SDimitry Andric<
13000b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13010b57cec5SDimitry Andric    void
13020b57cec5SDimitry Andric>::type
13030b57cec5SDimitry Andricslice_array<_Tp>::operator=(const _Expr& __v) const
13040b57cec5SDimitry Andric{
13050b57cec5SDimitry Andric    value_type* __t = __vp_;
13060b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13070b57cec5SDimitry Andric        *__t = __v[__i];
13080b57cec5SDimitry Andric}
13090b57cec5SDimitry Andric
13100b57cec5SDimitry Andrictemplate <class _Tp>
1311*e8d8bef9SDimitry Andricinline void
1312*e8d8bef9SDimitry Andricslice_array<_Tp>::operator=(const valarray<value_type>& __va) const
1313*e8d8bef9SDimitry Andric{
1314*e8d8bef9SDimitry Andric    value_type* __t = __vp_;
1315*e8d8bef9SDimitry Andric    for (size_t __i = 0; __i < __va.size(); ++__i, __t += __stride_)
1316*e8d8bef9SDimitry Andric        *__t = __va[__i];
1317*e8d8bef9SDimitry Andric}
1318*e8d8bef9SDimitry Andric
1319*e8d8bef9SDimitry Andrictemplate <class _Tp>
13200b57cec5SDimitry Andrictemplate <class _Expr>
13210b57cec5SDimitry Andricinline
13220b57cec5SDimitry Andrictypename enable_if
13230b57cec5SDimitry Andric<
13240b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13250b57cec5SDimitry Andric    void
13260b57cec5SDimitry Andric>::type
13270b57cec5SDimitry Andricslice_array<_Tp>::operator*=(const _Expr& __v) const
13280b57cec5SDimitry Andric{
13290b57cec5SDimitry Andric    value_type* __t = __vp_;
13300b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13310b57cec5SDimitry Andric        *__t *= __v[__i];
13320b57cec5SDimitry Andric}
13330b57cec5SDimitry Andric
13340b57cec5SDimitry Andrictemplate <class _Tp>
13350b57cec5SDimitry Andrictemplate <class _Expr>
13360b57cec5SDimitry Andricinline
13370b57cec5SDimitry Andrictypename enable_if
13380b57cec5SDimitry Andric<
13390b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13400b57cec5SDimitry Andric    void
13410b57cec5SDimitry Andric>::type
13420b57cec5SDimitry Andricslice_array<_Tp>::operator/=(const _Expr& __v) const
13430b57cec5SDimitry Andric{
13440b57cec5SDimitry Andric    value_type* __t = __vp_;
13450b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13460b57cec5SDimitry Andric        *__t /= __v[__i];
13470b57cec5SDimitry Andric}
13480b57cec5SDimitry Andric
13490b57cec5SDimitry Andrictemplate <class _Tp>
13500b57cec5SDimitry Andrictemplate <class _Expr>
13510b57cec5SDimitry Andricinline
13520b57cec5SDimitry Andrictypename enable_if
13530b57cec5SDimitry Andric<
13540b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13550b57cec5SDimitry Andric    void
13560b57cec5SDimitry Andric>::type
13570b57cec5SDimitry Andricslice_array<_Tp>::operator%=(const _Expr& __v) const
13580b57cec5SDimitry Andric{
13590b57cec5SDimitry Andric    value_type* __t = __vp_;
13600b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13610b57cec5SDimitry Andric        *__t %= __v[__i];
13620b57cec5SDimitry Andric}
13630b57cec5SDimitry Andric
13640b57cec5SDimitry Andrictemplate <class _Tp>
13650b57cec5SDimitry Andrictemplate <class _Expr>
13660b57cec5SDimitry Andricinline
13670b57cec5SDimitry Andrictypename enable_if
13680b57cec5SDimitry Andric<
13690b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13700b57cec5SDimitry Andric    void
13710b57cec5SDimitry Andric>::type
13720b57cec5SDimitry Andricslice_array<_Tp>::operator+=(const _Expr& __v) const
13730b57cec5SDimitry Andric{
13740b57cec5SDimitry Andric    value_type* __t = __vp_;
13750b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13760b57cec5SDimitry Andric        *__t += __v[__i];
13770b57cec5SDimitry Andric}
13780b57cec5SDimitry Andric
13790b57cec5SDimitry Andrictemplate <class _Tp>
13800b57cec5SDimitry Andrictemplate <class _Expr>
13810b57cec5SDimitry Andricinline
13820b57cec5SDimitry Andrictypename enable_if
13830b57cec5SDimitry Andric<
13840b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
13850b57cec5SDimitry Andric    void
13860b57cec5SDimitry Andric>::type
13870b57cec5SDimitry Andricslice_array<_Tp>::operator-=(const _Expr& __v) const
13880b57cec5SDimitry Andric{
13890b57cec5SDimitry Andric    value_type* __t = __vp_;
13900b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13910b57cec5SDimitry Andric        *__t -= __v[__i];
13920b57cec5SDimitry Andric}
13930b57cec5SDimitry Andric
13940b57cec5SDimitry Andrictemplate <class _Tp>
13950b57cec5SDimitry Andrictemplate <class _Expr>
13960b57cec5SDimitry Andricinline
13970b57cec5SDimitry Andrictypename enable_if
13980b57cec5SDimitry Andric<
13990b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
14000b57cec5SDimitry Andric    void
14010b57cec5SDimitry Andric>::type
14020b57cec5SDimitry Andricslice_array<_Tp>::operator^=(const _Expr& __v) const
14030b57cec5SDimitry Andric{
14040b57cec5SDimitry Andric    value_type* __t = __vp_;
14050b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14060b57cec5SDimitry Andric        *__t ^= __v[__i];
14070b57cec5SDimitry Andric}
14080b57cec5SDimitry Andric
14090b57cec5SDimitry Andrictemplate <class _Tp>
14100b57cec5SDimitry Andrictemplate <class _Expr>
14110b57cec5SDimitry Andricinline
14120b57cec5SDimitry Andrictypename enable_if
14130b57cec5SDimitry Andric<
14140b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
14150b57cec5SDimitry Andric    void
14160b57cec5SDimitry Andric>::type
14170b57cec5SDimitry Andricslice_array<_Tp>::operator&=(const _Expr& __v) const
14180b57cec5SDimitry Andric{
14190b57cec5SDimitry Andric    value_type* __t = __vp_;
14200b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14210b57cec5SDimitry Andric        *__t &= __v[__i];
14220b57cec5SDimitry Andric}
14230b57cec5SDimitry Andric
14240b57cec5SDimitry Andrictemplate <class _Tp>
14250b57cec5SDimitry Andrictemplate <class _Expr>
14260b57cec5SDimitry Andricinline
14270b57cec5SDimitry Andrictypename enable_if
14280b57cec5SDimitry Andric<
14290b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
14300b57cec5SDimitry Andric    void
14310b57cec5SDimitry Andric>::type
14320b57cec5SDimitry Andricslice_array<_Tp>::operator|=(const _Expr& __v) const
14330b57cec5SDimitry Andric{
14340b57cec5SDimitry Andric    value_type* __t = __vp_;
14350b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14360b57cec5SDimitry Andric        *__t |= __v[__i];
14370b57cec5SDimitry Andric}
14380b57cec5SDimitry Andric
14390b57cec5SDimitry Andrictemplate <class _Tp>
14400b57cec5SDimitry Andrictemplate <class _Expr>
14410b57cec5SDimitry Andricinline
14420b57cec5SDimitry Andrictypename enable_if
14430b57cec5SDimitry Andric<
14440b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
14450b57cec5SDimitry Andric    void
14460b57cec5SDimitry Andric>::type
14470b57cec5SDimitry Andricslice_array<_Tp>::operator<<=(const _Expr& __v) const
14480b57cec5SDimitry Andric{
14490b57cec5SDimitry Andric    value_type* __t = __vp_;
14500b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14510b57cec5SDimitry Andric        *__t <<= __v[__i];
14520b57cec5SDimitry Andric}
14530b57cec5SDimitry Andric
14540b57cec5SDimitry Andrictemplate <class _Tp>
14550b57cec5SDimitry Andrictemplate <class _Expr>
14560b57cec5SDimitry Andricinline
14570b57cec5SDimitry Andrictypename enable_if
14580b57cec5SDimitry Andric<
14590b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
14600b57cec5SDimitry Andric    void
14610b57cec5SDimitry Andric>::type
14620b57cec5SDimitry Andricslice_array<_Tp>::operator>>=(const _Expr& __v) const
14630b57cec5SDimitry Andric{
14640b57cec5SDimitry Andric    value_type* __t = __vp_;
14650b57cec5SDimitry Andric    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14660b57cec5SDimitry Andric        *__t >>= __v[__i];
14670b57cec5SDimitry Andric}
14680b57cec5SDimitry Andric
14690b57cec5SDimitry Andrictemplate <class _Tp>
14700b57cec5SDimitry Andricinline
14710b57cec5SDimitry Andricvoid
14720b57cec5SDimitry Andricslice_array<_Tp>::operator=(const value_type& __x) const
14730b57cec5SDimitry Andric{
14740b57cec5SDimitry Andric    value_type* __t = __vp_;
14750b57cec5SDimitry Andric    for (size_t __n = __size_; __n; --__n, __t += __stride_)
14760b57cec5SDimitry Andric        *__t = __x;
14770b57cec5SDimitry Andric}
14780b57cec5SDimitry Andric
14790b57cec5SDimitry Andric// gslice
14800b57cec5SDimitry Andric
14810b57cec5SDimitry Andricclass _LIBCPP_TYPE_VIS gslice
14820b57cec5SDimitry Andric{
14830b57cec5SDimitry Andric    valarray<size_t> __size_;
14840b57cec5SDimitry Andric    valarray<size_t> __stride_;
14850b57cec5SDimitry Andric    valarray<size_t> __1d_;
14860b57cec5SDimitry Andric
14870b57cec5SDimitry Andricpublic:
14880b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14890b57cec5SDimitry Andric    gslice() {}
14900b57cec5SDimitry Andric
14910b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
14920b57cec5SDimitry Andric    gslice(size_t __start, const valarray<size_t>& __size,
14930b57cec5SDimitry Andric                           const valarray<size_t>& __stride)
14940b57cec5SDimitry Andric        : __size_(__size),
14950b57cec5SDimitry Andric          __stride_(__stride)
14960b57cec5SDimitry Andric        {__init(__start);}
14970b57cec5SDimitry Andric
14980b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
14990b57cec5SDimitry Andric
15000b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15010b57cec5SDimitry Andric    gslice(size_t __start, const valarray<size_t>&  __size,
15020b57cec5SDimitry Andric                                 valarray<size_t>&& __stride)
15030b57cec5SDimitry Andric        : __size_(__size),
15040b57cec5SDimitry Andric          __stride_(move(__stride))
15050b57cec5SDimitry Andric        {__init(__start);}
15060b57cec5SDimitry Andric
15070b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15080b57cec5SDimitry Andric    gslice(size_t __start,       valarray<size_t>&& __size,
15090b57cec5SDimitry Andric                           const valarray<size_t>&  __stride)
15100b57cec5SDimitry Andric        : __size_(move(__size)),
15110b57cec5SDimitry Andric          __stride_(__stride)
15120b57cec5SDimitry Andric        {__init(__start);}
15130b57cec5SDimitry Andric
15140b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15150b57cec5SDimitry Andric    gslice(size_t __start,       valarray<size_t>&& __size,
15160b57cec5SDimitry Andric                                 valarray<size_t>&& __stride)
15170b57cec5SDimitry Andric        : __size_(move(__size)),
15180b57cec5SDimitry Andric          __stride_(move(__stride))
15190b57cec5SDimitry Andric        {__init(__start);}
15200b57cec5SDimitry Andric
15210b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
15220b57cec5SDimitry Andric
15230b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15240b57cec5SDimitry Andric    size_t           start()  const {return __1d_.size() ? __1d_[0] : 0;}
15250b57cec5SDimitry Andric
15260b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15270b57cec5SDimitry Andric    valarray<size_t> size()   const {return __size_;}
15280b57cec5SDimitry Andric
15290b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15300b57cec5SDimitry Andric    valarray<size_t> stride() const {return __stride_;}
15310b57cec5SDimitry Andric
15320b57cec5SDimitry Andricprivate:
15330b57cec5SDimitry Andric    void __init(size_t __start);
15340b57cec5SDimitry Andric
15350b57cec5SDimitry Andric    template <class> friend class gslice_array;
15360b57cec5SDimitry Andric    template <class> friend class valarray;
15370b57cec5SDimitry Andric    template <class> friend class __val_expr;
15380b57cec5SDimitry Andric};
15390b57cec5SDimitry Andric
15400b57cec5SDimitry Andric// gslice_array
15410b57cec5SDimitry Andric
15420b57cec5SDimitry Andrictemplate <class _Tp>
15430b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS gslice_array
15440b57cec5SDimitry Andric{
15450b57cec5SDimitry Andricpublic:
15460b57cec5SDimitry Andric    typedef _Tp value_type;
15470b57cec5SDimitry Andric
15480b57cec5SDimitry Andricprivate:
15490b57cec5SDimitry Andric    value_type*      __vp_;
15500b57cec5SDimitry Andric    valarray<size_t> __1d_;
15510b57cec5SDimitry Andric
15520b57cec5SDimitry Andricpublic:
15530b57cec5SDimitry Andric    template <class _Expr>
15540b57cec5SDimitry Andric    typename enable_if
15550b57cec5SDimitry Andric    <
15560b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
15570b57cec5SDimitry Andric        void
15580b57cec5SDimitry Andric    >::type
15590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15600b57cec5SDimitry Andric    operator=(const _Expr& __v) const;
15610b57cec5SDimitry Andric
15620b57cec5SDimitry Andric    template <class _Expr>
15630b57cec5SDimitry Andric    typename enable_if
15640b57cec5SDimitry Andric    <
15650b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
15660b57cec5SDimitry Andric        void
15670b57cec5SDimitry Andric    >::type
15680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15690b57cec5SDimitry Andric    operator*=(const _Expr& __v) const;
15700b57cec5SDimitry Andric
15710b57cec5SDimitry Andric    template <class _Expr>
15720b57cec5SDimitry Andric    typename enable_if
15730b57cec5SDimitry Andric    <
15740b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
15750b57cec5SDimitry Andric        void
15760b57cec5SDimitry Andric    >::type
15770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15780b57cec5SDimitry Andric    operator/=(const _Expr& __v) const;
15790b57cec5SDimitry Andric
15800b57cec5SDimitry Andric    template <class _Expr>
15810b57cec5SDimitry Andric    typename enable_if
15820b57cec5SDimitry Andric    <
15830b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
15840b57cec5SDimitry Andric        void
15850b57cec5SDimitry Andric    >::type
15860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15870b57cec5SDimitry Andric    operator%=(const _Expr& __v) const;
15880b57cec5SDimitry Andric
15890b57cec5SDimitry Andric    template <class _Expr>
15900b57cec5SDimitry Andric    typename enable_if
15910b57cec5SDimitry Andric    <
15920b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
15930b57cec5SDimitry Andric        void
15940b57cec5SDimitry Andric    >::type
15950b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15960b57cec5SDimitry Andric    operator+=(const _Expr& __v) const;
15970b57cec5SDimitry Andric
15980b57cec5SDimitry Andric    template <class _Expr>
15990b57cec5SDimitry Andric    typename enable_if
16000b57cec5SDimitry Andric    <
16010b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16020b57cec5SDimitry Andric        void
16030b57cec5SDimitry Andric    >::type
16040b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16050b57cec5SDimitry Andric    operator-=(const _Expr& __v) const;
16060b57cec5SDimitry Andric
16070b57cec5SDimitry Andric    template <class _Expr>
16080b57cec5SDimitry Andric    typename enable_if
16090b57cec5SDimitry Andric    <
16100b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16110b57cec5SDimitry Andric        void
16120b57cec5SDimitry Andric    >::type
16130b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16140b57cec5SDimitry Andric    operator^=(const _Expr& __v) const;
16150b57cec5SDimitry Andric
16160b57cec5SDimitry Andric    template <class _Expr>
16170b57cec5SDimitry Andric    typename enable_if
16180b57cec5SDimitry Andric    <
16190b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16200b57cec5SDimitry Andric        void
16210b57cec5SDimitry Andric    >::type
16220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16230b57cec5SDimitry Andric    operator&=(const _Expr& __v) const;
16240b57cec5SDimitry Andric
16250b57cec5SDimitry Andric    template <class _Expr>
16260b57cec5SDimitry Andric    typename enable_if
16270b57cec5SDimitry Andric    <
16280b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16290b57cec5SDimitry Andric        void
16300b57cec5SDimitry Andric    >::type
16310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16320b57cec5SDimitry Andric    operator|=(const _Expr& __v) const;
16330b57cec5SDimitry Andric
16340b57cec5SDimitry Andric    template <class _Expr>
16350b57cec5SDimitry Andric    typename enable_if
16360b57cec5SDimitry Andric    <
16370b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16380b57cec5SDimitry Andric        void
16390b57cec5SDimitry Andric    >::type
16400b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16410b57cec5SDimitry Andric    operator<<=(const _Expr& __v) const;
16420b57cec5SDimitry Andric
16430b57cec5SDimitry Andric    template <class _Expr>
16440b57cec5SDimitry Andric    typename enable_if
16450b57cec5SDimitry Andric    <
16460b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
16470b57cec5SDimitry Andric        void
16480b57cec5SDimitry Andric    >::type
16490b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16500b57cec5SDimitry Andric    operator>>=(const _Expr& __v) const;
16510b57cec5SDimitry Andric
16520b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16530b57cec5SDimitry Andric    const gslice_array& operator=(const gslice_array& __ga) const;
16540b57cec5SDimitry Andric
16550b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16560b57cec5SDimitry Andric    void operator=(const value_type& __x) const;
16570b57cec5SDimitry Andric
1658cd0c3137SDimitry Andric    gslice_array(const gslice_array&)            = default;
16590b57cec5SDimitry Andric
16600b57cec5SDimitry Andricprivate:
16610b57cec5SDimitry Andric    gslice_array(const gslice& __gs, const valarray<value_type>& __v)
16620b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_)),
16630b57cec5SDimitry Andric          __1d_(__gs.__1d_)
16640b57cec5SDimitry Andric        {}
16650b57cec5SDimitry Andric
16660b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
16670b57cec5SDimitry Andric    gslice_array(gslice&& __gs, const valarray<value_type>& __v)
16680b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_)),
16690b57cec5SDimitry Andric          __1d_(move(__gs.__1d_))
16700b57cec5SDimitry Andric        {}
16710b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
16720b57cec5SDimitry Andric
16730b57cec5SDimitry Andric    template <class> friend class valarray;
16740b57cec5SDimitry Andric};
16750b57cec5SDimitry Andric
16760b57cec5SDimitry Andrictemplate <class _Tp>
16770b57cec5SDimitry Andrictemplate <class _Expr>
16780b57cec5SDimitry Andricinline
16790b57cec5SDimitry Andrictypename enable_if
16800b57cec5SDimitry Andric<
16810b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
16820b57cec5SDimitry Andric    void
16830b57cec5SDimitry Andric>::type
16840b57cec5SDimitry Andricgslice_array<_Tp>::operator=(const _Expr& __v) const
16850b57cec5SDimitry Andric{
16860b57cec5SDimitry Andric    typedef const size_t* _Ip;
16870b57cec5SDimitry Andric    size_t __j = 0;
16880b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
16890b57cec5SDimitry Andric        __vp_[*__i] = __v[__j];
16900b57cec5SDimitry Andric}
16910b57cec5SDimitry Andric
16920b57cec5SDimitry Andrictemplate <class _Tp>
16930b57cec5SDimitry Andrictemplate <class _Expr>
16940b57cec5SDimitry Andricinline
16950b57cec5SDimitry Andrictypename enable_if
16960b57cec5SDimitry Andric<
16970b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
16980b57cec5SDimitry Andric    void
16990b57cec5SDimitry Andric>::type
17000b57cec5SDimitry Andricgslice_array<_Tp>::operator*=(const _Expr& __v) const
17010b57cec5SDimitry Andric{
17020b57cec5SDimitry Andric    typedef const size_t* _Ip;
17030b57cec5SDimitry Andric    size_t __j = 0;
17040b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17050b57cec5SDimitry Andric        __vp_[*__i] *= __v[__j];
17060b57cec5SDimitry Andric}
17070b57cec5SDimitry Andric
17080b57cec5SDimitry Andrictemplate <class _Tp>
17090b57cec5SDimitry Andrictemplate <class _Expr>
17100b57cec5SDimitry Andricinline
17110b57cec5SDimitry Andrictypename enable_if
17120b57cec5SDimitry Andric<
17130b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17140b57cec5SDimitry Andric    void
17150b57cec5SDimitry Andric>::type
17160b57cec5SDimitry Andricgslice_array<_Tp>::operator/=(const _Expr& __v) const
17170b57cec5SDimitry Andric{
17180b57cec5SDimitry Andric    typedef const size_t* _Ip;
17190b57cec5SDimitry Andric    size_t __j = 0;
17200b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17210b57cec5SDimitry Andric        __vp_[*__i] /= __v[__j];
17220b57cec5SDimitry Andric}
17230b57cec5SDimitry Andric
17240b57cec5SDimitry Andrictemplate <class _Tp>
17250b57cec5SDimitry Andrictemplate <class _Expr>
17260b57cec5SDimitry Andricinline
17270b57cec5SDimitry Andrictypename enable_if
17280b57cec5SDimitry Andric<
17290b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17300b57cec5SDimitry Andric    void
17310b57cec5SDimitry Andric>::type
17320b57cec5SDimitry Andricgslice_array<_Tp>::operator%=(const _Expr& __v) const
17330b57cec5SDimitry Andric{
17340b57cec5SDimitry Andric    typedef const size_t* _Ip;
17350b57cec5SDimitry Andric    size_t __j = 0;
17360b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17370b57cec5SDimitry Andric        __vp_[*__i] %= __v[__j];
17380b57cec5SDimitry Andric}
17390b57cec5SDimitry Andric
17400b57cec5SDimitry Andrictemplate <class _Tp>
17410b57cec5SDimitry Andrictemplate <class _Expr>
17420b57cec5SDimitry Andricinline
17430b57cec5SDimitry Andrictypename enable_if
17440b57cec5SDimitry Andric<
17450b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17460b57cec5SDimitry Andric    void
17470b57cec5SDimitry Andric>::type
17480b57cec5SDimitry Andricgslice_array<_Tp>::operator+=(const _Expr& __v) const
17490b57cec5SDimitry Andric{
17500b57cec5SDimitry Andric    typedef const size_t* _Ip;
17510b57cec5SDimitry Andric    size_t __j = 0;
17520b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17530b57cec5SDimitry Andric        __vp_[*__i] += __v[__j];
17540b57cec5SDimitry Andric}
17550b57cec5SDimitry Andric
17560b57cec5SDimitry Andrictemplate <class _Tp>
17570b57cec5SDimitry Andrictemplate <class _Expr>
17580b57cec5SDimitry Andricinline
17590b57cec5SDimitry Andrictypename enable_if
17600b57cec5SDimitry Andric<
17610b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17620b57cec5SDimitry Andric    void
17630b57cec5SDimitry Andric>::type
17640b57cec5SDimitry Andricgslice_array<_Tp>::operator-=(const _Expr& __v) const
17650b57cec5SDimitry Andric{
17660b57cec5SDimitry Andric    typedef const size_t* _Ip;
17670b57cec5SDimitry Andric    size_t __j = 0;
17680b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17690b57cec5SDimitry Andric        __vp_[*__i] -= __v[__j];
17700b57cec5SDimitry Andric}
17710b57cec5SDimitry Andric
17720b57cec5SDimitry Andrictemplate <class _Tp>
17730b57cec5SDimitry Andrictemplate <class _Expr>
17740b57cec5SDimitry Andricinline
17750b57cec5SDimitry Andrictypename enable_if
17760b57cec5SDimitry Andric<
17770b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17780b57cec5SDimitry Andric    void
17790b57cec5SDimitry Andric>::type
17800b57cec5SDimitry Andricgslice_array<_Tp>::operator^=(const _Expr& __v) const
17810b57cec5SDimitry Andric{
17820b57cec5SDimitry Andric    typedef const size_t* _Ip;
17830b57cec5SDimitry Andric    size_t __j = 0;
17840b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17850b57cec5SDimitry Andric        __vp_[*__i] ^= __v[__j];
17860b57cec5SDimitry Andric}
17870b57cec5SDimitry Andric
17880b57cec5SDimitry Andrictemplate <class _Tp>
17890b57cec5SDimitry Andrictemplate <class _Expr>
17900b57cec5SDimitry Andricinline
17910b57cec5SDimitry Andrictypename enable_if
17920b57cec5SDimitry Andric<
17930b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
17940b57cec5SDimitry Andric    void
17950b57cec5SDimitry Andric>::type
17960b57cec5SDimitry Andricgslice_array<_Tp>::operator&=(const _Expr& __v) const
17970b57cec5SDimitry Andric{
17980b57cec5SDimitry Andric    typedef const size_t* _Ip;
17990b57cec5SDimitry Andric    size_t __j = 0;
18000b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18010b57cec5SDimitry Andric        __vp_[*__i] &= __v[__j];
18020b57cec5SDimitry Andric}
18030b57cec5SDimitry Andric
18040b57cec5SDimitry Andrictemplate <class _Tp>
18050b57cec5SDimitry Andrictemplate <class _Expr>
18060b57cec5SDimitry Andricinline
18070b57cec5SDimitry Andrictypename enable_if
18080b57cec5SDimitry Andric<
18090b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
18100b57cec5SDimitry Andric    void
18110b57cec5SDimitry Andric>::type
18120b57cec5SDimitry Andricgslice_array<_Tp>::operator|=(const _Expr& __v) const
18130b57cec5SDimitry Andric{
18140b57cec5SDimitry Andric    typedef const size_t* _Ip;
18150b57cec5SDimitry Andric    size_t __j = 0;
18160b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18170b57cec5SDimitry Andric        __vp_[*__i] |= __v[__j];
18180b57cec5SDimitry Andric}
18190b57cec5SDimitry Andric
18200b57cec5SDimitry Andrictemplate <class _Tp>
18210b57cec5SDimitry Andrictemplate <class _Expr>
18220b57cec5SDimitry Andricinline
18230b57cec5SDimitry Andrictypename enable_if
18240b57cec5SDimitry Andric<
18250b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
18260b57cec5SDimitry Andric    void
18270b57cec5SDimitry Andric>::type
18280b57cec5SDimitry Andricgslice_array<_Tp>::operator<<=(const _Expr& __v) const
18290b57cec5SDimitry Andric{
18300b57cec5SDimitry Andric    typedef const size_t* _Ip;
18310b57cec5SDimitry Andric    size_t __j = 0;
18320b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18330b57cec5SDimitry Andric        __vp_[*__i] <<= __v[__j];
18340b57cec5SDimitry Andric}
18350b57cec5SDimitry Andric
18360b57cec5SDimitry Andrictemplate <class _Tp>
18370b57cec5SDimitry Andrictemplate <class _Expr>
18380b57cec5SDimitry Andricinline
18390b57cec5SDimitry Andrictypename enable_if
18400b57cec5SDimitry Andric<
18410b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
18420b57cec5SDimitry Andric    void
18430b57cec5SDimitry Andric>::type
18440b57cec5SDimitry Andricgslice_array<_Tp>::operator>>=(const _Expr& __v) const
18450b57cec5SDimitry Andric{
18460b57cec5SDimitry Andric    typedef const size_t* _Ip;
18470b57cec5SDimitry Andric    size_t __j = 0;
18480b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18490b57cec5SDimitry Andric        __vp_[*__i] >>= __v[__j];
18500b57cec5SDimitry Andric}
18510b57cec5SDimitry Andric
18520b57cec5SDimitry Andrictemplate <class _Tp>
18530b57cec5SDimitry Andricinline
18540b57cec5SDimitry Andricconst gslice_array<_Tp>&
18550b57cec5SDimitry Andricgslice_array<_Tp>::operator=(const gslice_array& __ga) const
18560b57cec5SDimitry Andric{
18570b57cec5SDimitry Andric    typedef const size_t* _Ip;
18580b57cec5SDimitry Andric    const value_type* __s = __ga.__vp_;
18590b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
18600b57cec5SDimitry Andric            __i != __e; ++__i, ++__j)
18610b57cec5SDimitry Andric        __vp_[*__i] = __s[*__j];
18620b57cec5SDimitry Andric    return *this;
18630b57cec5SDimitry Andric}
18640b57cec5SDimitry Andric
18650b57cec5SDimitry Andrictemplate <class _Tp>
18660b57cec5SDimitry Andricinline
18670b57cec5SDimitry Andricvoid
18680b57cec5SDimitry Andricgslice_array<_Tp>::operator=(const value_type& __x) const
18690b57cec5SDimitry Andric{
18700b57cec5SDimitry Andric    typedef const size_t* _Ip;
18710b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
18720b57cec5SDimitry Andric        __vp_[*__i] = __x;
18730b57cec5SDimitry Andric}
18740b57cec5SDimitry Andric
18750b57cec5SDimitry Andric// mask_array
18760b57cec5SDimitry Andric
18770b57cec5SDimitry Andrictemplate <class _Tp>
18780b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS mask_array
18790b57cec5SDimitry Andric{
18800b57cec5SDimitry Andricpublic:
18810b57cec5SDimitry Andric    typedef _Tp value_type;
18820b57cec5SDimitry Andric
18830b57cec5SDimitry Andricprivate:
18840b57cec5SDimitry Andric    value_type*      __vp_;
18850b57cec5SDimitry Andric    valarray<size_t> __1d_;
18860b57cec5SDimitry Andric
18870b57cec5SDimitry Andricpublic:
18880b57cec5SDimitry Andric    template <class _Expr>
18890b57cec5SDimitry Andric    typename enable_if
18900b57cec5SDimitry Andric    <
18910b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
18920b57cec5SDimitry Andric        void
18930b57cec5SDimitry Andric    >::type
18940b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
18950b57cec5SDimitry Andric    operator=(const _Expr& __v) const;
18960b57cec5SDimitry Andric
18970b57cec5SDimitry Andric    template <class _Expr>
18980b57cec5SDimitry Andric    typename enable_if
18990b57cec5SDimitry Andric    <
19000b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19010b57cec5SDimitry Andric        void
19020b57cec5SDimitry Andric    >::type
19030b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19040b57cec5SDimitry Andric    operator*=(const _Expr& __v) const;
19050b57cec5SDimitry Andric
19060b57cec5SDimitry Andric    template <class _Expr>
19070b57cec5SDimitry Andric    typename enable_if
19080b57cec5SDimitry Andric    <
19090b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19100b57cec5SDimitry Andric        void
19110b57cec5SDimitry Andric    >::type
19120b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19130b57cec5SDimitry Andric    operator/=(const _Expr& __v) const;
19140b57cec5SDimitry Andric
19150b57cec5SDimitry Andric    template <class _Expr>
19160b57cec5SDimitry Andric    typename enable_if
19170b57cec5SDimitry Andric    <
19180b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19190b57cec5SDimitry Andric        void
19200b57cec5SDimitry Andric    >::type
19210b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19220b57cec5SDimitry Andric    operator%=(const _Expr& __v) const;
19230b57cec5SDimitry Andric
19240b57cec5SDimitry Andric    template <class _Expr>
19250b57cec5SDimitry Andric    typename enable_if
19260b57cec5SDimitry Andric    <
19270b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19280b57cec5SDimitry Andric        void
19290b57cec5SDimitry Andric    >::type
19300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19310b57cec5SDimitry Andric    operator+=(const _Expr& __v) const;
19320b57cec5SDimitry Andric
19330b57cec5SDimitry Andric    template <class _Expr>
19340b57cec5SDimitry Andric    typename enable_if
19350b57cec5SDimitry Andric    <
19360b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19370b57cec5SDimitry Andric        void
19380b57cec5SDimitry Andric    >::type
19390b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19400b57cec5SDimitry Andric    operator-=(const _Expr& __v) const;
19410b57cec5SDimitry Andric
19420b57cec5SDimitry Andric    template <class _Expr>
19430b57cec5SDimitry Andric    typename enable_if
19440b57cec5SDimitry Andric    <
19450b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19460b57cec5SDimitry Andric        void
19470b57cec5SDimitry Andric    >::type
19480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19490b57cec5SDimitry Andric    operator^=(const _Expr& __v) const;
19500b57cec5SDimitry Andric
19510b57cec5SDimitry Andric    template <class _Expr>
19520b57cec5SDimitry Andric    typename enable_if
19530b57cec5SDimitry Andric    <
19540b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19550b57cec5SDimitry Andric        void
19560b57cec5SDimitry Andric    >::type
19570b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19580b57cec5SDimitry Andric    operator&=(const _Expr& __v) const;
19590b57cec5SDimitry Andric
19600b57cec5SDimitry Andric    template <class _Expr>
19610b57cec5SDimitry Andric    typename enable_if
19620b57cec5SDimitry Andric    <
19630b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19640b57cec5SDimitry Andric        void
19650b57cec5SDimitry Andric    >::type
19660b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19670b57cec5SDimitry Andric    operator|=(const _Expr& __v) const;
19680b57cec5SDimitry Andric
19690b57cec5SDimitry Andric    template <class _Expr>
19700b57cec5SDimitry Andric    typename enable_if
19710b57cec5SDimitry Andric    <
19720b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19730b57cec5SDimitry Andric        void
19740b57cec5SDimitry Andric    >::type
19750b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19760b57cec5SDimitry Andric    operator<<=(const _Expr& __v) const;
19770b57cec5SDimitry Andric
19780b57cec5SDimitry Andric    template <class _Expr>
19790b57cec5SDimitry Andric    typename enable_if
19800b57cec5SDimitry Andric    <
19810b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
19820b57cec5SDimitry Andric        void
19830b57cec5SDimitry Andric    >::type
19840b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19850b57cec5SDimitry Andric    operator>>=(const _Expr& __v) const;
19860b57cec5SDimitry Andric
1987cd0c3137SDimitry Andric    mask_array(const mask_array&) = default;
1988cd0c3137SDimitry Andric
19890b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19900b57cec5SDimitry Andric    const mask_array& operator=(const mask_array& __ma) const;
19910b57cec5SDimitry Andric
19920b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19930b57cec5SDimitry Andric    void operator=(const value_type& __x) const;
19940b57cec5SDimitry Andric
19950b57cec5SDimitry Andricprivate:
19960b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19970b57cec5SDimitry Andric    mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
19980b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_)),
19990b57cec5SDimitry Andric          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
20000b57cec5SDimitry Andric          {
20010b57cec5SDimitry Andric              size_t __j = 0;
20020b57cec5SDimitry Andric              for (size_t __i = 0; __i < __vb.size(); ++__i)
20030b57cec5SDimitry Andric                  if (__vb[__i])
20040b57cec5SDimitry Andric                      __1d_[__j++] = __i;
20050b57cec5SDimitry Andric          }
20060b57cec5SDimitry Andric
20070b57cec5SDimitry Andric    template <class> friend class valarray;
20080b57cec5SDimitry Andric};
20090b57cec5SDimitry Andric
20100b57cec5SDimitry Andrictemplate <class _Tp>
20110b57cec5SDimitry Andrictemplate <class _Expr>
20120b57cec5SDimitry Andricinline
20130b57cec5SDimitry Andrictypename enable_if
20140b57cec5SDimitry Andric<
20150b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20160b57cec5SDimitry Andric    void
20170b57cec5SDimitry Andric>::type
20180b57cec5SDimitry Andricmask_array<_Tp>::operator=(const _Expr& __v) const
20190b57cec5SDimitry Andric{
20200b57cec5SDimitry Andric    size_t __n = __1d_.size();
20210b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20220b57cec5SDimitry Andric        __vp_[__1d_[__i]] = __v[__i];
20230b57cec5SDimitry Andric}
20240b57cec5SDimitry Andric
20250b57cec5SDimitry Andrictemplate <class _Tp>
20260b57cec5SDimitry Andrictemplate <class _Expr>
20270b57cec5SDimitry Andricinline
20280b57cec5SDimitry Andrictypename enable_if
20290b57cec5SDimitry Andric<
20300b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20310b57cec5SDimitry Andric    void
20320b57cec5SDimitry Andric>::type
20330b57cec5SDimitry Andricmask_array<_Tp>::operator*=(const _Expr& __v) const
20340b57cec5SDimitry Andric{
20350b57cec5SDimitry Andric    size_t __n = __1d_.size();
20360b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20370b57cec5SDimitry Andric        __vp_[__1d_[__i]] *= __v[__i];
20380b57cec5SDimitry Andric}
20390b57cec5SDimitry Andric
20400b57cec5SDimitry Andrictemplate <class _Tp>
20410b57cec5SDimitry Andrictemplate <class _Expr>
20420b57cec5SDimitry Andricinline
20430b57cec5SDimitry Andrictypename enable_if
20440b57cec5SDimitry Andric<
20450b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20460b57cec5SDimitry Andric    void
20470b57cec5SDimitry Andric>::type
20480b57cec5SDimitry Andricmask_array<_Tp>::operator/=(const _Expr& __v) const
20490b57cec5SDimitry Andric{
20500b57cec5SDimitry Andric    size_t __n = __1d_.size();
20510b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20520b57cec5SDimitry Andric        __vp_[__1d_[__i]] /= __v[__i];
20530b57cec5SDimitry Andric}
20540b57cec5SDimitry Andric
20550b57cec5SDimitry Andrictemplate <class _Tp>
20560b57cec5SDimitry Andrictemplate <class _Expr>
20570b57cec5SDimitry Andricinline
20580b57cec5SDimitry Andrictypename enable_if
20590b57cec5SDimitry Andric<
20600b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20610b57cec5SDimitry Andric    void
20620b57cec5SDimitry Andric>::type
20630b57cec5SDimitry Andricmask_array<_Tp>::operator%=(const _Expr& __v) const
20640b57cec5SDimitry Andric{
20650b57cec5SDimitry Andric    size_t __n = __1d_.size();
20660b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20670b57cec5SDimitry Andric        __vp_[__1d_[__i]] %= __v[__i];
20680b57cec5SDimitry Andric}
20690b57cec5SDimitry Andric
20700b57cec5SDimitry Andrictemplate <class _Tp>
20710b57cec5SDimitry Andrictemplate <class _Expr>
20720b57cec5SDimitry Andricinline
20730b57cec5SDimitry Andrictypename enable_if
20740b57cec5SDimitry Andric<
20750b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20760b57cec5SDimitry Andric    void
20770b57cec5SDimitry Andric>::type
20780b57cec5SDimitry Andricmask_array<_Tp>::operator+=(const _Expr& __v) const
20790b57cec5SDimitry Andric{
20800b57cec5SDimitry Andric    size_t __n = __1d_.size();
20810b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20820b57cec5SDimitry Andric        __vp_[__1d_[__i]] += __v[__i];
20830b57cec5SDimitry Andric}
20840b57cec5SDimitry Andric
20850b57cec5SDimitry Andrictemplate <class _Tp>
20860b57cec5SDimitry Andrictemplate <class _Expr>
20870b57cec5SDimitry Andricinline
20880b57cec5SDimitry Andrictypename enable_if
20890b57cec5SDimitry Andric<
20900b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
20910b57cec5SDimitry Andric    void
20920b57cec5SDimitry Andric>::type
20930b57cec5SDimitry Andricmask_array<_Tp>::operator-=(const _Expr& __v) const
20940b57cec5SDimitry Andric{
20950b57cec5SDimitry Andric    size_t __n = __1d_.size();
20960b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
20970b57cec5SDimitry Andric        __vp_[__1d_[__i]] -= __v[__i];
20980b57cec5SDimitry Andric}
20990b57cec5SDimitry Andric
21000b57cec5SDimitry Andrictemplate <class _Tp>
21010b57cec5SDimitry Andrictemplate <class _Expr>
21020b57cec5SDimitry Andricinline
21030b57cec5SDimitry Andrictypename enable_if
21040b57cec5SDimitry Andric<
21050b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
21060b57cec5SDimitry Andric    void
21070b57cec5SDimitry Andric>::type
21080b57cec5SDimitry Andricmask_array<_Tp>::operator^=(const _Expr& __v) const
21090b57cec5SDimitry Andric{
21100b57cec5SDimitry Andric    size_t __n = __1d_.size();
21110b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21120b57cec5SDimitry Andric        __vp_[__1d_[__i]] ^= __v[__i];
21130b57cec5SDimitry Andric}
21140b57cec5SDimitry Andric
21150b57cec5SDimitry Andrictemplate <class _Tp>
21160b57cec5SDimitry Andrictemplate <class _Expr>
21170b57cec5SDimitry Andricinline
21180b57cec5SDimitry Andrictypename enable_if
21190b57cec5SDimitry Andric<
21200b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
21210b57cec5SDimitry Andric    void
21220b57cec5SDimitry Andric>::type
21230b57cec5SDimitry Andricmask_array<_Tp>::operator&=(const _Expr& __v) const
21240b57cec5SDimitry Andric{
21250b57cec5SDimitry Andric    size_t __n = __1d_.size();
21260b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21270b57cec5SDimitry Andric        __vp_[__1d_[__i]] &= __v[__i];
21280b57cec5SDimitry Andric}
21290b57cec5SDimitry Andric
21300b57cec5SDimitry Andrictemplate <class _Tp>
21310b57cec5SDimitry Andrictemplate <class _Expr>
21320b57cec5SDimitry Andricinline
21330b57cec5SDimitry Andrictypename enable_if
21340b57cec5SDimitry Andric<
21350b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
21360b57cec5SDimitry Andric    void
21370b57cec5SDimitry Andric>::type
21380b57cec5SDimitry Andricmask_array<_Tp>::operator|=(const _Expr& __v) const
21390b57cec5SDimitry Andric{
21400b57cec5SDimitry Andric    size_t __n = __1d_.size();
21410b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21420b57cec5SDimitry Andric        __vp_[__1d_[__i]] |= __v[__i];
21430b57cec5SDimitry Andric}
21440b57cec5SDimitry Andric
21450b57cec5SDimitry Andrictemplate <class _Tp>
21460b57cec5SDimitry Andrictemplate <class _Expr>
21470b57cec5SDimitry Andricinline
21480b57cec5SDimitry Andrictypename enable_if
21490b57cec5SDimitry Andric<
21500b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
21510b57cec5SDimitry Andric    void
21520b57cec5SDimitry Andric>::type
21530b57cec5SDimitry Andricmask_array<_Tp>::operator<<=(const _Expr& __v) const
21540b57cec5SDimitry Andric{
21550b57cec5SDimitry Andric    size_t __n = __1d_.size();
21560b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21570b57cec5SDimitry Andric        __vp_[__1d_[__i]] <<= __v[__i];
21580b57cec5SDimitry Andric}
21590b57cec5SDimitry Andric
21600b57cec5SDimitry Andrictemplate <class _Tp>
21610b57cec5SDimitry Andrictemplate <class _Expr>
21620b57cec5SDimitry Andricinline
21630b57cec5SDimitry Andrictypename enable_if
21640b57cec5SDimitry Andric<
21650b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
21660b57cec5SDimitry Andric    void
21670b57cec5SDimitry Andric>::type
21680b57cec5SDimitry Andricmask_array<_Tp>::operator>>=(const _Expr& __v) const
21690b57cec5SDimitry Andric{
21700b57cec5SDimitry Andric    size_t __n = __1d_.size();
21710b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21720b57cec5SDimitry Andric        __vp_[__1d_[__i]] >>= __v[__i];
21730b57cec5SDimitry Andric}
21740b57cec5SDimitry Andric
21750b57cec5SDimitry Andrictemplate <class _Tp>
21760b57cec5SDimitry Andricinline
21770b57cec5SDimitry Andricconst mask_array<_Tp>&
21780b57cec5SDimitry Andricmask_array<_Tp>::operator=(const mask_array& __ma) const
21790b57cec5SDimitry Andric{
21800b57cec5SDimitry Andric    size_t __n = __1d_.size();
21810b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21820b57cec5SDimitry Andric        __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
21830b57cec5SDimitry Andric    return *this;
21840b57cec5SDimitry Andric}
21850b57cec5SDimitry Andric
21860b57cec5SDimitry Andrictemplate <class _Tp>
21870b57cec5SDimitry Andricinline
21880b57cec5SDimitry Andricvoid
21890b57cec5SDimitry Andricmask_array<_Tp>::operator=(const value_type& __x) const
21900b57cec5SDimitry Andric{
21910b57cec5SDimitry Andric    size_t __n = __1d_.size();
21920b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
21930b57cec5SDimitry Andric        __vp_[__1d_[__i]] = __x;
21940b57cec5SDimitry Andric}
21950b57cec5SDimitry Andric
21960b57cec5SDimitry Andrictemplate <class _ValExpr>
21970b57cec5SDimitry Andricclass __mask_expr
21980b57cec5SDimitry Andric{
21990b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
22000b57cec5SDimitry Andricpublic:
22010b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
22020b57cec5SDimitry Andric    typedef value_type result_type;
22030b57cec5SDimitry Andric
22040b57cec5SDimitry Andricprivate:
22050b57cec5SDimitry Andric    _ValExpr __expr_;
22060b57cec5SDimitry Andric    valarray<size_t> __1d_;
22070b57cec5SDimitry Andric
22080b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22090b57cec5SDimitry Andric    __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
22100b57cec5SDimitry Andric        : __expr_(__e),
22110b57cec5SDimitry Andric          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
22120b57cec5SDimitry Andric          {
22130b57cec5SDimitry Andric              size_t __j = 0;
22140b57cec5SDimitry Andric              for (size_t __i = 0; __i < __vb.size(); ++__i)
22150b57cec5SDimitry Andric                  if (__vb[__i])
22160b57cec5SDimitry Andric                      __1d_[__j++] = __i;
22170b57cec5SDimitry Andric          }
22180b57cec5SDimitry Andric
22190b57cec5SDimitry Andricpublic:
22200b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22210b57cec5SDimitry Andric    result_type operator[](size_t __i) const
22220b57cec5SDimitry Andric        {return __expr_[__1d_[__i]];}
22230b57cec5SDimitry Andric
22240b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22250b57cec5SDimitry Andric    size_t size() const {return __1d_.size();}
22260b57cec5SDimitry Andric
22270b57cec5SDimitry Andric    template <class> friend class __val_expr;
22280b57cec5SDimitry Andric    template <class> friend class valarray;
22290b57cec5SDimitry Andric};
22300b57cec5SDimitry Andric
22310b57cec5SDimitry Andric// indirect_array
22320b57cec5SDimitry Andric
22330b57cec5SDimitry Andrictemplate <class _Tp>
22340b57cec5SDimitry Andricclass _LIBCPP_TEMPLATE_VIS indirect_array
22350b57cec5SDimitry Andric{
22360b57cec5SDimitry Andricpublic:
22370b57cec5SDimitry Andric    typedef _Tp value_type;
22380b57cec5SDimitry Andric
22390b57cec5SDimitry Andricprivate:
22400b57cec5SDimitry Andric    value_type*      __vp_;
22410b57cec5SDimitry Andric    valarray<size_t> __1d_;
22420b57cec5SDimitry Andric
22430b57cec5SDimitry Andricpublic:
22440b57cec5SDimitry Andric    template <class _Expr>
22450b57cec5SDimitry Andric    typename enable_if
22460b57cec5SDimitry Andric    <
22470b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22480b57cec5SDimitry Andric        void
22490b57cec5SDimitry Andric    >::type
22500b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22510b57cec5SDimitry Andric    operator=(const _Expr& __v) const;
22520b57cec5SDimitry Andric
22530b57cec5SDimitry Andric    template <class _Expr>
22540b57cec5SDimitry Andric    typename enable_if
22550b57cec5SDimitry Andric    <
22560b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22570b57cec5SDimitry Andric        void
22580b57cec5SDimitry Andric    >::type
22590b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22600b57cec5SDimitry Andric    operator*=(const _Expr& __v) const;
22610b57cec5SDimitry Andric
22620b57cec5SDimitry Andric    template <class _Expr>
22630b57cec5SDimitry Andric    typename enable_if
22640b57cec5SDimitry Andric    <
22650b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22660b57cec5SDimitry Andric        void
22670b57cec5SDimitry Andric    >::type
22680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22690b57cec5SDimitry Andric    operator/=(const _Expr& __v) const;
22700b57cec5SDimitry Andric
22710b57cec5SDimitry Andric    template <class _Expr>
22720b57cec5SDimitry Andric    typename enable_if
22730b57cec5SDimitry Andric    <
22740b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22750b57cec5SDimitry Andric        void
22760b57cec5SDimitry Andric    >::type
22770b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22780b57cec5SDimitry Andric    operator%=(const _Expr& __v) const;
22790b57cec5SDimitry Andric
22800b57cec5SDimitry Andric    template <class _Expr>
22810b57cec5SDimitry Andric    typename enable_if
22820b57cec5SDimitry Andric    <
22830b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22840b57cec5SDimitry Andric        void
22850b57cec5SDimitry Andric    >::type
22860b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22870b57cec5SDimitry Andric    operator+=(const _Expr& __v) const;
22880b57cec5SDimitry Andric
22890b57cec5SDimitry Andric    template <class _Expr>
22900b57cec5SDimitry Andric    typename enable_if
22910b57cec5SDimitry Andric    <
22920b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
22930b57cec5SDimitry Andric        void
22940b57cec5SDimitry Andric    >::type
22950b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22960b57cec5SDimitry Andric    operator-=(const _Expr& __v) const;
22970b57cec5SDimitry Andric
22980b57cec5SDimitry Andric    template <class _Expr>
22990b57cec5SDimitry Andric    typename enable_if
23000b57cec5SDimitry Andric    <
23010b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
23020b57cec5SDimitry Andric        void
23030b57cec5SDimitry Andric    >::type
23040b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23050b57cec5SDimitry Andric    operator^=(const _Expr& __v) const;
23060b57cec5SDimitry Andric
23070b57cec5SDimitry Andric    template <class _Expr>
23080b57cec5SDimitry Andric    typename enable_if
23090b57cec5SDimitry Andric    <
23100b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
23110b57cec5SDimitry Andric        void
23120b57cec5SDimitry Andric    >::type
23130b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23140b57cec5SDimitry Andric    operator&=(const _Expr& __v) const;
23150b57cec5SDimitry Andric
23160b57cec5SDimitry Andric    template <class _Expr>
23170b57cec5SDimitry Andric    typename enable_if
23180b57cec5SDimitry Andric    <
23190b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
23200b57cec5SDimitry Andric        void
23210b57cec5SDimitry Andric    >::type
23220b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23230b57cec5SDimitry Andric    operator|=(const _Expr& __v) const;
23240b57cec5SDimitry Andric
23250b57cec5SDimitry Andric    template <class _Expr>
23260b57cec5SDimitry Andric    typename enable_if
23270b57cec5SDimitry Andric    <
23280b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
23290b57cec5SDimitry Andric        void
23300b57cec5SDimitry Andric    >::type
23310b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23320b57cec5SDimitry Andric    operator<<=(const _Expr& __v) const;
23330b57cec5SDimitry Andric
23340b57cec5SDimitry Andric    template <class _Expr>
23350b57cec5SDimitry Andric    typename enable_if
23360b57cec5SDimitry Andric    <
23370b57cec5SDimitry Andric        __is_val_expr<_Expr>::value,
23380b57cec5SDimitry Andric        void
23390b57cec5SDimitry Andric    >::type
23400b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23410b57cec5SDimitry Andric    operator>>=(const _Expr& __v) const;
23420b57cec5SDimitry Andric
2343cd0c3137SDimitry Andric    indirect_array(const indirect_array&) = default;
2344cd0c3137SDimitry Andric
23450b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23460b57cec5SDimitry Andric    const indirect_array& operator=(const indirect_array& __ia) const;
23470b57cec5SDimitry Andric
23480b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23490b57cec5SDimitry Andric    void operator=(const value_type& __x) const;
23500b57cec5SDimitry Andric
23510b57cec5SDimitry Andricprivate:
23520b57cec5SDimitry Andric     _LIBCPP_INLINE_VISIBILITY
23530b57cec5SDimitry Andric   indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
23540b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_)),
23550b57cec5SDimitry Andric          __1d_(__ia)
23560b57cec5SDimitry Andric        {}
23570b57cec5SDimitry Andric
23580b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
23590b57cec5SDimitry Andric
23600b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23610b57cec5SDimitry Andric    indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
23620b57cec5SDimitry Andric        : __vp_(const_cast<value_type*>(__v.__begin_)),
23630b57cec5SDimitry Andric          __1d_(move(__ia))
23640b57cec5SDimitry Andric        {}
23650b57cec5SDimitry Andric
23660b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
23670b57cec5SDimitry Andric
23680b57cec5SDimitry Andric    template <class> friend class valarray;
23690b57cec5SDimitry Andric};
23700b57cec5SDimitry Andric
23710b57cec5SDimitry Andrictemplate <class _Tp>
23720b57cec5SDimitry Andrictemplate <class _Expr>
23730b57cec5SDimitry Andricinline
23740b57cec5SDimitry Andrictypename enable_if
23750b57cec5SDimitry Andric<
23760b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
23770b57cec5SDimitry Andric    void
23780b57cec5SDimitry Andric>::type
23790b57cec5SDimitry Andricindirect_array<_Tp>::operator=(const _Expr& __v) const
23800b57cec5SDimitry Andric{
23810b57cec5SDimitry Andric    size_t __n = __1d_.size();
23820b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
23830b57cec5SDimitry Andric        __vp_[__1d_[__i]] = __v[__i];
23840b57cec5SDimitry Andric}
23850b57cec5SDimitry Andric
23860b57cec5SDimitry Andrictemplate <class _Tp>
23870b57cec5SDimitry Andrictemplate <class _Expr>
23880b57cec5SDimitry Andricinline
23890b57cec5SDimitry Andrictypename enable_if
23900b57cec5SDimitry Andric<
23910b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
23920b57cec5SDimitry Andric    void
23930b57cec5SDimitry Andric>::type
23940b57cec5SDimitry Andricindirect_array<_Tp>::operator*=(const _Expr& __v) const
23950b57cec5SDimitry Andric{
23960b57cec5SDimitry Andric    size_t __n = __1d_.size();
23970b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
23980b57cec5SDimitry Andric        __vp_[__1d_[__i]] *= __v[__i];
23990b57cec5SDimitry Andric}
24000b57cec5SDimitry Andric
24010b57cec5SDimitry Andrictemplate <class _Tp>
24020b57cec5SDimitry Andrictemplate <class _Expr>
24030b57cec5SDimitry Andricinline
24040b57cec5SDimitry Andrictypename enable_if
24050b57cec5SDimitry Andric<
24060b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24070b57cec5SDimitry Andric    void
24080b57cec5SDimitry Andric>::type
24090b57cec5SDimitry Andricindirect_array<_Tp>::operator/=(const _Expr& __v) const
24100b57cec5SDimitry Andric{
24110b57cec5SDimitry Andric    size_t __n = __1d_.size();
24120b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24130b57cec5SDimitry Andric        __vp_[__1d_[__i]] /= __v[__i];
24140b57cec5SDimitry Andric}
24150b57cec5SDimitry Andric
24160b57cec5SDimitry Andrictemplate <class _Tp>
24170b57cec5SDimitry Andrictemplate <class _Expr>
24180b57cec5SDimitry Andricinline
24190b57cec5SDimitry Andrictypename enable_if
24200b57cec5SDimitry Andric<
24210b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24220b57cec5SDimitry Andric    void
24230b57cec5SDimitry Andric>::type
24240b57cec5SDimitry Andricindirect_array<_Tp>::operator%=(const _Expr& __v) const
24250b57cec5SDimitry Andric{
24260b57cec5SDimitry Andric    size_t __n = __1d_.size();
24270b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24280b57cec5SDimitry Andric        __vp_[__1d_[__i]] %= __v[__i];
24290b57cec5SDimitry Andric}
24300b57cec5SDimitry Andric
24310b57cec5SDimitry Andrictemplate <class _Tp>
24320b57cec5SDimitry Andrictemplate <class _Expr>
24330b57cec5SDimitry Andricinline
24340b57cec5SDimitry Andrictypename enable_if
24350b57cec5SDimitry Andric<
24360b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24370b57cec5SDimitry Andric    void
24380b57cec5SDimitry Andric>::type
24390b57cec5SDimitry Andricindirect_array<_Tp>::operator+=(const _Expr& __v) const
24400b57cec5SDimitry Andric{
24410b57cec5SDimitry Andric    size_t __n = __1d_.size();
24420b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24430b57cec5SDimitry Andric        __vp_[__1d_[__i]] += __v[__i];
24440b57cec5SDimitry Andric}
24450b57cec5SDimitry Andric
24460b57cec5SDimitry Andrictemplate <class _Tp>
24470b57cec5SDimitry Andrictemplate <class _Expr>
24480b57cec5SDimitry Andricinline
24490b57cec5SDimitry Andrictypename enable_if
24500b57cec5SDimitry Andric<
24510b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24520b57cec5SDimitry Andric    void
24530b57cec5SDimitry Andric>::type
24540b57cec5SDimitry Andricindirect_array<_Tp>::operator-=(const _Expr& __v) const
24550b57cec5SDimitry Andric{
24560b57cec5SDimitry Andric    size_t __n = __1d_.size();
24570b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24580b57cec5SDimitry Andric        __vp_[__1d_[__i]] -= __v[__i];
24590b57cec5SDimitry Andric}
24600b57cec5SDimitry Andric
24610b57cec5SDimitry Andrictemplate <class _Tp>
24620b57cec5SDimitry Andrictemplate <class _Expr>
24630b57cec5SDimitry Andricinline
24640b57cec5SDimitry Andrictypename enable_if
24650b57cec5SDimitry Andric<
24660b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24670b57cec5SDimitry Andric    void
24680b57cec5SDimitry Andric>::type
24690b57cec5SDimitry Andricindirect_array<_Tp>::operator^=(const _Expr& __v) const
24700b57cec5SDimitry Andric{
24710b57cec5SDimitry Andric    size_t __n = __1d_.size();
24720b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24730b57cec5SDimitry Andric        __vp_[__1d_[__i]] ^= __v[__i];
24740b57cec5SDimitry Andric}
24750b57cec5SDimitry Andric
24760b57cec5SDimitry Andrictemplate <class _Tp>
24770b57cec5SDimitry Andrictemplate <class _Expr>
24780b57cec5SDimitry Andricinline
24790b57cec5SDimitry Andrictypename enable_if
24800b57cec5SDimitry Andric<
24810b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24820b57cec5SDimitry Andric    void
24830b57cec5SDimitry Andric>::type
24840b57cec5SDimitry Andricindirect_array<_Tp>::operator&=(const _Expr& __v) const
24850b57cec5SDimitry Andric{
24860b57cec5SDimitry Andric    size_t __n = __1d_.size();
24870b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
24880b57cec5SDimitry Andric        __vp_[__1d_[__i]] &= __v[__i];
24890b57cec5SDimitry Andric}
24900b57cec5SDimitry Andric
24910b57cec5SDimitry Andrictemplate <class _Tp>
24920b57cec5SDimitry Andrictemplate <class _Expr>
24930b57cec5SDimitry Andricinline
24940b57cec5SDimitry Andrictypename enable_if
24950b57cec5SDimitry Andric<
24960b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
24970b57cec5SDimitry Andric    void
24980b57cec5SDimitry Andric>::type
24990b57cec5SDimitry Andricindirect_array<_Tp>::operator|=(const _Expr& __v) const
25000b57cec5SDimitry Andric{
25010b57cec5SDimitry Andric    size_t __n = __1d_.size();
25020b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
25030b57cec5SDimitry Andric        __vp_[__1d_[__i]] |= __v[__i];
25040b57cec5SDimitry Andric}
25050b57cec5SDimitry Andric
25060b57cec5SDimitry Andrictemplate <class _Tp>
25070b57cec5SDimitry Andrictemplate <class _Expr>
25080b57cec5SDimitry Andricinline
25090b57cec5SDimitry Andrictypename enable_if
25100b57cec5SDimitry Andric<
25110b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
25120b57cec5SDimitry Andric    void
25130b57cec5SDimitry Andric>::type
25140b57cec5SDimitry Andricindirect_array<_Tp>::operator<<=(const _Expr& __v) const
25150b57cec5SDimitry Andric{
25160b57cec5SDimitry Andric    size_t __n = __1d_.size();
25170b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
25180b57cec5SDimitry Andric        __vp_[__1d_[__i]] <<= __v[__i];
25190b57cec5SDimitry Andric}
25200b57cec5SDimitry Andric
25210b57cec5SDimitry Andrictemplate <class _Tp>
25220b57cec5SDimitry Andrictemplate <class _Expr>
25230b57cec5SDimitry Andricinline
25240b57cec5SDimitry Andrictypename enable_if
25250b57cec5SDimitry Andric<
25260b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
25270b57cec5SDimitry Andric    void
25280b57cec5SDimitry Andric>::type
25290b57cec5SDimitry Andricindirect_array<_Tp>::operator>>=(const _Expr& __v) const
25300b57cec5SDimitry Andric{
25310b57cec5SDimitry Andric    size_t __n = __1d_.size();
25320b57cec5SDimitry Andric    for (size_t __i = 0; __i < __n; ++__i)
25330b57cec5SDimitry Andric        __vp_[__1d_[__i]] >>= __v[__i];
25340b57cec5SDimitry Andric}
25350b57cec5SDimitry Andric
25360b57cec5SDimitry Andrictemplate <class _Tp>
25370b57cec5SDimitry Andricinline
25380b57cec5SDimitry Andricconst indirect_array<_Tp>&
25390b57cec5SDimitry Andricindirect_array<_Tp>::operator=(const indirect_array& __ia) const
25400b57cec5SDimitry Andric{
25410b57cec5SDimitry Andric    typedef const size_t* _Ip;
25420b57cec5SDimitry Andric    const value_type* __s = __ia.__vp_;
25430b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
25440b57cec5SDimitry Andric            __i != __e; ++__i, ++__j)
25450b57cec5SDimitry Andric        __vp_[*__i] = __s[*__j];
25460b57cec5SDimitry Andric    return *this;
25470b57cec5SDimitry Andric}
25480b57cec5SDimitry Andric
25490b57cec5SDimitry Andrictemplate <class _Tp>
25500b57cec5SDimitry Andricinline
25510b57cec5SDimitry Andricvoid
25520b57cec5SDimitry Andricindirect_array<_Tp>::operator=(const value_type& __x) const
25530b57cec5SDimitry Andric{
25540b57cec5SDimitry Andric    typedef const size_t* _Ip;
25550b57cec5SDimitry Andric    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
25560b57cec5SDimitry Andric        __vp_[*__i] = __x;
25570b57cec5SDimitry Andric}
25580b57cec5SDimitry Andric
25590b57cec5SDimitry Andrictemplate <class _ValExpr>
25600b57cec5SDimitry Andricclass __indirect_expr
25610b57cec5SDimitry Andric{
25620b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
25630b57cec5SDimitry Andricpublic:
25640b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
25650b57cec5SDimitry Andric    typedef value_type result_type;
25660b57cec5SDimitry Andric
25670b57cec5SDimitry Andricprivate:
25680b57cec5SDimitry Andric    _ValExpr __expr_;
25690b57cec5SDimitry Andric    valarray<size_t> __1d_;
25700b57cec5SDimitry Andric
25710b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
25720b57cec5SDimitry Andric    __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
25730b57cec5SDimitry Andric        : __expr_(__e),
25740b57cec5SDimitry Andric          __1d_(__ia)
25750b57cec5SDimitry Andric          {}
25760b57cec5SDimitry Andric
25770b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
25780b57cec5SDimitry Andric
25790b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
25800b57cec5SDimitry Andric    __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
25810b57cec5SDimitry Andric        : __expr_(__e),
25820b57cec5SDimitry Andric          __1d_(move(__ia))
25830b57cec5SDimitry Andric          {}
25840b57cec5SDimitry Andric
25850b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
25860b57cec5SDimitry Andric
25870b57cec5SDimitry Andricpublic:
25880b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
25890b57cec5SDimitry Andric    result_type operator[](size_t __i) const
25900b57cec5SDimitry Andric        {return __expr_[__1d_[__i]];}
25910b57cec5SDimitry Andric
25920b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
25930b57cec5SDimitry Andric    size_t size() const {return __1d_.size();}
25940b57cec5SDimitry Andric
25950b57cec5SDimitry Andric    template <class> friend class __val_expr;
25960b57cec5SDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
25970b57cec5SDimitry Andric};
25980b57cec5SDimitry Andric
25990b57cec5SDimitry Andrictemplate<class _ValExpr>
26000b57cec5SDimitry Andricclass __val_expr
26010b57cec5SDimitry Andric{
26020b57cec5SDimitry Andric    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
26030b57cec5SDimitry Andric
26040b57cec5SDimitry Andric    _ValExpr __expr_;
26050b57cec5SDimitry Andricpublic:
26060b57cec5SDimitry Andric    typedef typename _RmExpr::value_type value_type;
26070b57cec5SDimitry Andric    typedef typename _RmExpr::result_type result_type;
26080b57cec5SDimitry Andric
26090b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26100b57cec5SDimitry Andric    explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
26110b57cec5SDimitry Andric
26120b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26130b57cec5SDimitry Andric    result_type operator[](size_t __i) const
26140b57cec5SDimitry Andric        {return __expr_[__i];}
26150b57cec5SDimitry Andric
26160b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26170b57cec5SDimitry Andric    __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
26180b57cec5SDimitry Andric    {
26190b57cec5SDimitry Andric        typedef __slice_expr<_ValExpr> _NewExpr;
26200b57cec5SDimitry Andric        return __val_expr< _NewExpr >(_NewExpr(__s, __expr_));
26210b57cec5SDimitry Andric    }
26220b57cec5SDimitry Andric
26230b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26240b57cec5SDimitry Andric    __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
26250b57cec5SDimitry Andric    {
26260b57cec5SDimitry Andric        typedef __indirect_expr<_ValExpr> _NewExpr;
26270b57cec5SDimitry Andric        return __val_expr<_NewExpr >(_NewExpr(__gs.__1d_, __expr_));
26280b57cec5SDimitry Andric    }
26290b57cec5SDimitry Andric
26300b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26310b57cec5SDimitry Andric    __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
26320b57cec5SDimitry Andric    {
26330b57cec5SDimitry Andric        typedef __mask_expr<_ValExpr> _NewExpr;
26340b57cec5SDimitry Andric        return __val_expr< _NewExpr >( _NewExpr(__vb, __expr_));
26350b57cec5SDimitry Andric    }
26360b57cec5SDimitry Andric
26370b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26380b57cec5SDimitry Andric    __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
26390b57cec5SDimitry Andric    {
26400b57cec5SDimitry Andric        typedef __indirect_expr<_ValExpr> _NewExpr;
26410b57cec5SDimitry Andric        return __val_expr< _NewExpr >(_NewExpr(__vs, __expr_));
26420b57cec5SDimitry Andric    }
26430b57cec5SDimitry Andric
26440b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26450b57cec5SDimitry Andric    __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
26460b57cec5SDimitry Andric    operator+() const
26470b57cec5SDimitry Andric    {
26480b57cec5SDimitry Andric        typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
26490b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
26500b57cec5SDimitry Andric    }
26510b57cec5SDimitry Andric
26520b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26530b57cec5SDimitry Andric    __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
26540b57cec5SDimitry Andric    operator-() const
26550b57cec5SDimitry Andric    {
26560b57cec5SDimitry Andric        typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
26570b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
26580b57cec5SDimitry Andric    }
26590b57cec5SDimitry Andric
26600b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26610b57cec5SDimitry Andric    __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
26620b57cec5SDimitry Andric    operator~() const
26630b57cec5SDimitry Andric    {
26640b57cec5SDimitry Andric        typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
26650b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
26660b57cec5SDimitry Andric    }
26670b57cec5SDimitry Andric
26680b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26690b57cec5SDimitry Andric    __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
26700b57cec5SDimitry Andric    operator!() const
26710b57cec5SDimitry Andric    {
26720b57cec5SDimitry Andric        typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
26730b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
26740b57cec5SDimitry Andric    }
26750b57cec5SDimitry Andric
26760b57cec5SDimitry Andric    operator valarray<result_type>() const;
26770b57cec5SDimitry Andric
26780b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26790b57cec5SDimitry Andric    size_t size() const {return __expr_.size();}
26800b57cec5SDimitry Andric
26810b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26820b57cec5SDimitry Andric    result_type sum() const
26830b57cec5SDimitry Andric    {
26840b57cec5SDimitry Andric        size_t __n = __expr_.size();
26850b57cec5SDimitry Andric        result_type __r = __n ? __expr_[0] : result_type();
26860b57cec5SDimitry Andric        for (size_t __i = 1; __i < __n; ++__i)
26870b57cec5SDimitry Andric            __r += __expr_[__i];
26880b57cec5SDimitry Andric        return __r;
26890b57cec5SDimitry Andric    }
26900b57cec5SDimitry Andric
26910b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
26920b57cec5SDimitry Andric    result_type min() const
26930b57cec5SDimitry Andric    {
26940b57cec5SDimitry Andric        size_t __n = size();
26950b57cec5SDimitry Andric        result_type __r = __n ? (*this)[0] : result_type();
26960b57cec5SDimitry Andric        for (size_t __i = 1; __i < __n; ++__i)
26970b57cec5SDimitry Andric        {
26980b57cec5SDimitry Andric            result_type __x = __expr_[__i];
26990b57cec5SDimitry Andric            if (__x < __r)
27000b57cec5SDimitry Andric                __r = __x;
27010b57cec5SDimitry Andric        }
27020b57cec5SDimitry Andric        return __r;
27030b57cec5SDimitry Andric    }
27040b57cec5SDimitry Andric
27050b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
27060b57cec5SDimitry Andric    result_type max() const
27070b57cec5SDimitry Andric    {
27080b57cec5SDimitry Andric        size_t __n = size();
27090b57cec5SDimitry Andric        result_type __r = __n ? (*this)[0] : result_type();
27100b57cec5SDimitry Andric        for (size_t __i = 1; __i < __n; ++__i)
27110b57cec5SDimitry Andric        {
27120b57cec5SDimitry Andric            result_type __x = __expr_[__i];
27130b57cec5SDimitry Andric            if (__r < __x)
27140b57cec5SDimitry Andric                __r = __x;
27150b57cec5SDimitry Andric        }
27160b57cec5SDimitry Andric        return __r;
27170b57cec5SDimitry Andric    }
27180b57cec5SDimitry Andric
27190b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
27200b57cec5SDimitry Andric    __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
27210b57cec5SDimitry Andric        {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
27220b57cec5SDimitry Andric
27230b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
27240b57cec5SDimitry Andric    __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
27250b57cec5SDimitry Andric        {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
27260b57cec5SDimitry Andric
27270b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
27280b57cec5SDimitry Andric    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
27290b57cec5SDimitry Andric    apply(value_type __f(value_type)) const
27300b57cec5SDimitry Andric    {
27310b57cec5SDimitry Andric        typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
27320b57cec5SDimitry Andric        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
27330b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
27340b57cec5SDimitry Andric    }
27350b57cec5SDimitry Andric
27360b57cec5SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
27370b57cec5SDimitry Andric    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
27380b57cec5SDimitry Andric    apply(value_type __f(const value_type&)) const
27390b57cec5SDimitry Andric    {
27400b57cec5SDimitry Andric        typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
27410b57cec5SDimitry Andric        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
27420b57cec5SDimitry Andric        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
27430b57cec5SDimitry Andric    }
27440b57cec5SDimitry Andric};
27450b57cec5SDimitry Andric
27460b57cec5SDimitry Andrictemplate<class _ValExpr>
27470b57cec5SDimitry Andric__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
27480b57cec5SDimitry Andric{
27490b57cec5SDimitry Andric    valarray<result_type> __r;
27500b57cec5SDimitry Andric    size_t __n = __expr_.size();
27510b57cec5SDimitry Andric    if (__n)
27520b57cec5SDimitry Andric    {
27530b57cec5SDimitry Andric        __r.__begin_ =
2754*e8d8bef9SDimitry Andric            __r.__end_ = allocator<result_type>().allocate(__n);
27550b57cec5SDimitry Andric        for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
2756*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) result_type(__expr_[__i]);
27570b57cec5SDimitry Andric    }
27580b57cec5SDimitry Andric    return __r;
27590b57cec5SDimitry Andric}
27600b57cec5SDimitry Andric
27610b57cec5SDimitry Andric// valarray
27620b57cec5SDimitry Andric
27630b57cec5SDimitry Andrictemplate <class _Tp>
27640b57cec5SDimitry Andricinline
27650b57cec5SDimitry Andricvalarray<_Tp>::valarray(size_t __n)
2766*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2767*e8d8bef9SDimitry Andric      __end_(nullptr)
27680b57cec5SDimitry Andric{
27690b57cec5SDimitry Andric    if (__n)
27700b57cec5SDimitry Andric    {
2771*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
27720b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
27730b57cec5SDimitry Andric        try
27740b57cec5SDimitry Andric        {
27750b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
27760b57cec5SDimitry Andric            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
2777*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type();
27780b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
27790b57cec5SDimitry Andric        }
27800b57cec5SDimitry Andric        catch (...)
27810b57cec5SDimitry Andric        {
27820b57cec5SDimitry Andric            __clear(__n);
27830b57cec5SDimitry Andric            throw;
27840b57cec5SDimitry Andric        }
27850b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
27860b57cec5SDimitry Andric    }
27870b57cec5SDimitry Andric}
27880b57cec5SDimitry Andric
27890b57cec5SDimitry Andrictemplate <class _Tp>
27900b57cec5SDimitry Andricinline
27910b57cec5SDimitry Andricvalarray<_Tp>::valarray(const value_type& __x, size_t __n)
2792*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2793*e8d8bef9SDimitry Andric      __end_(nullptr)
27940b57cec5SDimitry Andric{
27950b57cec5SDimitry Andric    resize(__n, __x);
27960b57cec5SDimitry Andric}
27970b57cec5SDimitry Andric
27980b57cec5SDimitry Andrictemplate <class _Tp>
27990b57cec5SDimitry Andricvalarray<_Tp>::valarray(const value_type* __p, size_t __n)
2800*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2801*e8d8bef9SDimitry Andric      __end_(nullptr)
28020b57cec5SDimitry Andric{
28030b57cec5SDimitry Andric    if (__n)
28040b57cec5SDimitry Andric    {
2805*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
28060b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28070b57cec5SDimitry Andric        try
28080b57cec5SDimitry Andric        {
28090b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28100b57cec5SDimitry Andric            for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
2811*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(*__p);
28120b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28130b57cec5SDimitry Andric        }
28140b57cec5SDimitry Andric        catch (...)
28150b57cec5SDimitry Andric        {
28160b57cec5SDimitry Andric            __clear(__n);
28170b57cec5SDimitry Andric            throw;
28180b57cec5SDimitry Andric        }
28190b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28200b57cec5SDimitry Andric    }
28210b57cec5SDimitry Andric}
28220b57cec5SDimitry Andric
28230b57cec5SDimitry Andrictemplate <class _Tp>
28240b57cec5SDimitry Andricvalarray<_Tp>::valarray(const valarray& __v)
2825*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2826*e8d8bef9SDimitry Andric      __end_(nullptr)
28270b57cec5SDimitry Andric{
28280b57cec5SDimitry Andric    if (__v.size())
28290b57cec5SDimitry Andric    {
2830*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__v.size());
28310b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28320b57cec5SDimitry Andric        try
28330b57cec5SDimitry Andric        {
28340b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28350b57cec5SDimitry Andric            for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
2836*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(*__p);
28370b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28380b57cec5SDimitry Andric        }
28390b57cec5SDimitry Andric        catch (...)
28400b57cec5SDimitry Andric        {
28410b57cec5SDimitry Andric            __clear(__v.size());
28420b57cec5SDimitry Andric            throw;
28430b57cec5SDimitry Andric        }
28440b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28450b57cec5SDimitry Andric    }
28460b57cec5SDimitry Andric}
28470b57cec5SDimitry Andric
28480b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
28490b57cec5SDimitry Andric
28500b57cec5SDimitry Andrictemplate <class _Tp>
28510b57cec5SDimitry Andricinline
28520b57cec5SDimitry Andricvalarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
28530b57cec5SDimitry Andric    : __begin_(__v.__begin_),
28540b57cec5SDimitry Andric      __end_(__v.__end_)
28550b57cec5SDimitry Andric{
28560b57cec5SDimitry Andric    __v.__begin_ = __v.__end_ = nullptr;
28570b57cec5SDimitry Andric}
28580b57cec5SDimitry Andric
28590b57cec5SDimitry Andrictemplate <class _Tp>
28600b57cec5SDimitry Andricvalarray<_Tp>::valarray(initializer_list<value_type> __il)
2861*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2862*e8d8bef9SDimitry Andric      __end_(nullptr)
28630b57cec5SDimitry Andric{
28640b57cec5SDimitry Andric    const size_t __n = __il.size();
28650b57cec5SDimitry Andric    if (__n)
28660b57cec5SDimitry Andric    {
2867*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
28680b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28690b57cec5SDimitry Andric        try
28700b57cec5SDimitry Andric        {
28710b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28720b57cec5SDimitry Andric            size_t __n_left = __n;
28730b57cec5SDimitry Andric            for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
2874*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(*__p);
28750b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28760b57cec5SDimitry Andric        }
28770b57cec5SDimitry Andric        catch (...)
28780b57cec5SDimitry Andric        {
28790b57cec5SDimitry Andric            __clear(__n);
28800b57cec5SDimitry Andric            throw;
28810b57cec5SDimitry Andric        }
28820b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
28830b57cec5SDimitry Andric    }
28840b57cec5SDimitry Andric}
28850b57cec5SDimitry Andric
28860b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
28870b57cec5SDimitry Andric
28880b57cec5SDimitry Andrictemplate <class _Tp>
28890b57cec5SDimitry Andricvalarray<_Tp>::valarray(const slice_array<value_type>& __sa)
2890*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2891*e8d8bef9SDimitry Andric      __end_(nullptr)
28920b57cec5SDimitry Andric{
28930b57cec5SDimitry Andric    const size_t __n = __sa.__size_;
28940b57cec5SDimitry Andric    if (__n)
28950b57cec5SDimitry Andric    {
2896*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
28970b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
28980b57cec5SDimitry Andric        try
28990b57cec5SDimitry Andric        {
29000b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29010b57cec5SDimitry Andric            size_t __n_left = __n;
29020b57cec5SDimitry Andric            for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
2903*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(*__p);
29040b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29050b57cec5SDimitry Andric        }
29060b57cec5SDimitry Andric        catch (...)
29070b57cec5SDimitry Andric        {
29080b57cec5SDimitry Andric            __clear(__n);
29090b57cec5SDimitry Andric            throw;
29100b57cec5SDimitry Andric        }
29110b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29120b57cec5SDimitry Andric    }
29130b57cec5SDimitry Andric}
29140b57cec5SDimitry Andric
29150b57cec5SDimitry Andrictemplate <class _Tp>
29160b57cec5SDimitry Andricvalarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
2917*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2918*e8d8bef9SDimitry Andric      __end_(nullptr)
29190b57cec5SDimitry Andric{
29200b57cec5SDimitry Andric    const size_t __n = __ga.__1d_.size();
29210b57cec5SDimitry Andric    if (__n)
29220b57cec5SDimitry Andric    {
2923*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
29240b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29250b57cec5SDimitry Andric        try
29260b57cec5SDimitry Andric        {
29270b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29280b57cec5SDimitry Andric            typedef const size_t* _Ip;
29290b57cec5SDimitry Andric            const value_type* __s = __ga.__vp_;
29300b57cec5SDimitry Andric            for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
29310b57cec5SDimitry Andric                    __i != __e; ++__i, ++__end_)
2932*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(__s[*__i]);
29330b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29340b57cec5SDimitry Andric        }
29350b57cec5SDimitry Andric        catch (...)
29360b57cec5SDimitry Andric        {
29370b57cec5SDimitry Andric            __clear(__n);
29380b57cec5SDimitry Andric            throw;
29390b57cec5SDimitry Andric        }
29400b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29410b57cec5SDimitry Andric    }
29420b57cec5SDimitry Andric}
29430b57cec5SDimitry Andric
29440b57cec5SDimitry Andrictemplate <class _Tp>
29450b57cec5SDimitry Andricvalarray<_Tp>::valarray(const mask_array<value_type>& __ma)
2946*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2947*e8d8bef9SDimitry Andric      __end_(nullptr)
29480b57cec5SDimitry Andric{
29490b57cec5SDimitry Andric    const size_t __n = __ma.__1d_.size();
29500b57cec5SDimitry Andric    if (__n)
29510b57cec5SDimitry Andric    {
2952*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
29530b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29540b57cec5SDimitry Andric        try
29550b57cec5SDimitry Andric        {
29560b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29570b57cec5SDimitry Andric            typedef const size_t* _Ip;
29580b57cec5SDimitry Andric            const value_type* __s = __ma.__vp_;
29590b57cec5SDimitry Andric            for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
29600b57cec5SDimitry Andric                    __i != __e; ++__i, ++__end_)
2961*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(__s[*__i]);
29620b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29630b57cec5SDimitry Andric        }
29640b57cec5SDimitry Andric        catch (...)
29650b57cec5SDimitry Andric        {
29660b57cec5SDimitry Andric            __clear(__n);
29670b57cec5SDimitry Andric            throw;
29680b57cec5SDimitry Andric        }
29690b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29700b57cec5SDimitry Andric    }
29710b57cec5SDimitry Andric}
29720b57cec5SDimitry Andric
29730b57cec5SDimitry Andrictemplate <class _Tp>
29740b57cec5SDimitry Andricvalarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
2975*e8d8bef9SDimitry Andric    : __begin_(nullptr),
2976*e8d8bef9SDimitry Andric      __end_(nullptr)
29770b57cec5SDimitry Andric{
29780b57cec5SDimitry Andric    const size_t __n = __ia.__1d_.size();
29790b57cec5SDimitry Andric    if (__n)
29800b57cec5SDimitry Andric    {
2981*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
29820b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29830b57cec5SDimitry Andric        try
29840b57cec5SDimitry Andric        {
29850b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29860b57cec5SDimitry Andric            typedef const size_t* _Ip;
29870b57cec5SDimitry Andric            const value_type* __s = __ia.__vp_;
29880b57cec5SDimitry Andric            for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
29890b57cec5SDimitry Andric                    __i != __e; ++__i, ++__end_)
2990*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(__s[*__i]);
29910b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
29920b57cec5SDimitry Andric        }
29930b57cec5SDimitry Andric        catch (...)
29940b57cec5SDimitry Andric        {
29950b57cec5SDimitry Andric            __clear(__n);
29960b57cec5SDimitry Andric            throw;
29970b57cec5SDimitry Andric        }
29980b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
29990b57cec5SDimitry Andric    }
30000b57cec5SDimitry Andric}
30010b57cec5SDimitry Andric
30020b57cec5SDimitry Andrictemplate <class _Tp>
30030b57cec5SDimitry Andricinline
30040b57cec5SDimitry Andricvalarray<_Tp>::~valarray()
30050b57cec5SDimitry Andric{
30060b57cec5SDimitry Andric    __clear(size());
30070b57cec5SDimitry Andric}
30080b57cec5SDimitry Andric
30090b57cec5SDimitry Andrictemplate <class _Tp>
30100b57cec5SDimitry Andricvalarray<_Tp>&
30110b57cec5SDimitry Andricvalarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
30120b57cec5SDimitry Andric{
30130b57cec5SDimitry Andric    size_t __n = __l - __f;
30140b57cec5SDimitry Andric    if (size() != __n)
30150b57cec5SDimitry Andric    {
30160b57cec5SDimitry Andric        __clear(size());
3017*e8d8bef9SDimitry Andric        __begin_ = allocator<value_type>().allocate(__n);
30180b57cec5SDimitry Andric        __end_ = __begin_ + __n;
30190b57cec5SDimitry Andric        _VSTD::uninitialized_copy(__f, __l, __begin_);
30200b57cec5SDimitry Andric    } else {
30210b57cec5SDimitry Andric        _VSTD::copy(__f, __l, __begin_);
30220b57cec5SDimitry Andric    }
30230b57cec5SDimitry Andric    return *this;
30240b57cec5SDimitry Andric}
30250b57cec5SDimitry Andric
30260b57cec5SDimitry Andrictemplate <class _Tp>
30270b57cec5SDimitry Andricvalarray<_Tp>&
30280b57cec5SDimitry Andricvalarray<_Tp>::operator=(const valarray& __v)
30290b57cec5SDimitry Andric{
30300b57cec5SDimitry Andric    if (this != &__v)
30310b57cec5SDimitry Andric        return __assign_range(__v.__begin_, __v.__end_);
30320b57cec5SDimitry Andric    return *this;
30330b57cec5SDimitry Andric}
30340b57cec5SDimitry Andric
30350b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
30360b57cec5SDimitry Andric
30370b57cec5SDimitry Andrictemplate <class _Tp>
30380b57cec5SDimitry Andricinline
30390b57cec5SDimitry Andricvalarray<_Tp>&
30400b57cec5SDimitry Andricvalarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
30410b57cec5SDimitry Andric{
30420b57cec5SDimitry Andric    __clear(size());
30430b57cec5SDimitry Andric    __begin_ = __v.__begin_;
30440b57cec5SDimitry Andric    __end_ = __v.__end_;
30450b57cec5SDimitry Andric    __v.__begin_ = nullptr;
30460b57cec5SDimitry Andric    __v.__end_ = nullptr;
30470b57cec5SDimitry Andric    return *this;
30480b57cec5SDimitry Andric}
30490b57cec5SDimitry Andric
30500b57cec5SDimitry Andrictemplate <class _Tp>
30510b57cec5SDimitry Andricinline
30520b57cec5SDimitry Andricvalarray<_Tp>&
30530b57cec5SDimitry Andricvalarray<_Tp>::operator=(initializer_list<value_type> __il)
30540b57cec5SDimitry Andric{
30550b57cec5SDimitry Andric    return __assign_range(__il.begin(), __il.end());
30560b57cec5SDimitry Andric}
30570b57cec5SDimitry Andric
30580b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
30590b57cec5SDimitry Andric
30600b57cec5SDimitry Andrictemplate <class _Tp>
30610b57cec5SDimitry Andricinline
30620b57cec5SDimitry Andricvalarray<_Tp>&
30630b57cec5SDimitry Andricvalarray<_Tp>::operator=(const value_type& __x)
30640b57cec5SDimitry Andric{
30650b57cec5SDimitry Andric    _VSTD::fill(__begin_, __end_, __x);
30660b57cec5SDimitry Andric    return *this;
30670b57cec5SDimitry Andric}
30680b57cec5SDimitry Andric
30690b57cec5SDimitry Andrictemplate <class _Tp>
30700b57cec5SDimitry Andricinline
30710b57cec5SDimitry Andricvalarray<_Tp>&
30720b57cec5SDimitry Andricvalarray<_Tp>::operator=(const slice_array<value_type>& __sa)
30730b57cec5SDimitry Andric{
30740b57cec5SDimitry Andric    value_type* __t = __begin_;
30750b57cec5SDimitry Andric    const value_type* __s = __sa.__vp_;
30760b57cec5SDimitry Andric    for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
30770b57cec5SDimitry Andric        *__t = *__s;
30780b57cec5SDimitry Andric    return *this;
30790b57cec5SDimitry Andric}
30800b57cec5SDimitry Andric
30810b57cec5SDimitry Andrictemplate <class _Tp>
30820b57cec5SDimitry Andricinline
30830b57cec5SDimitry Andricvalarray<_Tp>&
30840b57cec5SDimitry Andricvalarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
30850b57cec5SDimitry Andric{
30860b57cec5SDimitry Andric    typedef const size_t* _Ip;
30870b57cec5SDimitry Andric    value_type* __t = __begin_;
30880b57cec5SDimitry Andric    const value_type* __s = __ga.__vp_;
30890b57cec5SDimitry Andric    for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
30900b57cec5SDimitry Andric                    __i != __e; ++__i, ++__t)
30910b57cec5SDimitry Andric        *__t = __s[*__i];
30920b57cec5SDimitry Andric    return *this;
30930b57cec5SDimitry Andric}
30940b57cec5SDimitry Andric
30950b57cec5SDimitry Andrictemplate <class _Tp>
30960b57cec5SDimitry Andricinline
30970b57cec5SDimitry Andricvalarray<_Tp>&
30980b57cec5SDimitry Andricvalarray<_Tp>::operator=(const mask_array<value_type>& __ma)
30990b57cec5SDimitry Andric{
31000b57cec5SDimitry Andric    typedef const size_t* _Ip;
31010b57cec5SDimitry Andric    value_type* __t = __begin_;
31020b57cec5SDimitry Andric    const value_type* __s = __ma.__vp_;
31030b57cec5SDimitry Andric    for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
31040b57cec5SDimitry Andric                    __i != __e; ++__i, ++__t)
31050b57cec5SDimitry Andric        *__t = __s[*__i];
31060b57cec5SDimitry Andric    return *this;
31070b57cec5SDimitry Andric}
31080b57cec5SDimitry Andric
31090b57cec5SDimitry Andrictemplate <class _Tp>
31100b57cec5SDimitry Andricinline
31110b57cec5SDimitry Andricvalarray<_Tp>&
31120b57cec5SDimitry Andricvalarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
31130b57cec5SDimitry Andric{
31140b57cec5SDimitry Andric    typedef const size_t* _Ip;
31150b57cec5SDimitry Andric    value_type* __t = __begin_;
31160b57cec5SDimitry Andric    const value_type* __s = __ia.__vp_;
31170b57cec5SDimitry Andric    for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
31180b57cec5SDimitry Andric                    __i != __e; ++__i, ++__t)
31190b57cec5SDimitry Andric        *__t = __s[*__i];
31200b57cec5SDimitry Andric    return *this;
31210b57cec5SDimitry Andric}
31220b57cec5SDimitry Andric
31230b57cec5SDimitry Andrictemplate <class _Tp>
31240b57cec5SDimitry Andrictemplate <class _ValExpr>
31250b57cec5SDimitry Andricinline
31260b57cec5SDimitry Andricvalarray<_Tp>&
31270b57cec5SDimitry Andricvalarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
31280b57cec5SDimitry Andric{
31290b57cec5SDimitry Andric    size_t __n = __v.size();
31300b57cec5SDimitry Andric    if (size() != __n)
31310b57cec5SDimitry Andric        resize(__n);
31320b57cec5SDimitry Andric    value_type* __t = __begin_;
31330b57cec5SDimitry Andric    for (size_t __i = 0; __i != __n; ++__t, ++__i)
31340b57cec5SDimitry Andric        *__t = result_type(__v[__i]);
31350b57cec5SDimitry Andric    return *this;
31360b57cec5SDimitry Andric}
31370b57cec5SDimitry Andric
31380b57cec5SDimitry Andrictemplate <class _Tp>
31390b57cec5SDimitry Andricinline
31400b57cec5SDimitry Andric__val_expr<__slice_expr<const valarray<_Tp>&> >
31410b57cec5SDimitry Andricvalarray<_Tp>::operator[](slice __s) const
31420b57cec5SDimitry Andric{
31430b57cec5SDimitry Andric    return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
31440b57cec5SDimitry Andric}
31450b57cec5SDimitry Andric
31460b57cec5SDimitry Andrictemplate <class _Tp>
31470b57cec5SDimitry Andricinline
31480b57cec5SDimitry Andricslice_array<_Tp>
31490b57cec5SDimitry Andricvalarray<_Tp>::operator[](slice __s)
31500b57cec5SDimitry Andric{
31510b57cec5SDimitry Andric    return slice_array<value_type>(__s, *this);
31520b57cec5SDimitry Andric}
31530b57cec5SDimitry Andric
31540b57cec5SDimitry Andrictemplate <class _Tp>
31550b57cec5SDimitry Andricinline
31560b57cec5SDimitry Andric__val_expr<__indirect_expr<const valarray<_Tp>&> >
31570b57cec5SDimitry Andricvalarray<_Tp>::operator[](const gslice& __gs) const
31580b57cec5SDimitry Andric{
31590b57cec5SDimitry Andric    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
31600b57cec5SDimitry Andric}
31610b57cec5SDimitry Andric
31620b57cec5SDimitry Andrictemplate <class _Tp>
31630b57cec5SDimitry Andricinline
31640b57cec5SDimitry Andricgslice_array<_Tp>
31650b57cec5SDimitry Andricvalarray<_Tp>::operator[](const gslice& __gs)
31660b57cec5SDimitry Andric{
31670b57cec5SDimitry Andric    return gslice_array<value_type>(__gs, *this);
31680b57cec5SDimitry Andric}
31690b57cec5SDimitry Andric
31700b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
31710b57cec5SDimitry Andric
31720b57cec5SDimitry Andrictemplate <class _Tp>
31730b57cec5SDimitry Andricinline
31740b57cec5SDimitry Andric__val_expr<__indirect_expr<const valarray<_Tp>&> >
31750b57cec5SDimitry Andricvalarray<_Tp>::operator[](gslice&& __gs) const
31760b57cec5SDimitry Andric{
31770b57cec5SDimitry Andric    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
31780b57cec5SDimitry Andric}
31790b57cec5SDimitry Andric
31800b57cec5SDimitry Andrictemplate <class _Tp>
31810b57cec5SDimitry Andricinline
31820b57cec5SDimitry Andricgslice_array<_Tp>
31830b57cec5SDimitry Andricvalarray<_Tp>::operator[](gslice&& __gs)
31840b57cec5SDimitry Andric{
31850b57cec5SDimitry Andric    return gslice_array<value_type>(move(__gs), *this);
31860b57cec5SDimitry Andric}
31870b57cec5SDimitry Andric
31880b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
31890b57cec5SDimitry Andric
31900b57cec5SDimitry Andrictemplate <class _Tp>
31910b57cec5SDimitry Andricinline
31920b57cec5SDimitry Andric__val_expr<__mask_expr<const valarray<_Tp>&> >
31930b57cec5SDimitry Andricvalarray<_Tp>::operator[](const valarray<bool>& __vb) const
31940b57cec5SDimitry Andric{
31950b57cec5SDimitry Andric    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
31960b57cec5SDimitry Andric}
31970b57cec5SDimitry Andric
31980b57cec5SDimitry Andrictemplate <class _Tp>
31990b57cec5SDimitry Andricinline
32000b57cec5SDimitry Andricmask_array<_Tp>
32010b57cec5SDimitry Andricvalarray<_Tp>::operator[](const valarray<bool>& __vb)
32020b57cec5SDimitry Andric{
32030b57cec5SDimitry Andric    return mask_array<value_type>(__vb, *this);
32040b57cec5SDimitry Andric}
32050b57cec5SDimitry Andric
32060b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
32070b57cec5SDimitry Andric
32080b57cec5SDimitry Andrictemplate <class _Tp>
32090b57cec5SDimitry Andricinline
32100b57cec5SDimitry Andric__val_expr<__mask_expr<const valarray<_Tp>&> >
32110b57cec5SDimitry Andricvalarray<_Tp>::operator[](valarray<bool>&& __vb) const
32120b57cec5SDimitry Andric{
32130b57cec5SDimitry Andric    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
32140b57cec5SDimitry Andric}
32150b57cec5SDimitry Andric
32160b57cec5SDimitry Andrictemplate <class _Tp>
32170b57cec5SDimitry Andricinline
32180b57cec5SDimitry Andricmask_array<_Tp>
32190b57cec5SDimitry Andricvalarray<_Tp>::operator[](valarray<bool>&& __vb)
32200b57cec5SDimitry Andric{
32210b57cec5SDimitry Andric    return mask_array<value_type>(move(__vb), *this);
32220b57cec5SDimitry Andric}
32230b57cec5SDimitry Andric
32240b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
32250b57cec5SDimitry Andric
32260b57cec5SDimitry Andrictemplate <class _Tp>
32270b57cec5SDimitry Andricinline
32280b57cec5SDimitry Andric__val_expr<__indirect_expr<const valarray<_Tp>&> >
32290b57cec5SDimitry Andricvalarray<_Tp>::operator[](const valarray<size_t>& __vs) const
32300b57cec5SDimitry Andric{
32310b57cec5SDimitry Andric    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
32320b57cec5SDimitry Andric}
32330b57cec5SDimitry Andric
32340b57cec5SDimitry Andrictemplate <class _Tp>
32350b57cec5SDimitry Andricinline
32360b57cec5SDimitry Andricindirect_array<_Tp>
32370b57cec5SDimitry Andricvalarray<_Tp>::operator[](const valarray<size_t>& __vs)
32380b57cec5SDimitry Andric{
32390b57cec5SDimitry Andric    return indirect_array<value_type>(__vs, *this);
32400b57cec5SDimitry Andric}
32410b57cec5SDimitry Andric
32420b57cec5SDimitry Andric#ifndef _LIBCPP_CXX03_LANG
32430b57cec5SDimitry Andric
32440b57cec5SDimitry Andrictemplate <class _Tp>
32450b57cec5SDimitry Andricinline
32460b57cec5SDimitry Andric__val_expr<__indirect_expr<const valarray<_Tp>&> >
32470b57cec5SDimitry Andricvalarray<_Tp>::operator[](valarray<size_t>&& __vs) const
32480b57cec5SDimitry Andric{
32490b57cec5SDimitry Andric    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
32500b57cec5SDimitry Andric}
32510b57cec5SDimitry Andric
32520b57cec5SDimitry Andrictemplate <class _Tp>
32530b57cec5SDimitry Andricinline
32540b57cec5SDimitry Andricindirect_array<_Tp>
32550b57cec5SDimitry Andricvalarray<_Tp>::operator[](valarray<size_t>&& __vs)
32560b57cec5SDimitry Andric{
32570b57cec5SDimitry Andric    return indirect_array<value_type>(move(__vs), *this);
32580b57cec5SDimitry Andric}
32590b57cec5SDimitry Andric
32600b57cec5SDimitry Andric#endif  // _LIBCPP_CXX03_LANG
32610b57cec5SDimitry Andric
32620b57cec5SDimitry Andrictemplate <class _Tp>
32630b57cec5SDimitry Andricvalarray<_Tp>
32640b57cec5SDimitry Andricvalarray<_Tp>::operator+() const
32650b57cec5SDimitry Andric{
32660b57cec5SDimitry Andric    valarray<value_type> __r;
32670b57cec5SDimitry Andric    size_t __n = size();
32680b57cec5SDimitry Andric    if (__n)
32690b57cec5SDimitry Andric    {
3270*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
32710b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3272*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(+*__p);
32730b57cec5SDimitry Andric    }
32740b57cec5SDimitry Andric    return __r;
32750b57cec5SDimitry Andric}
32760b57cec5SDimitry Andric
32770b57cec5SDimitry Andrictemplate <class _Tp>
32780b57cec5SDimitry Andricvalarray<_Tp>
32790b57cec5SDimitry Andricvalarray<_Tp>::operator-() const
32800b57cec5SDimitry Andric{
32810b57cec5SDimitry Andric    valarray<value_type> __r;
32820b57cec5SDimitry Andric    size_t __n = size();
32830b57cec5SDimitry Andric    if (__n)
32840b57cec5SDimitry Andric    {
3285*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
32860b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3287*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(-*__p);
32880b57cec5SDimitry Andric    }
32890b57cec5SDimitry Andric    return __r;
32900b57cec5SDimitry Andric}
32910b57cec5SDimitry Andric
32920b57cec5SDimitry Andrictemplate <class _Tp>
32930b57cec5SDimitry Andricvalarray<_Tp>
32940b57cec5SDimitry Andricvalarray<_Tp>::operator~() const
32950b57cec5SDimitry Andric{
32960b57cec5SDimitry Andric    valarray<value_type> __r;
32970b57cec5SDimitry Andric    size_t __n = size();
32980b57cec5SDimitry Andric    if (__n)
32990b57cec5SDimitry Andric    {
3300*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
33010b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3302*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(~*__p);
33030b57cec5SDimitry Andric    }
33040b57cec5SDimitry Andric    return __r;
33050b57cec5SDimitry Andric}
33060b57cec5SDimitry Andric
33070b57cec5SDimitry Andrictemplate <class _Tp>
33080b57cec5SDimitry Andricvalarray<bool>
33090b57cec5SDimitry Andricvalarray<_Tp>::operator!() const
33100b57cec5SDimitry Andric{
33110b57cec5SDimitry Andric    valarray<bool> __r;
33120b57cec5SDimitry Andric    size_t __n = size();
33130b57cec5SDimitry Andric    if (__n)
33140b57cec5SDimitry Andric    {
3315*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<bool>().allocate(__n);
33160b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3317*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) bool(!*__p);
33180b57cec5SDimitry Andric    }
33190b57cec5SDimitry Andric    return __r;
33200b57cec5SDimitry Andric}
33210b57cec5SDimitry Andric
33220b57cec5SDimitry Andrictemplate <class _Tp>
33230b57cec5SDimitry Andricinline
33240b57cec5SDimitry Andricvalarray<_Tp>&
33250b57cec5SDimitry Andricvalarray<_Tp>::operator*=(const value_type& __x)
33260b57cec5SDimitry Andric{
33270b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33280b57cec5SDimitry Andric        *__p *= __x;
33290b57cec5SDimitry Andric    return *this;
33300b57cec5SDimitry Andric}
33310b57cec5SDimitry Andric
33320b57cec5SDimitry Andrictemplate <class _Tp>
33330b57cec5SDimitry Andricinline
33340b57cec5SDimitry Andricvalarray<_Tp>&
33350b57cec5SDimitry Andricvalarray<_Tp>::operator/=(const value_type& __x)
33360b57cec5SDimitry Andric{
33370b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33380b57cec5SDimitry Andric        *__p /= __x;
33390b57cec5SDimitry Andric    return *this;
33400b57cec5SDimitry Andric}
33410b57cec5SDimitry Andric
33420b57cec5SDimitry Andrictemplate <class _Tp>
33430b57cec5SDimitry Andricinline
33440b57cec5SDimitry Andricvalarray<_Tp>&
33450b57cec5SDimitry Andricvalarray<_Tp>::operator%=(const value_type& __x)
33460b57cec5SDimitry Andric{
33470b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33480b57cec5SDimitry Andric        *__p %= __x;
33490b57cec5SDimitry Andric    return *this;
33500b57cec5SDimitry Andric}
33510b57cec5SDimitry Andric
33520b57cec5SDimitry Andrictemplate <class _Tp>
33530b57cec5SDimitry Andricinline
33540b57cec5SDimitry Andricvalarray<_Tp>&
33550b57cec5SDimitry Andricvalarray<_Tp>::operator+=(const value_type& __x)
33560b57cec5SDimitry Andric{
33570b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33580b57cec5SDimitry Andric        *__p += __x;
33590b57cec5SDimitry Andric    return *this;
33600b57cec5SDimitry Andric}
33610b57cec5SDimitry Andric
33620b57cec5SDimitry Andrictemplate <class _Tp>
33630b57cec5SDimitry Andricinline
33640b57cec5SDimitry Andricvalarray<_Tp>&
33650b57cec5SDimitry Andricvalarray<_Tp>::operator-=(const value_type& __x)
33660b57cec5SDimitry Andric{
33670b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33680b57cec5SDimitry Andric        *__p -= __x;
33690b57cec5SDimitry Andric    return *this;
33700b57cec5SDimitry Andric}
33710b57cec5SDimitry Andric
33720b57cec5SDimitry Andrictemplate <class _Tp>
33730b57cec5SDimitry Andricinline
33740b57cec5SDimitry Andricvalarray<_Tp>&
33750b57cec5SDimitry Andricvalarray<_Tp>::operator^=(const value_type& __x)
33760b57cec5SDimitry Andric{
33770b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33780b57cec5SDimitry Andric        *__p ^= __x;
33790b57cec5SDimitry Andric    return *this;
33800b57cec5SDimitry Andric}
33810b57cec5SDimitry Andric
33820b57cec5SDimitry Andrictemplate <class _Tp>
33830b57cec5SDimitry Andricinline
33840b57cec5SDimitry Andricvalarray<_Tp>&
33850b57cec5SDimitry Andricvalarray<_Tp>::operator&=(const value_type& __x)
33860b57cec5SDimitry Andric{
33870b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33880b57cec5SDimitry Andric        *__p &= __x;
33890b57cec5SDimitry Andric    return *this;
33900b57cec5SDimitry Andric}
33910b57cec5SDimitry Andric
33920b57cec5SDimitry Andrictemplate <class _Tp>
33930b57cec5SDimitry Andricinline
33940b57cec5SDimitry Andricvalarray<_Tp>&
33950b57cec5SDimitry Andricvalarray<_Tp>::operator|=(const value_type& __x)
33960b57cec5SDimitry Andric{
33970b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
33980b57cec5SDimitry Andric        *__p |= __x;
33990b57cec5SDimitry Andric    return *this;
34000b57cec5SDimitry Andric}
34010b57cec5SDimitry Andric
34020b57cec5SDimitry Andrictemplate <class _Tp>
34030b57cec5SDimitry Andricinline
34040b57cec5SDimitry Andricvalarray<_Tp>&
34050b57cec5SDimitry Andricvalarray<_Tp>::operator<<=(const value_type& __x)
34060b57cec5SDimitry Andric{
34070b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
34080b57cec5SDimitry Andric        *__p <<= __x;
34090b57cec5SDimitry Andric    return *this;
34100b57cec5SDimitry Andric}
34110b57cec5SDimitry Andric
34120b57cec5SDimitry Andrictemplate <class _Tp>
34130b57cec5SDimitry Andricinline
34140b57cec5SDimitry Andricvalarray<_Tp>&
34150b57cec5SDimitry Andricvalarray<_Tp>::operator>>=(const value_type& __x)
34160b57cec5SDimitry Andric{
34170b57cec5SDimitry Andric    for (value_type* __p = __begin_; __p != __end_; ++__p)
34180b57cec5SDimitry Andric        *__p >>= __x;
34190b57cec5SDimitry Andric    return *this;
34200b57cec5SDimitry Andric}
34210b57cec5SDimitry Andric
34220b57cec5SDimitry Andrictemplate <class _Tp>
34230b57cec5SDimitry Andrictemplate <class _Expr>
34240b57cec5SDimitry Andricinline
34250b57cec5SDimitry Andrictypename enable_if
34260b57cec5SDimitry Andric<
34270b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
34280b57cec5SDimitry Andric    valarray<_Tp>&
34290b57cec5SDimitry Andric>::type
34300b57cec5SDimitry Andricvalarray<_Tp>::operator*=(const _Expr& __v)
34310b57cec5SDimitry Andric{
34320b57cec5SDimitry Andric    size_t __i = 0;
34330b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34340b57cec5SDimitry Andric        *__t *= __v[__i];
34350b57cec5SDimitry Andric    return *this;
34360b57cec5SDimitry Andric}
34370b57cec5SDimitry Andric
34380b57cec5SDimitry Andrictemplate <class _Tp>
34390b57cec5SDimitry Andrictemplate <class _Expr>
34400b57cec5SDimitry Andricinline
34410b57cec5SDimitry Andrictypename enable_if
34420b57cec5SDimitry Andric<
34430b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
34440b57cec5SDimitry Andric    valarray<_Tp>&
34450b57cec5SDimitry Andric>::type
34460b57cec5SDimitry Andricvalarray<_Tp>::operator/=(const _Expr& __v)
34470b57cec5SDimitry Andric{
34480b57cec5SDimitry Andric    size_t __i = 0;
34490b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34500b57cec5SDimitry Andric        *__t /= __v[__i];
34510b57cec5SDimitry Andric    return *this;
34520b57cec5SDimitry Andric}
34530b57cec5SDimitry Andric
34540b57cec5SDimitry Andrictemplate <class _Tp>
34550b57cec5SDimitry Andrictemplate <class _Expr>
34560b57cec5SDimitry Andricinline
34570b57cec5SDimitry Andrictypename enable_if
34580b57cec5SDimitry Andric<
34590b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
34600b57cec5SDimitry Andric    valarray<_Tp>&
34610b57cec5SDimitry Andric>::type
34620b57cec5SDimitry Andricvalarray<_Tp>::operator%=(const _Expr& __v)
34630b57cec5SDimitry Andric{
34640b57cec5SDimitry Andric    size_t __i = 0;
34650b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34660b57cec5SDimitry Andric        *__t %= __v[__i];
34670b57cec5SDimitry Andric    return *this;
34680b57cec5SDimitry Andric}
34690b57cec5SDimitry Andric
34700b57cec5SDimitry Andrictemplate <class _Tp>
34710b57cec5SDimitry Andrictemplate <class _Expr>
34720b57cec5SDimitry Andricinline
34730b57cec5SDimitry Andrictypename enable_if
34740b57cec5SDimitry Andric<
34750b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
34760b57cec5SDimitry Andric    valarray<_Tp>&
34770b57cec5SDimitry Andric>::type
34780b57cec5SDimitry Andricvalarray<_Tp>::operator+=(const _Expr& __v)
34790b57cec5SDimitry Andric{
34800b57cec5SDimitry Andric    size_t __i = 0;
34810b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34820b57cec5SDimitry Andric        *__t += __v[__i];
34830b57cec5SDimitry Andric    return *this;
34840b57cec5SDimitry Andric}
34850b57cec5SDimitry Andric
34860b57cec5SDimitry Andrictemplate <class _Tp>
34870b57cec5SDimitry Andrictemplate <class _Expr>
34880b57cec5SDimitry Andricinline
34890b57cec5SDimitry Andrictypename enable_if
34900b57cec5SDimitry Andric<
34910b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
34920b57cec5SDimitry Andric    valarray<_Tp>&
34930b57cec5SDimitry Andric>::type
34940b57cec5SDimitry Andricvalarray<_Tp>::operator-=(const _Expr& __v)
34950b57cec5SDimitry Andric{
34960b57cec5SDimitry Andric    size_t __i = 0;
34970b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34980b57cec5SDimitry Andric        *__t -= __v[__i];
34990b57cec5SDimitry Andric    return *this;
35000b57cec5SDimitry Andric}
35010b57cec5SDimitry Andric
35020b57cec5SDimitry Andrictemplate <class _Tp>
35030b57cec5SDimitry Andrictemplate <class _Expr>
35040b57cec5SDimitry Andricinline
35050b57cec5SDimitry Andrictypename enable_if
35060b57cec5SDimitry Andric<
35070b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
35080b57cec5SDimitry Andric    valarray<_Tp>&
35090b57cec5SDimitry Andric>::type
35100b57cec5SDimitry Andricvalarray<_Tp>::operator^=(const _Expr& __v)
35110b57cec5SDimitry Andric{
35120b57cec5SDimitry Andric    size_t __i = 0;
35130b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35140b57cec5SDimitry Andric        *__t ^= __v[__i];
35150b57cec5SDimitry Andric    return *this;
35160b57cec5SDimitry Andric}
35170b57cec5SDimitry Andric
35180b57cec5SDimitry Andrictemplate <class _Tp>
35190b57cec5SDimitry Andrictemplate <class _Expr>
35200b57cec5SDimitry Andricinline
35210b57cec5SDimitry Andrictypename enable_if
35220b57cec5SDimitry Andric<
35230b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
35240b57cec5SDimitry Andric    valarray<_Tp>&
35250b57cec5SDimitry Andric>::type
35260b57cec5SDimitry Andricvalarray<_Tp>::operator|=(const _Expr& __v)
35270b57cec5SDimitry Andric{
35280b57cec5SDimitry Andric    size_t __i = 0;
35290b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35300b57cec5SDimitry Andric        *__t |= __v[__i];
35310b57cec5SDimitry Andric    return *this;
35320b57cec5SDimitry Andric}
35330b57cec5SDimitry Andric
35340b57cec5SDimitry Andrictemplate <class _Tp>
35350b57cec5SDimitry Andrictemplate <class _Expr>
35360b57cec5SDimitry Andricinline
35370b57cec5SDimitry Andrictypename enable_if
35380b57cec5SDimitry Andric<
35390b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
35400b57cec5SDimitry Andric    valarray<_Tp>&
35410b57cec5SDimitry Andric>::type
35420b57cec5SDimitry Andricvalarray<_Tp>::operator&=(const _Expr& __v)
35430b57cec5SDimitry Andric{
35440b57cec5SDimitry Andric    size_t __i = 0;
35450b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35460b57cec5SDimitry Andric        *__t &= __v[__i];
35470b57cec5SDimitry Andric    return *this;
35480b57cec5SDimitry Andric}
35490b57cec5SDimitry Andric
35500b57cec5SDimitry Andrictemplate <class _Tp>
35510b57cec5SDimitry Andrictemplate <class _Expr>
35520b57cec5SDimitry Andricinline
35530b57cec5SDimitry Andrictypename enable_if
35540b57cec5SDimitry Andric<
35550b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
35560b57cec5SDimitry Andric    valarray<_Tp>&
35570b57cec5SDimitry Andric>::type
35580b57cec5SDimitry Andricvalarray<_Tp>::operator<<=(const _Expr& __v)
35590b57cec5SDimitry Andric{
35600b57cec5SDimitry Andric    size_t __i = 0;
35610b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35620b57cec5SDimitry Andric        *__t <<= __v[__i];
35630b57cec5SDimitry Andric    return *this;
35640b57cec5SDimitry Andric}
35650b57cec5SDimitry Andric
35660b57cec5SDimitry Andrictemplate <class _Tp>
35670b57cec5SDimitry Andrictemplate <class _Expr>
35680b57cec5SDimitry Andricinline
35690b57cec5SDimitry Andrictypename enable_if
35700b57cec5SDimitry Andric<
35710b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
35720b57cec5SDimitry Andric    valarray<_Tp>&
35730b57cec5SDimitry Andric>::type
35740b57cec5SDimitry Andricvalarray<_Tp>::operator>>=(const _Expr& __v)
35750b57cec5SDimitry Andric{
35760b57cec5SDimitry Andric    size_t __i = 0;
35770b57cec5SDimitry Andric    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35780b57cec5SDimitry Andric        *__t >>= __v[__i];
35790b57cec5SDimitry Andric    return *this;
35800b57cec5SDimitry Andric}
35810b57cec5SDimitry Andric
35820b57cec5SDimitry Andrictemplate <class _Tp>
35830b57cec5SDimitry Andricinline
35840b57cec5SDimitry Andricvoid
35850b57cec5SDimitry Andricvalarray<_Tp>::swap(valarray& __v) _NOEXCEPT
35860b57cec5SDimitry Andric{
35870b57cec5SDimitry Andric    _VSTD::swap(__begin_, __v.__begin_);
35880b57cec5SDimitry Andric    _VSTD::swap(__end_, __v.__end_);
35890b57cec5SDimitry Andric}
35900b57cec5SDimitry Andric
35910b57cec5SDimitry Andrictemplate <class _Tp>
35920b57cec5SDimitry Andricinline
35930b57cec5SDimitry Andric_Tp
35940b57cec5SDimitry Andricvalarray<_Tp>::sum() const
35950b57cec5SDimitry Andric{
35960b57cec5SDimitry Andric    if (__begin_ == __end_)
35970b57cec5SDimitry Andric        return value_type();
35980b57cec5SDimitry Andric    const value_type* __p = __begin_;
35990b57cec5SDimitry Andric    _Tp __r = *__p;
36000b57cec5SDimitry Andric    for (++__p; __p != __end_; ++__p)
36010b57cec5SDimitry Andric        __r += *__p;
36020b57cec5SDimitry Andric    return __r;
36030b57cec5SDimitry Andric}
36040b57cec5SDimitry Andric
36050b57cec5SDimitry Andrictemplate <class _Tp>
36060b57cec5SDimitry Andricinline
36070b57cec5SDimitry Andric_Tp
36080b57cec5SDimitry Andricvalarray<_Tp>::min() const
36090b57cec5SDimitry Andric{
36100b57cec5SDimitry Andric    if (__begin_ == __end_)
36110b57cec5SDimitry Andric        return value_type();
36120b57cec5SDimitry Andric    return *_VSTD::min_element(__begin_, __end_);
36130b57cec5SDimitry Andric}
36140b57cec5SDimitry Andric
36150b57cec5SDimitry Andrictemplate <class _Tp>
36160b57cec5SDimitry Andricinline
36170b57cec5SDimitry Andric_Tp
36180b57cec5SDimitry Andricvalarray<_Tp>::max() const
36190b57cec5SDimitry Andric{
36200b57cec5SDimitry Andric    if (__begin_ == __end_)
36210b57cec5SDimitry Andric        return value_type();
36220b57cec5SDimitry Andric    return *_VSTD::max_element(__begin_, __end_);
36230b57cec5SDimitry Andric}
36240b57cec5SDimitry Andric
36250b57cec5SDimitry Andrictemplate <class _Tp>
36260b57cec5SDimitry Andricvalarray<_Tp>
36270b57cec5SDimitry Andricvalarray<_Tp>::shift(int __i) const
36280b57cec5SDimitry Andric{
36290b57cec5SDimitry Andric    valarray<value_type> __r;
36300b57cec5SDimitry Andric    size_t __n = size();
36310b57cec5SDimitry Andric    if (__n)
36320b57cec5SDimitry Andric    {
3633*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
36340b57cec5SDimitry Andric        const value_type* __sb;
36350b57cec5SDimitry Andric        value_type* __tb;
36360b57cec5SDimitry Andric        value_type* __te;
36370b57cec5SDimitry Andric        if (__i >= 0)
36380b57cec5SDimitry Andric        {
36390b57cec5SDimitry Andric            __i = _VSTD::min(__i, static_cast<int>(__n));
36400b57cec5SDimitry Andric            __sb = __begin_ + __i;
36410b57cec5SDimitry Andric            __tb = __r.__begin_;
36420b57cec5SDimitry Andric            __te = __r.__begin_ + (__n - __i);
36430b57cec5SDimitry Andric        }
36440b57cec5SDimitry Andric        else
36450b57cec5SDimitry Andric        {
36460b57cec5SDimitry Andric            __i = _VSTD::min(-__i, static_cast<int>(__n));
36470b57cec5SDimitry Andric            __sb = __begin_;
36480b57cec5SDimitry Andric            __tb = __r.__begin_ + __i;
36490b57cec5SDimitry Andric            __te = __r.__begin_ + __n;
36500b57cec5SDimitry Andric        }
36510b57cec5SDimitry Andric        for (; __r.__end_ != __tb; ++__r.__end_)
3652*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type();
36530b57cec5SDimitry Andric        for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
3654*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(*__sb);
36550b57cec5SDimitry Andric        for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
3656*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type();
36570b57cec5SDimitry Andric    }
36580b57cec5SDimitry Andric    return __r;
36590b57cec5SDimitry Andric}
36600b57cec5SDimitry Andric
36610b57cec5SDimitry Andrictemplate <class _Tp>
36620b57cec5SDimitry Andricvalarray<_Tp>
36630b57cec5SDimitry Andricvalarray<_Tp>::cshift(int __i) const
36640b57cec5SDimitry Andric{
36650b57cec5SDimitry Andric    valarray<value_type> __r;
36660b57cec5SDimitry Andric    size_t __n = size();
36670b57cec5SDimitry Andric    if (__n)
36680b57cec5SDimitry Andric    {
3669*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
36700b57cec5SDimitry Andric        __i %= static_cast<int>(__n);
36710b57cec5SDimitry Andric        const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
36720b57cec5SDimitry Andric        for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
3673*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(*__s);
36740b57cec5SDimitry Andric        for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
3675*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(*__s);
36760b57cec5SDimitry Andric    }
36770b57cec5SDimitry Andric    return __r;
36780b57cec5SDimitry Andric}
36790b57cec5SDimitry Andric
36800b57cec5SDimitry Andrictemplate <class _Tp>
36810b57cec5SDimitry Andricvalarray<_Tp>
36820b57cec5SDimitry Andricvalarray<_Tp>::apply(value_type __f(value_type)) const
36830b57cec5SDimitry Andric{
36840b57cec5SDimitry Andric    valarray<value_type> __r;
36850b57cec5SDimitry Andric    size_t __n = size();
36860b57cec5SDimitry Andric    if (__n)
36870b57cec5SDimitry Andric    {
3688*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
36890b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3690*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(__f(*__p));
36910b57cec5SDimitry Andric    }
36920b57cec5SDimitry Andric    return __r;
36930b57cec5SDimitry Andric}
36940b57cec5SDimitry Andric
36950b57cec5SDimitry Andrictemplate <class _Tp>
36960b57cec5SDimitry Andricvalarray<_Tp>
36970b57cec5SDimitry Andricvalarray<_Tp>::apply(value_type __f(const value_type&)) const
36980b57cec5SDimitry Andric{
36990b57cec5SDimitry Andric    valarray<value_type> __r;
37000b57cec5SDimitry Andric    size_t __n = size();
37010b57cec5SDimitry Andric    if (__n)
37020b57cec5SDimitry Andric    {
3703*e8d8bef9SDimitry Andric        __r.__begin_ = __r.__end_ = allocator<value_type>().allocate(__n);
37040b57cec5SDimitry Andric        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
3705*e8d8bef9SDimitry Andric            ::new ((void*)__r.__end_) value_type(__f(*__p));
37060b57cec5SDimitry Andric    }
37070b57cec5SDimitry Andric    return __r;
37080b57cec5SDimitry Andric}
37090b57cec5SDimitry Andric
37100b57cec5SDimitry Andrictemplate <class _Tp>
37110b57cec5SDimitry Andricinline
37120b57cec5SDimitry Andricvoid valarray<_Tp>::__clear(size_t __capacity)
37130b57cec5SDimitry Andric{
37140b57cec5SDimitry Andric  if (__begin_ != nullptr)
37150b57cec5SDimitry Andric  {
37160b57cec5SDimitry Andric    while (__end_ != __begin_)
37170b57cec5SDimitry Andric      (--__end_)->~value_type();
3718*e8d8bef9SDimitry Andric    allocator<value_type>().deallocate(__begin_, __capacity);
37190b57cec5SDimitry Andric    __begin_ = __end_ = nullptr;
37200b57cec5SDimitry Andric  }
37210b57cec5SDimitry Andric}
37220b57cec5SDimitry Andric
37230b57cec5SDimitry Andrictemplate <class _Tp>
37240b57cec5SDimitry Andricvoid
37250b57cec5SDimitry Andricvalarray<_Tp>::resize(size_t __n, value_type __x)
37260b57cec5SDimitry Andric{
37270b57cec5SDimitry Andric    __clear(size());
37280b57cec5SDimitry Andric    if (__n)
37290b57cec5SDimitry Andric    {
3730*e8d8bef9SDimitry Andric        __begin_ = __end_ = allocator<value_type>().allocate(__n);
37310b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
37320b57cec5SDimitry Andric        try
37330b57cec5SDimitry Andric        {
37340b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
37350b57cec5SDimitry Andric            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
3736*e8d8bef9SDimitry Andric                ::new ((void*)__end_) value_type(__x);
37370b57cec5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
37380b57cec5SDimitry Andric        }
37390b57cec5SDimitry Andric        catch (...)
37400b57cec5SDimitry Andric        {
37410b57cec5SDimitry Andric            __clear(__n);
37420b57cec5SDimitry Andric            throw;
37430b57cec5SDimitry Andric        }
37440b57cec5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
37450b57cec5SDimitry Andric    }
37460b57cec5SDimitry Andric}
37470b57cec5SDimitry Andric
37480b57cec5SDimitry Andrictemplate<class _Tp>
37490b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
37500b57cec5SDimitry Andricvoid
37510b57cec5SDimitry Andricswap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
37520b57cec5SDimitry Andric{
37530b57cec5SDimitry Andric    __x.swap(__y);
37540b57cec5SDimitry Andric}
37550b57cec5SDimitry Andric
37560b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
37570b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
37580b57cec5SDimitry Andrictypename enable_if
37590b57cec5SDimitry Andric<
37600b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
37610b57cec5SDimitry Andric    __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
37620b57cec5SDimitry Andric>::type
37630b57cec5SDimitry Andricoperator*(const _Expr1& __x, const _Expr2& __y)
37640b57cec5SDimitry Andric{
37650b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
37660b57cec5SDimitry Andric    typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
37670b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
37680b57cec5SDimitry Andric}
37690b57cec5SDimitry Andric
37700b57cec5SDimitry Andrictemplate<class _Expr>
37710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
37720b57cec5SDimitry Andrictypename enable_if
37730b57cec5SDimitry Andric<
37740b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
37750b57cec5SDimitry Andric    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
37760b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
37770b57cec5SDimitry Andric>::type
37780b57cec5SDimitry Andricoperator*(const _Expr& __x, const typename _Expr::value_type& __y)
37790b57cec5SDimitry Andric{
37800b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
37810b57cec5SDimitry Andric    typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
37820b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(multiplies<value_type>(),
37830b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
37840b57cec5SDimitry Andric}
37850b57cec5SDimitry Andric
37860b57cec5SDimitry Andrictemplate<class _Expr>
37870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
37880b57cec5SDimitry Andrictypename enable_if
37890b57cec5SDimitry Andric<
37900b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
37910b57cec5SDimitry Andric    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
37920b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
37930b57cec5SDimitry Andric>::type
37940b57cec5SDimitry Andricoperator*(const typename _Expr::value_type& __x, const _Expr& __y)
37950b57cec5SDimitry Andric{
37960b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
37970b57cec5SDimitry Andric    typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
37980b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(multiplies<value_type>(),
37990b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
38000b57cec5SDimitry Andric}
38010b57cec5SDimitry Andric
38020b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
38030b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38040b57cec5SDimitry Andrictypename enable_if
38050b57cec5SDimitry Andric<
38060b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
38070b57cec5SDimitry Andric    __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
38080b57cec5SDimitry Andric>::type
38090b57cec5SDimitry Andricoperator/(const _Expr1& __x, const _Expr2& __y)
38100b57cec5SDimitry Andric{
38110b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
38120b57cec5SDimitry Andric    typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
38130b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
38140b57cec5SDimitry Andric}
38150b57cec5SDimitry Andric
38160b57cec5SDimitry Andrictemplate<class _Expr>
38170b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38180b57cec5SDimitry Andrictypename enable_if
38190b57cec5SDimitry Andric<
38200b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
38210b57cec5SDimitry Andric    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
38220b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
38230b57cec5SDimitry Andric>::type
38240b57cec5SDimitry Andricoperator/(const _Expr& __x, const typename _Expr::value_type& __y)
38250b57cec5SDimitry Andric{
38260b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
38270b57cec5SDimitry Andric    typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
38280b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(divides<value_type>(),
38290b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
38300b57cec5SDimitry Andric}
38310b57cec5SDimitry Andric
38320b57cec5SDimitry Andrictemplate<class _Expr>
38330b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38340b57cec5SDimitry Andrictypename enable_if
38350b57cec5SDimitry Andric<
38360b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
38370b57cec5SDimitry Andric    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
38380b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
38390b57cec5SDimitry Andric>::type
38400b57cec5SDimitry Andricoperator/(const typename _Expr::value_type& __x, const _Expr& __y)
38410b57cec5SDimitry Andric{
38420b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
38430b57cec5SDimitry Andric    typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
38440b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(divides<value_type>(),
38450b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
38460b57cec5SDimitry Andric}
38470b57cec5SDimitry Andric
38480b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
38490b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38500b57cec5SDimitry Andrictypename enable_if
38510b57cec5SDimitry Andric<
38520b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
38530b57cec5SDimitry Andric    __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
38540b57cec5SDimitry Andric>::type
38550b57cec5SDimitry Andricoperator%(const _Expr1& __x, const _Expr2& __y)
38560b57cec5SDimitry Andric{
38570b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
38580b57cec5SDimitry Andric    typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
38590b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
38600b57cec5SDimitry Andric}
38610b57cec5SDimitry Andric
38620b57cec5SDimitry Andrictemplate<class _Expr>
38630b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38640b57cec5SDimitry Andrictypename enable_if
38650b57cec5SDimitry Andric<
38660b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
38670b57cec5SDimitry Andric    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
38680b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
38690b57cec5SDimitry Andric>::type
38700b57cec5SDimitry Andricoperator%(const _Expr& __x, const typename _Expr::value_type& __y)
38710b57cec5SDimitry Andric{
38720b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
38730b57cec5SDimitry Andric    typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
38740b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(modulus<value_type>(),
38750b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
38760b57cec5SDimitry Andric}
38770b57cec5SDimitry Andric
38780b57cec5SDimitry Andrictemplate<class _Expr>
38790b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38800b57cec5SDimitry Andrictypename enable_if
38810b57cec5SDimitry Andric<
38820b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
38830b57cec5SDimitry Andric    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
38840b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
38850b57cec5SDimitry Andric>::type
38860b57cec5SDimitry Andricoperator%(const typename _Expr::value_type& __x, const _Expr& __y)
38870b57cec5SDimitry Andric{
38880b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
38890b57cec5SDimitry Andric    typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
38900b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(modulus<value_type>(),
38910b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
38920b57cec5SDimitry Andric}
38930b57cec5SDimitry Andric
38940b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
38950b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
38960b57cec5SDimitry Andrictypename enable_if
38970b57cec5SDimitry Andric<
38980b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
38990b57cec5SDimitry Andric    __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
39000b57cec5SDimitry Andric>::type
39010b57cec5SDimitry Andricoperator+(const _Expr1& __x, const _Expr2& __y)
39020b57cec5SDimitry Andric{
39030b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
39040b57cec5SDimitry Andric    typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
39050b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
39060b57cec5SDimitry Andric}
39070b57cec5SDimitry Andric
39080b57cec5SDimitry Andrictemplate<class _Expr>
39090b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39100b57cec5SDimitry Andrictypename enable_if
39110b57cec5SDimitry Andric<
39120b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
39130b57cec5SDimitry Andric    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
39140b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
39150b57cec5SDimitry Andric>::type
39160b57cec5SDimitry Andricoperator+(const _Expr& __x, const typename _Expr::value_type& __y)
39170b57cec5SDimitry Andric{
39180b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
39190b57cec5SDimitry Andric    typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
39200b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(plus<value_type>(),
39210b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
39220b57cec5SDimitry Andric}
39230b57cec5SDimitry Andric
39240b57cec5SDimitry Andrictemplate<class _Expr>
39250b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39260b57cec5SDimitry Andrictypename enable_if
39270b57cec5SDimitry Andric<
39280b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
39290b57cec5SDimitry Andric    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
39300b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
39310b57cec5SDimitry Andric>::type
39320b57cec5SDimitry Andricoperator+(const typename _Expr::value_type& __x, const _Expr& __y)
39330b57cec5SDimitry Andric{
39340b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
39350b57cec5SDimitry Andric    typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
39360b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(plus<value_type>(),
39370b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
39380b57cec5SDimitry Andric}
39390b57cec5SDimitry Andric
39400b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
39410b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39420b57cec5SDimitry Andrictypename enable_if
39430b57cec5SDimitry Andric<
39440b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
39450b57cec5SDimitry Andric    __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
39460b57cec5SDimitry Andric>::type
39470b57cec5SDimitry Andricoperator-(const _Expr1& __x, const _Expr2& __y)
39480b57cec5SDimitry Andric{
39490b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
39500b57cec5SDimitry Andric    typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
39510b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
39520b57cec5SDimitry Andric}
39530b57cec5SDimitry Andric
39540b57cec5SDimitry Andrictemplate<class _Expr>
39550b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39560b57cec5SDimitry Andrictypename enable_if
39570b57cec5SDimitry Andric<
39580b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
39590b57cec5SDimitry Andric    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
39600b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
39610b57cec5SDimitry Andric>::type
39620b57cec5SDimitry Andricoperator-(const _Expr& __x, const typename _Expr::value_type& __y)
39630b57cec5SDimitry Andric{
39640b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
39650b57cec5SDimitry Andric    typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
39660b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(minus<value_type>(),
39670b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
39680b57cec5SDimitry Andric}
39690b57cec5SDimitry Andric
39700b57cec5SDimitry Andrictemplate<class _Expr>
39710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39720b57cec5SDimitry Andrictypename enable_if
39730b57cec5SDimitry Andric<
39740b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
39750b57cec5SDimitry Andric    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
39760b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
39770b57cec5SDimitry Andric>::type
39780b57cec5SDimitry Andricoperator-(const typename _Expr::value_type& __x, const _Expr& __y)
39790b57cec5SDimitry Andric{
39800b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
39810b57cec5SDimitry Andric    typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
39820b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(minus<value_type>(),
39830b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
39840b57cec5SDimitry Andric}
39850b57cec5SDimitry Andric
39860b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
39870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
39880b57cec5SDimitry Andrictypename enable_if
39890b57cec5SDimitry Andric<
39900b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
39910b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
39920b57cec5SDimitry Andric>::type
39930b57cec5SDimitry Andricoperator^(const _Expr1& __x, const _Expr2& __y)
39940b57cec5SDimitry Andric{
39950b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
39960b57cec5SDimitry Andric    typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
39970b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
39980b57cec5SDimitry Andric}
39990b57cec5SDimitry Andric
40000b57cec5SDimitry Andrictemplate<class _Expr>
40010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40020b57cec5SDimitry Andrictypename enable_if
40030b57cec5SDimitry Andric<
40040b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
40050b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
40060b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
40070b57cec5SDimitry Andric>::type
40080b57cec5SDimitry Andricoperator^(const _Expr& __x, const typename _Expr::value_type& __y)
40090b57cec5SDimitry Andric{
40100b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
40110b57cec5SDimitry Andric    typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
40120b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
40130b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
40140b57cec5SDimitry Andric}
40150b57cec5SDimitry Andric
40160b57cec5SDimitry Andrictemplate<class _Expr>
40170b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40180b57cec5SDimitry Andrictypename enable_if
40190b57cec5SDimitry Andric<
40200b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
40210b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
40220b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
40230b57cec5SDimitry Andric>::type
40240b57cec5SDimitry Andricoperator^(const typename _Expr::value_type& __x, const _Expr& __y)
40250b57cec5SDimitry Andric{
40260b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
40270b57cec5SDimitry Andric    typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
40280b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
40290b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
40300b57cec5SDimitry Andric}
40310b57cec5SDimitry Andric
40320b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
40330b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40340b57cec5SDimitry Andrictypename enable_if
40350b57cec5SDimitry Andric<
40360b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
40370b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
40380b57cec5SDimitry Andric>::type
40390b57cec5SDimitry Andricoperator&(const _Expr1& __x, const _Expr2& __y)
40400b57cec5SDimitry Andric{
40410b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
40420b57cec5SDimitry Andric    typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
40430b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
40440b57cec5SDimitry Andric}
40450b57cec5SDimitry Andric
40460b57cec5SDimitry Andrictemplate<class _Expr>
40470b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40480b57cec5SDimitry Andrictypename enable_if
40490b57cec5SDimitry Andric<
40500b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
40510b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
40520b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
40530b57cec5SDimitry Andric>::type
40540b57cec5SDimitry Andricoperator&(const _Expr& __x, const typename _Expr::value_type& __y)
40550b57cec5SDimitry Andric{
40560b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
40570b57cec5SDimitry Andric    typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
40580b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_and<value_type>(),
40590b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
40600b57cec5SDimitry Andric}
40610b57cec5SDimitry Andric
40620b57cec5SDimitry Andrictemplate<class _Expr>
40630b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40640b57cec5SDimitry Andrictypename enable_if
40650b57cec5SDimitry Andric<
40660b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
40670b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
40680b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
40690b57cec5SDimitry Andric>::type
40700b57cec5SDimitry Andricoperator&(const typename _Expr::value_type& __x, const _Expr& __y)
40710b57cec5SDimitry Andric{
40720b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
40730b57cec5SDimitry Andric    typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
40740b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_and<value_type>(),
40750b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
40760b57cec5SDimitry Andric}
40770b57cec5SDimitry Andric
40780b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
40790b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40800b57cec5SDimitry Andrictypename enable_if
40810b57cec5SDimitry Andric<
40820b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
40830b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
40840b57cec5SDimitry Andric>::type
40850b57cec5SDimitry Andricoperator|(const _Expr1& __x, const _Expr2& __y)
40860b57cec5SDimitry Andric{
40870b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
40880b57cec5SDimitry Andric    typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
40890b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
40900b57cec5SDimitry Andric}
40910b57cec5SDimitry Andric
40920b57cec5SDimitry Andrictemplate<class _Expr>
40930b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
40940b57cec5SDimitry Andrictypename enable_if
40950b57cec5SDimitry Andric<
40960b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
40970b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
40980b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
40990b57cec5SDimitry Andric>::type
41000b57cec5SDimitry Andricoperator|(const _Expr& __x, const typename _Expr::value_type& __y)
41010b57cec5SDimitry Andric{
41020b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
41030b57cec5SDimitry Andric    typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
41040b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_or<value_type>(),
41050b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
41060b57cec5SDimitry Andric}
41070b57cec5SDimitry Andric
41080b57cec5SDimitry Andrictemplate<class _Expr>
41090b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41100b57cec5SDimitry Andrictypename enable_if
41110b57cec5SDimitry Andric<
41120b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
41130b57cec5SDimitry Andric    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
41140b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
41150b57cec5SDimitry Andric>::type
41160b57cec5SDimitry Andricoperator|(const typename _Expr::value_type& __x, const _Expr& __y)
41170b57cec5SDimitry Andric{
41180b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
41190b57cec5SDimitry Andric    typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
41200b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(bit_or<value_type>(),
41210b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
41220b57cec5SDimitry Andric}
41230b57cec5SDimitry Andric
41240b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
41250b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41260b57cec5SDimitry Andrictypename enable_if
41270b57cec5SDimitry Andric<
41280b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
41290b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
41300b57cec5SDimitry Andric>::type
41310b57cec5SDimitry Andricoperator<<(const _Expr1& __x, const _Expr2& __y)
41320b57cec5SDimitry Andric{
41330b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
41340b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
41350b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
41360b57cec5SDimitry Andric}
41370b57cec5SDimitry Andric
41380b57cec5SDimitry Andrictemplate<class _Expr>
41390b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41400b57cec5SDimitry Andrictypename enable_if
41410b57cec5SDimitry Andric<
41420b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
41430b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
41440b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
41450b57cec5SDimitry Andric>::type
41460b57cec5SDimitry Andricoperator<<(const _Expr& __x, const typename _Expr::value_type& __y)
41470b57cec5SDimitry Andric{
41480b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
41490b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
41500b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
41510b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
41520b57cec5SDimitry Andric}
41530b57cec5SDimitry Andric
41540b57cec5SDimitry Andrictemplate<class _Expr>
41550b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41560b57cec5SDimitry Andrictypename enable_if
41570b57cec5SDimitry Andric<
41580b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
41590b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
41600b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
41610b57cec5SDimitry Andric>::type
41620b57cec5SDimitry Andricoperator<<(const typename _Expr::value_type& __x, const _Expr& __y)
41630b57cec5SDimitry Andric{
41640b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
41650b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
41660b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
41670b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
41680b57cec5SDimitry Andric}
41690b57cec5SDimitry Andric
41700b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
41710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41720b57cec5SDimitry Andrictypename enable_if
41730b57cec5SDimitry Andric<
41740b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
41750b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
41760b57cec5SDimitry Andric>::type
41770b57cec5SDimitry Andricoperator>>(const _Expr1& __x, const _Expr2& __y)
41780b57cec5SDimitry Andric{
41790b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
41800b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
41810b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
41820b57cec5SDimitry Andric}
41830b57cec5SDimitry Andric
41840b57cec5SDimitry Andrictemplate<class _Expr>
41850b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
41860b57cec5SDimitry Andrictypename enable_if
41870b57cec5SDimitry Andric<
41880b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
41890b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
41900b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
41910b57cec5SDimitry Andric>::type
41920b57cec5SDimitry Andricoperator>>(const _Expr& __x, const typename _Expr::value_type& __y)
41930b57cec5SDimitry Andric{
41940b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
41950b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
41960b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
41970b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
41980b57cec5SDimitry Andric}
41990b57cec5SDimitry Andric
42000b57cec5SDimitry Andrictemplate<class _Expr>
42010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42020b57cec5SDimitry Andrictypename enable_if
42030b57cec5SDimitry Andric<
42040b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
42050b57cec5SDimitry Andric    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
42060b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
42070b57cec5SDimitry Andric>::type
42080b57cec5SDimitry Andricoperator>>(const typename _Expr::value_type& __x, const _Expr& __y)
42090b57cec5SDimitry Andric{
42100b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
42110b57cec5SDimitry Andric    typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
42120b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
42130b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
42140b57cec5SDimitry Andric}
42150b57cec5SDimitry Andric
42160b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
42170b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42180b57cec5SDimitry Andrictypename enable_if
42190b57cec5SDimitry Andric<
42200b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
42210b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
42220b57cec5SDimitry Andric>::type
42230b57cec5SDimitry Andricoperator&&(const _Expr1& __x, const _Expr2& __y)
42240b57cec5SDimitry Andric{
42250b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
42260b57cec5SDimitry Andric    typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
42270b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
42280b57cec5SDimitry Andric}
42290b57cec5SDimitry Andric
42300b57cec5SDimitry Andrictemplate<class _Expr>
42310b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42320b57cec5SDimitry Andrictypename enable_if
42330b57cec5SDimitry Andric<
42340b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
42350b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
42360b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
42370b57cec5SDimitry Andric>::type
42380b57cec5SDimitry Andricoperator&&(const _Expr& __x, const typename _Expr::value_type& __y)
42390b57cec5SDimitry Andric{
42400b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
42410b57cec5SDimitry Andric    typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
42420b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_and<value_type>(),
42430b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
42440b57cec5SDimitry Andric}
42450b57cec5SDimitry Andric
42460b57cec5SDimitry Andrictemplate<class _Expr>
42470b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42480b57cec5SDimitry Andrictypename enable_if
42490b57cec5SDimitry Andric<
42500b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
42510b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
42520b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
42530b57cec5SDimitry Andric>::type
42540b57cec5SDimitry Andricoperator&&(const typename _Expr::value_type& __x, const _Expr& __y)
42550b57cec5SDimitry Andric{
42560b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
42570b57cec5SDimitry Andric    typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
42580b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_and<value_type>(),
42590b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
42600b57cec5SDimitry Andric}
42610b57cec5SDimitry Andric
42620b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
42630b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42640b57cec5SDimitry Andrictypename enable_if
42650b57cec5SDimitry Andric<
42660b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
42670b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
42680b57cec5SDimitry Andric>::type
42690b57cec5SDimitry Andricoperator||(const _Expr1& __x, const _Expr2& __y)
42700b57cec5SDimitry Andric{
42710b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
42720b57cec5SDimitry Andric    typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
42730b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
42740b57cec5SDimitry Andric}
42750b57cec5SDimitry Andric
42760b57cec5SDimitry Andrictemplate<class _Expr>
42770b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42780b57cec5SDimitry Andrictypename enable_if
42790b57cec5SDimitry Andric<
42800b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
42810b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
42820b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
42830b57cec5SDimitry Andric>::type
42840b57cec5SDimitry Andricoperator||(const _Expr& __x, const typename _Expr::value_type& __y)
42850b57cec5SDimitry Andric{
42860b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
42870b57cec5SDimitry Andric    typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
42880b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_or<value_type>(),
42890b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
42900b57cec5SDimitry Andric}
42910b57cec5SDimitry Andric
42920b57cec5SDimitry Andrictemplate<class _Expr>
42930b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
42940b57cec5SDimitry Andrictypename enable_if
42950b57cec5SDimitry Andric<
42960b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
42970b57cec5SDimitry Andric    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
42980b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
42990b57cec5SDimitry Andric>::type
43000b57cec5SDimitry Andricoperator||(const typename _Expr::value_type& __x, const _Expr& __y)
43010b57cec5SDimitry Andric{
43020b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
43030b57cec5SDimitry Andric    typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
43040b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(logical_or<value_type>(),
43050b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
43060b57cec5SDimitry Andric}
43070b57cec5SDimitry Andric
43080b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
43090b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43100b57cec5SDimitry Andrictypename enable_if
43110b57cec5SDimitry Andric<
43120b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
43130b57cec5SDimitry Andric    __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
43140b57cec5SDimitry Andric>::type
43150b57cec5SDimitry Andricoperator==(const _Expr1& __x, const _Expr2& __y)
43160b57cec5SDimitry Andric{
43170b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
43180b57cec5SDimitry Andric    typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
43190b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
43200b57cec5SDimitry Andric}
43210b57cec5SDimitry Andric
43220b57cec5SDimitry Andrictemplate<class _Expr>
43230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43240b57cec5SDimitry Andrictypename enable_if
43250b57cec5SDimitry Andric<
43260b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
43270b57cec5SDimitry Andric    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
43280b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
43290b57cec5SDimitry Andric>::type
43300b57cec5SDimitry Andricoperator==(const _Expr& __x, const typename _Expr::value_type& __y)
43310b57cec5SDimitry Andric{
43320b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
43330b57cec5SDimitry Andric    typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
43340b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(equal_to<value_type>(),
43350b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
43360b57cec5SDimitry Andric}
43370b57cec5SDimitry Andric
43380b57cec5SDimitry Andrictemplate<class _Expr>
43390b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43400b57cec5SDimitry Andrictypename enable_if
43410b57cec5SDimitry Andric<
43420b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
43430b57cec5SDimitry Andric    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
43440b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
43450b57cec5SDimitry Andric>::type
43460b57cec5SDimitry Andricoperator==(const typename _Expr::value_type& __x, const _Expr& __y)
43470b57cec5SDimitry Andric{
43480b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
43490b57cec5SDimitry Andric    typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
43500b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(equal_to<value_type>(),
43510b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
43520b57cec5SDimitry Andric}
43530b57cec5SDimitry Andric
43540b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
43550b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43560b57cec5SDimitry Andrictypename enable_if
43570b57cec5SDimitry Andric<
43580b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
43590b57cec5SDimitry Andric    __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
43600b57cec5SDimitry Andric>::type
43610b57cec5SDimitry Andricoperator!=(const _Expr1& __x, const _Expr2& __y)
43620b57cec5SDimitry Andric{
43630b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
43640b57cec5SDimitry Andric    typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
43650b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
43660b57cec5SDimitry Andric}
43670b57cec5SDimitry Andric
43680b57cec5SDimitry Andrictemplate<class _Expr>
43690b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43700b57cec5SDimitry Andrictypename enable_if
43710b57cec5SDimitry Andric<
43720b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
43730b57cec5SDimitry Andric    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
43740b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
43750b57cec5SDimitry Andric>::type
43760b57cec5SDimitry Andricoperator!=(const _Expr& __x, const typename _Expr::value_type& __y)
43770b57cec5SDimitry Andric{
43780b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
43790b57cec5SDimitry Andric    typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
43800b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
43810b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
43820b57cec5SDimitry Andric}
43830b57cec5SDimitry Andric
43840b57cec5SDimitry Andrictemplate<class _Expr>
43850b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
43860b57cec5SDimitry Andrictypename enable_if
43870b57cec5SDimitry Andric<
43880b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
43890b57cec5SDimitry Andric    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
43900b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
43910b57cec5SDimitry Andric>::type
43920b57cec5SDimitry Andricoperator!=(const typename _Expr::value_type& __x, const _Expr& __y)
43930b57cec5SDimitry Andric{
43940b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
43950b57cec5SDimitry Andric    typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
43960b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
43970b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
43980b57cec5SDimitry Andric}
43990b57cec5SDimitry Andric
44000b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
44010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44020b57cec5SDimitry Andrictypename enable_if
44030b57cec5SDimitry Andric<
44040b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
44050b57cec5SDimitry Andric    __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
44060b57cec5SDimitry Andric>::type
44070b57cec5SDimitry Andricoperator<(const _Expr1& __x, const _Expr2& __y)
44080b57cec5SDimitry Andric{
44090b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
44100b57cec5SDimitry Andric    typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
44110b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
44120b57cec5SDimitry Andric}
44130b57cec5SDimitry Andric
44140b57cec5SDimitry Andrictemplate<class _Expr>
44150b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44160b57cec5SDimitry Andrictypename enable_if
44170b57cec5SDimitry Andric<
44180b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
44190b57cec5SDimitry Andric    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
44200b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
44210b57cec5SDimitry Andric>::type
44220b57cec5SDimitry Andricoperator<(const _Expr& __x, const typename _Expr::value_type& __y)
44230b57cec5SDimitry Andric{
44240b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
44250b57cec5SDimitry Andric    typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
44260b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less<value_type>(),
44270b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
44280b57cec5SDimitry Andric}
44290b57cec5SDimitry Andric
44300b57cec5SDimitry Andrictemplate<class _Expr>
44310b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44320b57cec5SDimitry Andrictypename enable_if
44330b57cec5SDimitry Andric<
44340b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
44350b57cec5SDimitry Andric    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
44360b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
44370b57cec5SDimitry Andric>::type
44380b57cec5SDimitry Andricoperator<(const typename _Expr::value_type& __x, const _Expr& __y)
44390b57cec5SDimitry Andric{
44400b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
44410b57cec5SDimitry Andric    typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
44420b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less<value_type>(),
44430b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
44440b57cec5SDimitry Andric}
44450b57cec5SDimitry Andric
44460b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
44470b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44480b57cec5SDimitry Andrictypename enable_if
44490b57cec5SDimitry Andric<
44500b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
44510b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
44520b57cec5SDimitry Andric>::type
44530b57cec5SDimitry Andricoperator>(const _Expr1& __x, const _Expr2& __y)
44540b57cec5SDimitry Andric{
44550b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
44560b57cec5SDimitry Andric    typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
44570b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
44580b57cec5SDimitry Andric}
44590b57cec5SDimitry Andric
44600b57cec5SDimitry Andrictemplate<class _Expr>
44610b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44620b57cec5SDimitry Andrictypename enable_if
44630b57cec5SDimitry Andric<
44640b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
44650b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
44660b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
44670b57cec5SDimitry Andric>::type
44680b57cec5SDimitry Andricoperator>(const _Expr& __x, const typename _Expr::value_type& __y)
44690b57cec5SDimitry Andric{
44700b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
44710b57cec5SDimitry Andric    typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
44720b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater<value_type>(),
44730b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
44740b57cec5SDimitry Andric}
44750b57cec5SDimitry Andric
44760b57cec5SDimitry Andrictemplate<class _Expr>
44770b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44780b57cec5SDimitry Andrictypename enable_if
44790b57cec5SDimitry Andric<
44800b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
44810b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
44820b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
44830b57cec5SDimitry Andric>::type
44840b57cec5SDimitry Andricoperator>(const typename _Expr::value_type& __x, const _Expr& __y)
44850b57cec5SDimitry Andric{
44860b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
44870b57cec5SDimitry Andric    typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
44880b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater<value_type>(),
44890b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
44900b57cec5SDimitry Andric}
44910b57cec5SDimitry Andric
44920b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
44930b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
44940b57cec5SDimitry Andrictypename enable_if
44950b57cec5SDimitry Andric<
44960b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
44970b57cec5SDimitry Andric    __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
44980b57cec5SDimitry Andric>::type
44990b57cec5SDimitry Andricoperator<=(const _Expr1& __x, const _Expr2& __y)
45000b57cec5SDimitry Andric{
45010b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
45020b57cec5SDimitry Andric    typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
45030b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
45040b57cec5SDimitry Andric}
45050b57cec5SDimitry Andric
45060b57cec5SDimitry Andrictemplate<class _Expr>
45070b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45080b57cec5SDimitry Andrictypename enable_if
45090b57cec5SDimitry Andric<
45100b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
45110b57cec5SDimitry Andric    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
45120b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
45130b57cec5SDimitry Andric>::type
45140b57cec5SDimitry Andricoperator<=(const _Expr& __x, const typename _Expr::value_type& __y)
45150b57cec5SDimitry Andric{
45160b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
45170b57cec5SDimitry Andric    typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
45180b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less_equal<value_type>(),
45190b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
45200b57cec5SDimitry Andric}
45210b57cec5SDimitry Andric
45220b57cec5SDimitry Andrictemplate<class _Expr>
45230b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45240b57cec5SDimitry Andrictypename enable_if
45250b57cec5SDimitry Andric<
45260b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
45270b57cec5SDimitry Andric    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
45280b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
45290b57cec5SDimitry Andric>::type
45300b57cec5SDimitry Andricoperator<=(const typename _Expr::value_type& __x, const _Expr& __y)
45310b57cec5SDimitry Andric{
45320b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
45330b57cec5SDimitry Andric    typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
45340b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(less_equal<value_type>(),
45350b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
45360b57cec5SDimitry Andric}
45370b57cec5SDimitry Andric
45380b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
45390b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45400b57cec5SDimitry Andrictypename enable_if
45410b57cec5SDimitry Andric<
45420b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
45430b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
45440b57cec5SDimitry Andric>::type
45450b57cec5SDimitry Andricoperator>=(const _Expr1& __x, const _Expr2& __y)
45460b57cec5SDimitry Andric{
45470b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
45480b57cec5SDimitry Andric    typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
45490b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
45500b57cec5SDimitry Andric}
45510b57cec5SDimitry Andric
45520b57cec5SDimitry Andrictemplate<class _Expr>
45530b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45540b57cec5SDimitry Andrictypename enable_if
45550b57cec5SDimitry Andric<
45560b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
45570b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
45580b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
45590b57cec5SDimitry Andric>::type
45600b57cec5SDimitry Andricoperator>=(const _Expr& __x, const typename _Expr::value_type& __y)
45610b57cec5SDimitry Andric{
45620b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
45630b57cec5SDimitry Andric    typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
45640b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
45650b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
45660b57cec5SDimitry Andric}
45670b57cec5SDimitry Andric
45680b57cec5SDimitry Andrictemplate<class _Expr>
45690b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45700b57cec5SDimitry Andrictypename enable_if
45710b57cec5SDimitry Andric<
45720b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
45730b57cec5SDimitry Andric    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
45740b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
45750b57cec5SDimitry Andric>::type
45760b57cec5SDimitry Andricoperator>=(const typename _Expr::value_type& __x, const _Expr& __y)
45770b57cec5SDimitry Andric{
45780b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
45790b57cec5SDimitry Andric    typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
45800b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
45810b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
45820b57cec5SDimitry Andric}
45830b57cec5SDimitry Andric
45840b57cec5SDimitry Andrictemplate<class _Expr>
45850b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
45860b57cec5SDimitry Andrictypename enable_if
45870b57cec5SDimitry Andric<
45880b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
45890b57cec5SDimitry Andric    __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
45900b57cec5SDimitry Andric>::type
45910b57cec5SDimitry Andricabs(const _Expr& __x)
45920b57cec5SDimitry Andric{
45930b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
45940b57cec5SDimitry Andric    typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
45950b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
45960b57cec5SDimitry Andric}
45970b57cec5SDimitry Andric
45980b57cec5SDimitry Andrictemplate<class _Expr>
45990b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46000b57cec5SDimitry Andrictypename enable_if
46010b57cec5SDimitry Andric<
46020b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46030b57cec5SDimitry Andric    __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
46040b57cec5SDimitry Andric>::type
46050b57cec5SDimitry Andricacos(const _Expr& __x)
46060b57cec5SDimitry Andric{
46070b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46080b57cec5SDimitry Andric    typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
46090b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
46100b57cec5SDimitry Andric}
46110b57cec5SDimitry Andric
46120b57cec5SDimitry Andrictemplate<class _Expr>
46130b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46140b57cec5SDimitry Andrictypename enable_if
46150b57cec5SDimitry Andric<
46160b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46170b57cec5SDimitry Andric    __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
46180b57cec5SDimitry Andric>::type
46190b57cec5SDimitry Andricasin(const _Expr& __x)
46200b57cec5SDimitry Andric{
46210b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46220b57cec5SDimitry Andric    typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
46230b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
46240b57cec5SDimitry Andric}
46250b57cec5SDimitry Andric
46260b57cec5SDimitry Andrictemplate<class _Expr>
46270b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46280b57cec5SDimitry Andrictypename enable_if
46290b57cec5SDimitry Andric<
46300b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46310b57cec5SDimitry Andric    __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
46320b57cec5SDimitry Andric>::type
46330b57cec5SDimitry Andricatan(const _Expr& __x)
46340b57cec5SDimitry Andric{
46350b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46360b57cec5SDimitry Andric    typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
46370b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
46380b57cec5SDimitry Andric}
46390b57cec5SDimitry Andric
46400b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
46410b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46420b57cec5SDimitry Andrictypename enable_if
46430b57cec5SDimitry Andric<
46440b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
46450b57cec5SDimitry Andric    __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
46460b57cec5SDimitry Andric>::type
46470b57cec5SDimitry Andricatan2(const _Expr1& __x, const _Expr2& __y)
46480b57cec5SDimitry Andric{
46490b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
46500b57cec5SDimitry Andric    typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
46510b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
46520b57cec5SDimitry Andric}
46530b57cec5SDimitry Andric
46540b57cec5SDimitry Andrictemplate<class _Expr>
46550b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46560b57cec5SDimitry Andrictypename enable_if
46570b57cec5SDimitry Andric<
46580b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46590b57cec5SDimitry Andric    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
46600b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
46610b57cec5SDimitry Andric>::type
46620b57cec5SDimitry Andricatan2(const _Expr& __x, const typename _Expr::value_type& __y)
46630b57cec5SDimitry Andric{
46640b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46650b57cec5SDimitry Andric    typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
46660b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
46670b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
46680b57cec5SDimitry Andric}
46690b57cec5SDimitry Andric
46700b57cec5SDimitry Andrictemplate<class _Expr>
46710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46720b57cec5SDimitry Andrictypename enable_if
46730b57cec5SDimitry Andric<
46740b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46750b57cec5SDimitry Andric    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
46760b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
46770b57cec5SDimitry Andric>::type
46780b57cec5SDimitry Andricatan2(const typename _Expr::value_type& __x, const _Expr& __y)
46790b57cec5SDimitry Andric{
46800b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46810b57cec5SDimitry Andric    typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
46820b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
46830b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
46840b57cec5SDimitry Andric}
46850b57cec5SDimitry Andric
46860b57cec5SDimitry Andrictemplate<class _Expr>
46870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
46880b57cec5SDimitry Andrictypename enable_if
46890b57cec5SDimitry Andric<
46900b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
46910b57cec5SDimitry Andric    __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
46920b57cec5SDimitry Andric>::type
46930b57cec5SDimitry Andriccos(const _Expr& __x)
46940b57cec5SDimitry Andric{
46950b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
46960b57cec5SDimitry Andric    typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
46970b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
46980b57cec5SDimitry Andric}
46990b57cec5SDimitry Andric
47000b57cec5SDimitry Andrictemplate<class _Expr>
47010b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47020b57cec5SDimitry Andrictypename enable_if
47030b57cec5SDimitry Andric<
47040b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47050b57cec5SDimitry Andric    __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
47060b57cec5SDimitry Andric>::type
47070b57cec5SDimitry Andriccosh(const _Expr& __x)
47080b57cec5SDimitry Andric{
47090b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47100b57cec5SDimitry Andric    typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
47110b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
47120b57cec5SDimitry Andric}
47130b57cec5SDimitry Andric
47140b57cec5SDimitry Andrictemplate<class _Expr>
47150b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47160b57cec5SDimitry Andrictypename enable_if
47170b57cec5SDimitry Andric<
47180b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47190b57cec5SDimitry Andric    __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
47200b57cec5SDimitry Andric>::type
47210b57cec5SDimitry Andricexp(const _Expr& __x)
47220b57cec5SDimitry Andric{
47230b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47240b57cec5SDimitry Andric    typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
47250b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
47260b57cec5SDimitry Andric}
47270b57cec5SDimitry Andric
47280b57cec5SDimitry Andrictemplate<class _Expr>
47290b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47300b57cec5SDimitry Andrictypename enable_if
47310b57cec5SDimitry Andric<
47320b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47330b57cec5SDimitry Andric    __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
47340b57cec5SDimitry Andric>::type
47350b57cec5SDimitry Andriclog(const _Expr& __x)
47360b57cec5SDimitry Andric{
47370b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47380b57cec5SDimitry Andric    typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
47390b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
47400b57cec5SDimitry Andric}
47410b57cec5SDimitry Andric
47420b57cec5SDimitry Andrictemplate<class _Expr>
47430b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47440b57cec5SDimitry Andrictypename enable_if
47450b57cec5SDimitry Andric<
47460b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47470b57cec5SDimitry Andric    __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
47480b57cec5SDimitry Andric>::type
47490b57cec5SDimitry Andriclog10(const _Expr& __x)
47500b57cec5SDimitry Andric{
47510b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47520b57cec5SDimitry Andric    typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
47530b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
47540b57cec5SDimitry Andric}
47550b57cec5SDimitry Andric
47560b57cec5SDimitry Andrictemplate<class _Expr1, class _Expr2>
47570b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47580b57cec5SDimitry Andrictypename enable_if
47590b57cec5SDimitry Andric<
47600b57cec5SDimitry Andric    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
47610b57cec5SDimitry Andric    __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
47620b57cec5SDimitry Andric>::type
47630b57cec5SDimitry Andricpow(const _Expr1& __x, const _Expr2& __y)
47640b57cec5SDimitry Andric{
47650b57cec5SDimitry Andric    typedef typename _Expr1::value_type value_type;
47660b57cec5SDimitry Andric    typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
47670b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
47680b57cec5SDimitry Andric}
47690b57cec5SDimitry Andric
47700b57cec5SDimitry Andrictemplate<class _Expr>
47710b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47720b57cec5SDimitry Andrictypename enable_if
47730b57cec5SDimitry Andric<
47740b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47750b57cec5SDimitry Andric    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
47760b57cec5SDimitry Andric               _Expr, __scalar_expr<typename _Expr::value_type> > >
47770b57cec5SDimitry Andric>::type
47780b57cec5SDimitry Andricpow(const _Expr& __x, const typename _Expr::value_type& __y)
47790b57cec5SDimitry Andric{
47800b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47810b57cec5SDimitry Andric    typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
47820b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
47830b57cec5SDimitry Andric                           __x, __scalar_expr<value_type>(__y, __x.size())));
47840b57cec5SDimitry Andric}
47850b57cec5SDimitry Andric
47860b57cec5SDimitry Andrictemplate<class _Expr>
47870b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
47880b57cec5SDimitry Andrictypename enable_if
47890b57cec5SDimitry Andric<
47900b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
47910b57cec5SDimitry Andric    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
47920b57cec5SDimitry Andric               __scalar_expr<typename _Expr::value_type>, _Expr> >
47930b57cec5SDimitry Andric>::type
47940b57cec5SDimitry Andricpow(const typename _Expr::value_type& __x, const _Expr& __y)
47950b57cec5SDimitry Andric{
47960b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
47970b57cec5SDimitry Andric    typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
47980b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
47990b57cec5SDimitry Andric                           __scalar_expr<value_type>(__x, __y.size()), __y));
48000b57cec5SDimitry Andric}
48010b57cec5SDimitry Andric
48020b57cec5SDimitry Andrictemplate<class _Expr>
48030b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48040b57cec5SDimitry Andrictypename enable_if
48050b57cec5SDimitry Andric<
48060b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
48070b57cec5SDimitry Andric    __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
48080b57cec5SDimitry Andric>::type
48090b57cec5SDimitry Andricsin(const _Expr& __x)
48100b57cec5SDimitry Andric{
48110b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
48120b57cec5SDimitry Andric    typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
48130b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
48140b57cec5SDimitry Andric}
48150b57cec5SDimitry Andric
48160b57cec5SDimitry Andrictemplate<class _Expr>
48170b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48180b57cec5SDimitry Andrictypename enable_if
48190b57cec5SDimitry Andric<
48200b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
48210b57cec5SDimitry Andric    __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
48220b57cec5SDimitry Andric>::type
48230b57cec5SDimitry Andricsinh(const _Expr& __x)
48240b57cec5SDimitry Andric{
48250b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
48260b57cec5SDimitry Andric    typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
48270b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
48280b57cec5SDimitry Andric}
48290b57cec5SDimitry Andric
48300b57cec5SDimitry Andrictemplate<class _Expr>
48310b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48320b57cec5SDimitry Andrictypename enable_if
48330b57cec5SDimitry Andric<
48340b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
48350b57cec5SDimitry Andric    __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
48360b57cec5SDimitry Andric>::type
48370b57cec5SDimitry Andricsqrt(const _Expr& __x)
48380b57cec5SDimitry Andric{
48390b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
48400b57cec5SDimitry Andric    typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
48410b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
48420b57cec5SDimitry Andric}
48430b57cec5SDimitry Andric
48440b57cec5SDimitry Andrictemplate<class _Expr>
48450b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48460b57cec5SDimitry Andrictypename enable_if
48470b57cec5SDimitry Andric<
48480b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
48490b57cec5SDimitry Andric    __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
48500b57cec5SDimitry Andric>::type
48510b57cec5SDimitry Andrictan(const _Expr& __x)
48520b57cec5SDimitry Andric{
48530b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
48540b57cec5SDimitry Andric    typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
48550b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
48560b57cec5SDimitry Andric}
48570b57cec5SDimitry Andric
48580b57cec5SDimitry Andrictemplate<class _Expr>
48590b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48600b57cec5SDimitry Andrictypename enable_if
48610b57cec5SDimitry Andric<
48620b57cec5SDimitry Andric    __is_val_expr<_Expr>::value,
48630b57cec5SDimitry Andric    __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
48640b57cec5SDimitry Andric>::type
48650b57cec5SDimitry Andrictanh(const _Expr& __x)
48660b57cec5SDimitry Andric{
48670b57cec5SDimitry Andric    typedef typename _Expr::value_type value_type;
48680b57cec5SDimitry Andric    typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
48690b57cec5SDimitry Andric    return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
48700b57cec5SDimitry Andric}
48710b57cec5SDimitry Andric
48720b57cec5SDimitry Andrictemplate <class _Tp>
48730b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48740b57cec5SDimitry Andric_Tp*
48750b57cec5SDimitry Andricbegin(valarray<_Tp>& __v)
48760b57cec5SDimitry Andric{
48770b57cec5SDimitry Andric    return __v.__begin_;
48780b57cec5SDimitry Andric}
48790b57cec5SDimitry Andric
48800b57cec5SDimitry Andrictemplate <class _Tp>
48810b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48820b57cec5SDimitry Andricconst _Tp*
48830b57cec5SDimitry Andricbegin(const valarray<_Tp>& __v)
48840b57cec5SDimitry Andric{
48850b57cec5SDimitry Andric    return __v.__begin_;
48860b57cec5SDimitry Andric}
48870b57cec5SDimitry Andric
48880b57cec5SDimitry Andrictemplate <class _Tp>
48890b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48900b57cec5SDimitry Andric_Tp*
48910b57cec5SDimitry Andricend(valarray<_Tp>& __v)
48920b57cec5SDimitry Andric{
48930b57cec5SDimitry Andric    return __v.__end_;
48940b57cec5SDimitry Andric}
48950b57cec5SDimitry Andric
48960b57cec5SDimitry Andrictemplate <class _Tp>
48970b57cec5SDimitry Andricinline _LIBCPP_INLINE_VISIBILITY
48980b57cec5SDimitry Andricconst _Tp*
48990b57cec5SDimitry Andricend(const valarray<_Tp>& __v)
49000b57cec5SDimitry Andric{
49010b57cec5SDimitry Andric    return __v.__end_;
49020b57cec5SDimitry Andric}
49030b57cec5SDimitry Andric
49040b57cec5SDimitry Andric_LIBCPP_END_NAMESPACE_STD
49050b57cec5SDimitry Andric
49060b57cec5SDimitry Andric_LIBCPP_POP_MACROS
49070b57cec5SDimitry Andric
49080b57cec5SDimitry Andric#endif  // _LIBCPP_VALARRAY
4909