17a984708SDavid Chisnall// -*- C++ -*-
27a984708SDavid Chisnall//===-------------------------- valarray ----------------------------------===//
37a984708SDavid Chisnall//
47a984708SDavid Chisnall//                     The LLVM Compiler Infrastructure
57a984708SDavid Chisnall//
67a984708SDavid Chisnall// This file is dual licensed under the MIT and the University of Illinois Open
77a984708SDavid Chisnall// Source Licenses. See LICENSE.TXT for details.
87a984708SDavid Chisnall//
97a984708SDavid Chisnall//===----------------------------------------------------------------------===//
107a984708SDavid Chisnall
117a984708SDavid Chisnall#ifndef _LIBCPP_VALARRAY
127a984708SDavid Chisnall#define _LIBCPP_VALARRAY
137a984708SDavid Chisnall
147a984708SDavid Chisnall/*
157a984708SDavid Chisnall    valarray synopsis
167a984708SDavid Chisnall
177a984708SDavid Chisnallnamespace std
187a984708SDavid Chisnall{
197a984708SDavid Chisnall
207a984708SDavid Chisnalltemplate<class T>
217a984708SDavid Chisnallclass valarray
227a984708SDavid Chisnall{
237a984708SDavid Chisnallpublic:
247a984708SDavid Chisnall    typedef T value_type;
257a984708SDavid Chisnall
267a984708SDavid Chisnall    // construct/destroy:
277a984708SDavid Chisnall    valarray();
287a984708SDavid Chisnall    explicit valarray(size_t n);
297a984708SDavid Chisnall    valarray(const value_type& x, size_t n);
307a984708SDavid Chisnall    valarray(const value_type* px, size_t n);
317a984708SDavid Chisnall    valarray(const valarray& v);
32936e9439SDimitry Andric    valarray(valarray&& v) noexcept;
337a984708SDavid Chisnall    valarray(const slice_array<value_type>& sa);
347a984708SDavid Chisnall    valarray(const gslice_array<value_type>& ga);
357a984708SDavid Chisnall    valarray(const mask_array<value_type>& ma);
367a984708SDavid Chisnall    valarray(const indirect_array<value_type>& ia);
377a984708SDavid Chisnall    valarray(initializer_list<value_type> il);
387a984708SDavid Chisnall    ~valarray();
397a984708SDavid Chisnall
407a984708SDavid Chisnall    // assignment:
417a984708SDavid Chisnall    valarray& operator=(const valarray& v);
42936e9439SDimitry Andric    valarray& operator=(valarray&& v) noexcept;
437a984708SDavid Chisnall    valarray& operator=(initializer_list<value_type> il);
447a984708SDavid Chisnall    valarray& operator=(const value_type& x);
457a984708SDavid Chisnall    valarray& operator=(const slice_array<value_type>& sa);
467a984708SDavid Chisnall    valarray& operator=(const gslice_array<value_type>& ga);
477a984708SDavid Chisnall    valarray& operator=(const mask_array<value_type>& ma);
487a984708SDavid Chisnall    valarray& operator=(const indirect_array<value_type>& ia);
497a984708SDavid Chisnall
507a984708SDavid Chisnall    // element access:
517a984708SDavid Chisnall    const value_type& operator[](size_t i) const;
527a984708SDavid Chisnall    value_type&       operator[](size_t i);
537a984708SDavid Chisnall
547a984708SDavid Chisnall    // subset operations:
557a984708SDavid Chisnall    valarray                   operator[](slice s) const;
567a984708SDavid Chisnall    slice_array<value_type>    operator[](slice s);
577a984708SDavid Chisnall    valarray                   operator[](const gslice& gs) const;
587a984708SDavid Chisnall    gslice_array<value_type>   operator[](const gslice& gs);
597a984708SDavid Chisnall    valarray                   operator[](const valarray<bool>& vb) const;
607a984708SDavid Chisnall    mask_array<value_type>     operator[](const valarray<bool>& vb);
617a984708SDavid Chisnall    valarray                   operator[](const valarray<size_t>& vs) const;
627a984708SDavid Chisnall    indirect_array<value_type> operator[](const valarray<size_t>& vs);
637a984708SDavid Chisnall
647a984708SDavid Chisnall    // unary operators:
657a984708SDavid Chisnall    valarray       operator+() const;
667a984708SDavid Chisnall    valarray       operator-() const;
677a984708SDavid Chisnall    valarray       operator~() const;
687a984708SDavid Chisnall    valarray<bool> operator!() const;
697a984708SDavid Chisnall
707a984708SDavid Chisnall    // computed assignment:
717a984708SDavid Chisnall    valarray& operator*= (const value_type& x);
727a984708SDavid Chisnall    valarray& operator/= (const value_type& x);
737a984708SDavid Chisnall    valarray& operator%= (const value_type& x);
747a984708SDavid Chisnall    valarray& operator+= (const value_type& x);
757a984708SDavid Chisnall    valarray& operator-= (const value_type& x);
767a984708SDavid Chisnall    valarray& operator^= (const value_type& x);
777a984708SDavid Chisnall    valarray& operator&= (const value_type& x);
787a984708SDavid Chisnall    valarray& operator|= (const value_type& x);
797a984708SDavid Chisnall    valarray& operator<<=(const value_type& x);
807a984708SDavid Chisnall    valarray& operator>>=(const value_type& x);
817a984708SDavid Chisnall
827a984708SDavid Chisnall    valarray& operator*= (const valarray& v);
837a984708SDavid Chisnall    valarray& operator/= (const valarray& v);
847a984708SDavid Chisnall    valarray& operator%= (const valarray& v);
857a984708SDavid Chisnall    valarray& operator+= (const valarray& v);
867a984708SDavid Chisnall    valarray& operator-= (const valarray& v);
877a984708SDavid Chisnall    valarray& operator^= (const valarray& v);
887a984708SDavid Chisnall    valarray& operator|= (const valarray& v);
897a984708SDavid Chisnall    valarray& operator&= (const valarray& v);
907a984708SDavid Chisnall    valarray& operator<<=(const valarray& v);
917a984708SDavid Chisnall    valarray& operator>>=(const valarray& v);
927a984708SDavid Chisnall
937a984708SDavid Chisnall    // member functions:
94936e9439SDimitry Andric    void swap(valarray& v) noexcept;
957a984708SDavid Chisnall
967a984708SDavid Chisnall    size_t size() const;
977a984708SDavid Chisnall
987a984708SDavid Chisnall    value_type sum() const;
997a984708SDavid Chisnall    value_type min() const;
1007a984708SDavid Chisnall    value_type max() const;
1017a984708SDavid Chisnall
1027a984708SDavid Chisnall    valarray shift (int i) const;
1037a984708SDavid Chisnall    valarray cshift(int i) const;
1047a984708SDavid Chisnall    valarray apply(value_type f(value_type)) const;
1057a984708SDavid Chisnall    valarray apply(value_type f(const value_type&)) const;
1067a984708SDavid Chisnall    void resize(size_t n, value_type x = value_type());
1077a984708SDavid Chisnall};
1087a984708SDavid Chisnall
1097a984708SDavid Chisnallclass slice
1107a984708SDavid Chisnall{
1117a984708SDavid Chisnallpublic:
1127a984708SDavid Chisnall    slice();
1137a984708SDavid Chisnall    slice(size_t start, size_t size, size_t stride);
1147a984708SDavid Chisnall
1157a984708SDavid Chisnall    size_t start()  const;
1167a984708SDavid Chisnall    size_t size()   const;
1177a984708SDavid Chisnall    size_t stride() const;
1187a984708SDavid Chisnall};
1197a984708SDavid Chisnall
1207a984708SDavid Chisnalltemplate <class T>
1217a984708SDavid Chisnallclass slice_array
1227a984708SDavid Chisnall{
1237a984708SDavid Chisnallpublic:
1247a984708SDavid Chisnall    typedef T value_type;
1257a984708SDavid Chisnall
1267a984708SDavid Chisnall    const slice_array& operator=(const slice_array& sa) const;
1277a984708SDavid Chisnall    void operator=  (const valarray<value_type>& v) const;
1287a984708SDavid Chisnall    void operator*= (const valarray<value_type>& v) const;
1297a984708SDavid Chisnall    void operator/= (const valarray<value_type>& v) const;
1307a984708SDavid Chisnall    void operator%= (const valarray<value_type>& v) const;
1317a984708SDavid Chisnall    void operator+= (const valarray<value_type>& v) const;
1327a984708SDavid Chisnall    void operator-= (const valarray<value_type>& v) const;
1337a984708SDavid Chisnall    void operator^= (const valarray<value_type>& v) const;
1347a984708SDavid Chisnall    void operator&= (const valarray<value_type>& v) const;
1357a984708SDavid Chisnall    void operator|= (const valarray<value_type>& v) const;
1367a984708SDavid Chisnall    void operator<<=(const valarray<value_type>& v) const;
1377a984708SDavid Chisnall    void operator>>=(const valarray<value_type>& v) const;
1387a984708SDavid Chisnall
1397a984708SDavid Chisnall    void operator=(const value_type& x) const;
1407a984708SDavid Chisnall
1417a984708SDavid Chisnall    slice_array() = delete;
1427a984708SDavid Chisnall};
1437a984708SDavid Chisnall
1447a984708SDavid Chisnallclass gslice
1457a984708SDavid Chisnall{
1467a984708SDavid Chisnallpublic:
1477a984708SDavid Chisnall    gslice();
1487a984708SDavid Chisnall    gslice(size_t start, const valarray<size_t>& size,
1497a984708SDavid Chisnall                         const valarray<size_t>& stride);
1507a984708SDavid Chisnall
1517a984708SDavid Chisnall    size_t           start()  const;
1527a984708SDavid Chisnall    valarray<size_t> size()   const;
1537a984708SDavid Chisnall    valarray<size_t> stride() const;
1547a984708SDavid Chisnall};
1557a984708SDavid Chisnall
1567a984708SDavid Chisnalltemplate <class T>
1577a984708SDavid Chisnallclass gslice_array
1587a984708SDavid Chisnall{
1597a984708SDavid Chisnallpublic:
1607a984708SDavid Chisnall    typedef T value_type;
1617a984708SDavid Chisnall
1627a984708SDavid Chisnall    void operator=  (const valarray<value_type>& v) const;
1637a984708SDavid Chisnall    void operator*= (const valarray<value_type>& v) const;
1647a984708SDavid Chisnall    void operator/= (const valarray<value_type>& v) const;
1657a984708SDavid Chisnall    void operator%= (const valarray<value_type>& v) const;
1667a984708SDavid Chisnall    void operator+= (const valarray<value_type>& v) const;
1677a984708SDavid Chisnall    void operator-= (const valarray<value_type>& v) const;
1687a984708SDavid Chisnall    void operator^= (const valarray<value_type>& v) const;
1697a984708SDavid Chisnall    void operator&= (const valarray<value_type>& v) const;
1707a984708SDavid Chisnall    void operator|= (const valarray<value_type>& v) const;
1717a984708SDavid Chisnall    void operator<<=(const valarray<value_type>& v) const;
1727a984708SDavid Chisnall    void operator>>=(const valarray<value_type>& v) const;
1737a984708SDavid Chisnall
1747a984708SDavid Chisnall    gslice_array(const gslice_array& ga);
1757a984708SDavid Chisnall    ~gslice_array();
1767a984708SDavid Chisnall    const gslice_array& operator=(const gslice_array& ga) const;
1777a984708SDavid Chisnall    void operator=(const value_type& x) const;
1787a984708SDavid Chisnall
1797a984708SDavid Chisnall    gslice_array() = delete;
1807a984708SDavid Chisnall};
1817a984708SDavid Chisnall
1827a984708SDavid Chisnalltemplate <class T>
1837a984708SDavid Chisnallclass mask_array
1847a984708SDavid Chisnall{
1857a984708SDavid Chisnallpublic:
1867a984708SDavid Chisnall    typedef T value_type;
1877a984708SDavid Chisnall
1887a984708SDavid Chisnall    void operator=  (const valarray<value_type>& v) const;
1897a984708SDavid Chisnall    void operator*= (const valarray<value_type>& v) const;
1907a984708SDavid Chisnall    void operator/= (const valarray<value_type>& v) const;
1917a984708SDavid Chisnall    void operator%= (const valarray<value_type>& v) const;
1927a984708SDavid Chisnall    void operator+= (const valarray<value_type>& v) const;
1937a984708SDavid Chisnall    void operator-= (const valarray<value_type>& v) const;
1947a984708SDavid Chisnall    void operator^= (const valarray<value_type>& v) const;
1957a984708SDavid Chisnall    void operator&= (const valarray<value_type>& v) const;
1967a984708SDavid Chisnall    void operator|= (const valarray<value_type>& v) const;
1977a984708SDavid Chisnall    void operator<<=(const valarray<value_type>& v) const;
1987a984708SDavid Chisnall    void operator>>=(const valarray<value_type>& v) const;
1997a984708SDavid Chisnall
2007a984708SDavid Chisnall    mask_array(const mask_array& ma);
2017a984708SDavid Chisnall    ~mask_array();
2027a984708SDavid Chisnall    const mask_array& operator=(const mask_array& ma) const;
2037a984708SDavid Chisnall    void operator=(const value_type& x) const;
2047a984708SDavid Chisnall
2057a984708SDavid Chisnall    mask_array() = delete;
2067a984708SDavid Chisnall};
2077a984708SDavid Chisnall
2087a984708SDavid Chisnalltemplate <class T>
2097a984708SDavid Chisnallclass indirect_array
2107a984708SDavid Chisnall{
2117a984708SDavid Chisnallpublic:
2127a984708SDavid Chisnall    typedef T value_type;
2137a984708SDavid Chisnall
2147a984708SDavid Chisnall    void operator=  (const valarray<value_type>& v) const;
2157a984708SDavid Chisnall    void operator*= (const valarray<value_type>& v) const;
2167a984708SDavid Chisnall    void operator/= (const valarray<value_type>& v) const;
2177a984708SDavid Chisnall    void operator%= (const valarray<value_type>& v) const;
2187a984708SDavid Chisnall    void operator+= (const valarray<value_type>& v) const;
2197a984708SDavid Chisnall    void operator-= (const valarray<value_type>& v) const;
2207a984708SDavid Chisnall    void operator^= (const valarray<value_type>& v) const;
2217a984708SDavid Chisnall    void operator&= (const valarray<value_type>& v) const;
2227a984708SDavid Chisnall    void operator|= (const valarray<value_type>& v) const;
2237a984708SDavid Chisnall    void operator<<=(const valarray<value_type>& v) const;
2247a984708SDavid Chisnall    void operator>>=(const valarray<value_type>& v) const;
2257a984708SDavid Chisnall
2267a984708SDavid Chisnall    indirect_array(const indirect_array& ia);
2277a984708SDavid Chisnall    ~indirect_array();
2287a984708SDavid Chisnall    const indirect_array& operator=(const indirect_array& ia) const;
2297a984708SDavid Chisnall    void operator=(const value_type& x) const;
2307a984708SDavid Chisnall
2317a984708SDavid Chisnall    indirect_array() = delete;
2327a984708SDavid Chisnall};
2337a984708SDavid Chisnall
234936e9439SDimitry Andrictemplate<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept;
2357a984708SDavid Chisnall
2367a984708SDavid Chisnalltemplate<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y);
2377a984708SDavid Chisnalltemplate<class T> valarray<T> operator* (const valarray<T>& x, const T& y);
2387a984708SDavid Chisnalltemplate<class T> valarray<T> operator* (const T& x, const valarray<T>& y);
2397a984708SDavid Chisnall
2407a984708SDavid Chisnalltemplate<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y);
2417a984708SDavid Chisnalltemplate<class T> valarray<T> operator/ (const valarray<T>& x, const T& y);
2427a984708SDavid Chisnalltemplate<class T> valarray<T> operator/ (const T& x, const valarray<T>& y);
2437a984708SDavid Chisnall
2447a984708SDavid Chisnalltemplate<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y);
2457a984708SDavid Chisnalltemplate<class T> valarray<T> operator% (const valarray<T>& x, const T& y);
2467a984708SDavid Chisnalltemplate<class T> valarray<T> operator% (const T& x, const valarray<T>& y);
2477a984708SDavid Chisnall
2487a984708SDavid Chisnalltemplate<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y);
2497a984708SDavid Chisnalltemplate<class T> valarray<T> operator+ (const valarray<T>& x, const T& y);
2507a984708SDavid Chisnalltemplate<class T> valarray<T> operator+ (const T& x, const valarray<T>& y);
2517a984708SDavid Chisnall
2527a984708SDavid Chisnalltemplate<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y);
2537a984708SDavid Chisnalltemplate<class T> valarray<T> operator- (const valarray<T>& x, const T& y);
2547a984708SDavid Chisnalltemplate<class T> valarray<T> operator- (const T& x, const valarray<T>& y);
2557a984708SDavid Chisnall
2567a984708SDavid Chisnalltemplate<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y);
2577a984708SDavid Chisnalltemplate<class T> valarray<T> operator^ (const valarray<T>& x, const T& y);
2587a984708SDavid Chisnalltemplate<class T> valarray<T> operator^ (const T& x, const valarray<T>& y);
2597a984708SDavid Chisnall
2607a984708SDavid Chisnalltemplate<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y);
2617a984708SDavid Chisnalltemplate<class T> valarray<T> operator& (const valarray<T>& x, const T& y);
2627a984708SDavid Chisnalltemplate<class T> valarray<T> operator& (const T& x, const valarray<T>& y);
2637a984708SDavid Chisnall
2647a984708SDavid Chisnalltemplate<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y);
2657a984708SDavid Chisnalltemplate<class T> valarray<T> operator| (const valarray<T>& x, const T& y);
2667a984708SDavid Chisnalltemplate<class T> valarray<T> operator| (const T& x, const valarray<T>& y);
2677a984708SDavid Chisnall
2687a984708SDavid Chisnalltemplate<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y);
2697a984708SDavid Chisnalltemplate<class T> valarray<T> operator<<(const valarray<T>& x, const T& y);
2707a984708SDavid Chisnalltemplate<class T> valarray<T> operator<<(const T& x, const valarray<T>& y);
2717a984708SDavid Chisnall
2727a984708SDavid Chisnalltemplate<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y);
2737a984708SDavid Chisnalltemplate<class T> valarray<T> operator>>(const valarray<T>& x, const T& y);
2747a984708SDavid Chisnalltemplate<class T> valarray<T> operator>>(const T& x, const valarray<T>& y);
2757a984708SDavid Chisnall
2767a984708SDavid Chisnalltemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y);
2777a984708SDavid Chisnalltemplate<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y);
2787a984708SDavid Chisnalltemplate<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y);
2797a984708SDavid Chisnall
2807a984708SDavid Chisnalltemplate<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y);
2817a984708SDavid Chisnalltemplate<class T> valarray<bool> operator||(const valarray<T>& x, const T& y);
2827a984708SDavid Chisnalltemplate<class T> valarray<bool> operator||(const T& x, const valarray<T>& y);
2837a984708SDavid Chisnall
2847a984708SDavid Chisnalltemplate<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y);
2857a984708SDavid Chisnalltemplate<class T> valarray<bool> operator==(const valarray<T>& x, const T& y);
2867a984708SDavid Chisnalltemplate<class T> valarray<bool> operator==(const T& x, const valarray<T>& y);
2877a984708SDavid Chisnall
2887a984708SDavid Chisnalltemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y);
2897a984708SDavid Chisnalltemplate<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y);
2907a984708SDavid Chisnalltemplate<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y);
2917a984708SDavid Chisnall
2927a984708SDavid Chisnalltemplate<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y);
2937a984708SDavid Chisnalltemplate<class T> valarray<bool> operator< (const valarray<T>& x, const T& y);
2947a984708SDavid Chisnalltemplate<class T> valarray<bool> operator< (const T& x, const valarray<T>& y);
2957a984708SDavid Chisnall
2967a984708SDavid Chisnalltemplate<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y);
2977a984708SDavid Chisnalltemplate<class T> valarray<bool> operator> (const valarray<T>& x, const T& y);
2987a984708SDavid Chisnalltemplate<class T> valarray<bool> operator> (const T& x, const valarray<T>& y);
2997a984708SDavid Chisnall
3007a984708SDavid Chisnalltemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y);
3017a984708SDavid Chisnalltemplate<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y);
3027a984708SDavid Chisnalltemplate<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y);
3037a984708SDavid Chisnall
3047a984708SDavid Chisnalltemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y);
3057a984708SDavid Chisnalltemplate<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y);
3067a984708SDavid Chisnalltemplate<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y);
3077a984708SDavid Chisnall
3087a984708SDavid Chisnalltemplate<class T> valarray<T> abs (const valarray<T>& x);
3097a984708SDavid Chisnalltemplate<class T> valarray<T> acos (const valarray<T>& x);
3107a984708SDavid Chisnalltemplate<class T> valarray<T> asin (const valarray<T>& x);
3117a984708SDavid Chisnalltemplate<class T> valarray<T> atan (const valarray<T>& x);
3127a984708SDavid Chisnall
3137a984708SDavid Chisnalltemplate<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y);
3147a984708SDavid Chisnalltemplate<class T> valarray<T> atan2(const valarray<T>& x, const T& y);
3157a984708SDavid Chisnalltemplate<class T> valarray<T> atan2(const T& x, const valarray<T>& y);
3167a984708SDavid Chisnall
3177a984708SDavid Chisnalltemplate<class T> valarray<T> cos (const valarray<T>& x);
3187a984708SDavid Chisnalltemplate<class T> valarray<T> cosh (const valarray<T>& x);
3197a984708SDavid Chisnalltemplate<class T> valarray<T> exp (const valarray<T>& x);
3207a984708SDavid Chisnalltemplate<class T> valarray<T> log (const valarray<T>& x);
3217a984708SDavid Chisnalltemplate<class T> valarray<T> log10(const valarray<T>& x);
3227a984708SDavid Chisnall
3237a984708SDavid Chisnalltemplate<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y);
3247a984708SDavid Chisnalltemplate<class T> valarray<T> pow(const valarray<T>& x, const T& y);
3257a984708SDavid Chisnalltemplate<class T> valarray<T> pow(const T& x, const valarray<T>& y);
3267a984708SDavid Chisnall
3277a984708SDavid Chisnalltemplate<class T> valarray<T> sin (const valarray<T>& x);
3287a984708SDavid Chisnalltemplate<class T> valarray<T> sinh (const valarray<T>& x);
3297a984708SDavid Chisnalltemplate<class T> valarray<T> sqrt (const valarray<T>& x);
3307a984708SDavid Chisnalltemplate<class T> valarray<T> tan (const valarray<T>& x);
3317a984708SDavid Chisnalltemplate<class T> valarray<T> tanh (const valarray<T>& x);
3327a984708SDavid Chisnall
3337a984708SDavid Chisnalltemplate <class T> unspecified1 begin(valarray<T>& v);
3347a984708SDavid Chisnalltemplate <class T> unspecified2 begin(const valarray<T>& v);
3357a984708SDavid Chisnalltemplate <class T> unspecified1 end(valarray<T>& v);
3367a984708SDavid Chisnalltemplate <class T> unspecified2 end(const valarray<T>& v);
3377a984708SDavid Chisnall
3387a984708SDavid Chisnall}  // std
3397a984708SDavid Chisnall
3407a984708SDavid Chisnall*/
3417a984708SDavid Chisnall
3427a984708SDavid Chisnall#include <__config>
3437a984708SDavid Chisnall#include <cstddef>
3447a984708SDavid Chisnall#include <cmath>
3457a984708SDavid Chisnall#include <initializer_list>
3467a984708SDavid Chisnall#include <algorithm>
3477a984708SDavid Chisnall#include <functional>
348d72607e9SDimitry Andric#include <new>
3497a984708SDavid Chisnall
3507a984708SDavid Chisnall#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3517a984708SDavid Chisnall#pragma GCC system_header
3527a984708SDavid Chisnall#endif
3537a984708SDavid Chisnall
354f9448bf3SDimitry Andric_LIBCPP_PUSH_MACROS
355f9448bf3SDimitry Andric#include <__undef_macros>
356f9448bf3SDimitry Andric
357f9448bf3SDimitry Andric
3587a984708SDavid Chisnall_LIBCPP_BEGIN_NAMESPACE_STD
3597a984708SDavid Chisnall
360aed8d94eSDimitry Andrictemplate<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray;
3617a984708SDavid Chisnall
362aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice
3637a984708SDavid Chisnall{
3647a984708SDavid Chisnall    size_t __start_;
3657a984708SDavid Chisnall    size_t __size_;
3667a984708SDavid Chisnall    size_t __stride_;
3677a984708SDavid Chisnallpublic:
3687a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
3697a984708SDavid Chisnall    slice()
3707a984708SDavid Chisnall        : __start_(0),
3717a984708SDavid Chisnall          __size_(0),
3727a984708SDavid Chisnall          __stride_(0)
3737a984708SDavid Chisnall          {}
3747a984708SDavid Chisnall
3757a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
3767a984708SDavid Chisnall    slice(size_t __start, size_t __size, size_t __stride)
3777a984708SDavid Chisnall        : __start_(__start),
3787a984708SDavid Chisnall          __size_(__size),
3797a984708SDavid Chisnall          __stride_(__stride)
3807a984708SDavid Chisnall          {}
3817a984708SDavid Chisnall
3827a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY size_t start()  const {return __start_;}
3837a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY size_t size()   const {return __size_;}
3847a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;}
3857a984708SDavid Chisnall};
3867a984708SDavid Chisnall
387aed8d94eSDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array;
3881bf9f7c1SDimitry Andricclass _LIBCPP_TYPE_VIS gslice;
389aed8d94eSDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array;
390aed8d94eSDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array;
391aed8d94eSDimitry Andrictemplate <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array;
3927a984708SDavid Chisnall
3937a984708SDavid Chisnalltemplate <class _Tp>
394936e9439SDimitry Andric_LIBCPP_INLINE_VISIBILITY
3957a984708SDavid Chisnall_Tp*
3967a984708SDavid Chisnallbegin(valarray<_Tp>& __v);
3977a984708SDavid Chisnall
3987a984708SDavid Chisnalltemplate <class _Tp>
399936e9439SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4007a984708SDavid Chisnallconst _Tp*
4017a984708SDavid Chisnallbegin(const valarray<_Tp>& __v);
4027a984708SDavid Chisnall
4037a984708SDavid Chisnalltemplate <class _Tp>
404936e9439SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4057a984708SDavid Chisnall_Tp*
4067a984708SDavid Chisnallend(valarray<_Tp>& __v);
4077a984708SDavid Chisnall
4087a984708SDavid Chisnalltemplate <class _Tp>
409936e9439SDimitry Andric_LIBCPP_INLINE_VISIBILITY
4107a984708SDavid Chisnallconst _Tp*
4117a984708SDavid Chisnallend(const valarray<_Tp>& __v);
4127a984708SDavid Chisnall
4137a984708SDavid Chisnalltemplate <class _Op, class _A0>
4147a984708SDavid Chisnallstruct _UnaryOp
4157a984708SDavid Chisnall{
4167a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
4177a984708SDavid Chisnall    typedef typename _A0::value_type value_type;
4187a984708SDavid Chisnall
4197a984708SDavid Chisnall    _Op __op_;
4207a984708SDavid Chisnall    _A0 __a0_;
4217a984708SDavid Chisnall
4227a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4237a984708SDavid Chisnall    _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {}
4247a984708SDavid Chisnall
4257a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4267a984708SDavid Chisnall    result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
4277a984708SDavid Chisnall
4287a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4297a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
4307a984708SDavid Chisnall};
4317a984708SDavid Chisnall
4327a984708SDavid Chisnalltemplate <class _Op, class _A0, class _A1>
4337a984708SDavid Chisnallstruct _BinaryOp
4347a984708SDavid Chisnall{
4357a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
4367a984708SDavid Chisnall    typedef typename _A0::value_type value_type;
4377a984708SDavid Chisnall
4387a984708SDavid Chisnall    _Op __op_;
4397a984708SDavid Chisnall    _A0 __a0_;
4407a984708SDavid Chisnall    _A1 __a1_;
4417a984708SDavid Chisnall
4427a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4437a984708SDavid Chisnall    _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1)
4447a984708SDavid Chisnall        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
4457a984708SDavid Chisnall
4467a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4477a984708SDavid Chisnall    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
4487a984708SDavid Chisnall
4497a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4507a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
4517a984708SDavid Chisnall};
4527a984708SDavid Chisnall
4537a984708SDavid Chisnalltemplate <class _Tp>
4547a984708SDavid Chisnallclass __scalar_expr
4557a984708SDavid Chisnall{
4567a984708SDavid Chisnallpublic:
4577a984708SDavid Chisnall    typedef _Tp        value_type;
4587a984708SDavid Chisnall    typedef const _Tp& result_type;
4597a984708SDavid Chisnallprivate:
4607a984708SDavid Chisnall    const value_type& __t_;
4617a984708SDavid Chisnall    size_t __s_;
4627a984708SDavid Chisnallpublic:
4637a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4647a984708SDavid Chisnall    explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {}
4657a984708SDavid Chisnall
4667a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4677a984708SDavid Chisnall    result_type operator[](size_t) const {return __t_;}
4687a984708SDavid Chisnall
4697a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4707a984708SDavid Chisnall    size_t size() const {return __s_;}
4717a984708SDavid Chisnall};
4727a984708SDavid Chisnall
4737a984708SDavid Chisnalltemplate <class _Tp>
4747a984708SDavid Chisnallstruct __unary_plus : unary_function<_Tp, _Tp>
4757a984708SDavid Chisnall{
4767a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4777a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
4787a984708SDavid Chisnall        {return +__x;}
4797a984708SDavid Chisnall};
4807a984708SDavid Chisnall
4817a984708SDavid Chisnalltemplate <class _Tp>
4827a984708SDavid Chisnallstruct __bit_not  : unary_function<_Tp, _Tp>
4837a984708SDavid Chisnall{
4847a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4857a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
4867a984708SDavid Chisnall        {return ~__x;}
4877a984708SDavid Chisnall};
4887a984708SDavid Chisnall
4897a984708SDavid Chisnalltemplate <class _Tp>
4907a984708SDavid Chisnallstruct __bit_shift_left : binary_function<_Tp, _Tp, _Tp>
4917a984708SDavid Chisnall{
4927a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
4937a984708SDavid Chisnall    _Tp operator()(const _Tp& __x, const _Tp& __y) const
4947a984708SDavid Chisnall        {return __x << __y;}
4957a984708SDavid Chisnall};
4967a984708SDavid Chisnall
4977a984708SDavid Chisnalltemplate <class _Tp>
4987a984708SDavid Chisnallstruct __bit_shift_right : binary_function<_Tp, _Tp, _Tp>
4997a984708SDavid Chisnall{
5007a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5017a984708SDavid Chisnall    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5027a984708SDavid Chisnall        {return __x >> __y;}
5037a984708SDavid Chisnall};
5047a984708SDavid Chisnall
50594e3ee44SDavid Chisnalltemplate <class _Tp, class _Fp>
5067a984708SDavid Chisnallstruct __apply_expr   : unary_function<_Tp, _Tp>
5077a984708SDavid Chisnall{
5087a984708SDavid Chisnallprivate:
50994e3ee44SDavid Chisnall    _Fp __f_;
5107a984708SDavid Chisnallpublic:
5117a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
51294e3ee44SDavid Chisnall    explicit __apply_expr(_Fp __f) : __f_(__f) {}
5137a984708SDavid Chisnall
5147a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5157a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5167a984708SDavid Chisnall        {return __f_(__x);}
5177a984708SDavid Chisnall};
5187a984708SDavid Chisnall
5197a984708SDavid Chisnalltemplate <class _Tp>
5207a984708SDavid Chisnallstruct __abs_expr : unary_function<_Tp, _Tp>
5217a984708SDavid Chisnall{
5227a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5237a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5247a984708SDavid Chisnall        {return abs(__x);}
5257a984708SDavid Chisnall};
5267a984708SDavid Chisnall
5277a984708SDavid Chisnalltemplate <class _Tp>
5287a984708SDavid Chisnallstruct __acos_expr : unary_function<_Tp, _Tp>
5297a984708SDavid Chisnall{
5307a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5317a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5327a984708SDavid Chisnall        {return acos(__x);}
5337a984708SDavid Chisnall};
5347a984708SDavid Chisnall
5357a984708SDavid Chisnalltemplate <class _Tp>
5367a984708SDavid Chisnallstruct __asin_expr : unary_function<_Tp, _Tp>
5377a984708SDavid Chisnall{
5387a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5397a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5407a984708SDavid Chisnall        {return asin(__x);}
5417a984708SDavid Chisnall};
5427a984708SDavid Chisnall
5437a984708SDavid Chisnalltemplate <class _Tp>
5447a984708SDavid Chisnallstruct __atan_expr : unary_function<_Tp, _Tp>
5457a984708SDavid Chisnall{
5467a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5477a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5487a984708SDavid Chisnall        {return atan(__x);}
5497a984708SDavid Chisnall};
5507a984708SDavid Chisnall
5517a984708SDavid Chisnalltemplate <class _Tp>
5527a984708SDavid Chisnallstruct __atan2_expr : binary_function<_Tp, _Tp, _Tp>
5537a984708SDavid Chisnall{
5547a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5557a984708SDavid Chisnall    _Tp operator()(const _Tp& __x, const _Tp& __y) const
5567a984708SDavid Chisnall        {return atan2(__x, __y);}
5577a984708SDavid Chisnall};
5587a984708SDavid Chisnall
5597a984708SDavid Chisnalltemplate <class _Tp>
5607a984708SDavid Chisnallstruct __cos_expr : unary_function<_Tp, _Tp>
5617a984708SDavid Chisnall{
5627a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5637a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5647a984708SDavid Chisnall        {return cos(__x);}
5657a984708SDavid Chisnall};
5667a984708SDavid Chisnall
5677a984708SDavid Chisnalltemplate <class _Tp>
5687a984708SDavid Chisnallstruct __cosh_expr : unary_function<_Tp, _Tp>
5697a984708SDavid Chisnall{
5707a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5717a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5727a984708SDavid Chisnall        {return cosh(__x);}
5737a984708SDavid Chisnall};
5747a984708SDavid Chisnall
5757a984708SDavid Chisnalltemplate <class _Tp>
5767a984708SDavid Chisnallstruct __exp_expr : unary_function<_Tp, _Tp>
5777a984708SDavid Chisnall{
5787a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5797a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5807a984708SDavid Chisnall        {return exp(__x);}
5817a984708SDavid Chisnall};
5827a984708SDavid Chisnall
5837a984708SDavid Chisnalltemplate <class _Tp>
5847a984708SDavid Chisnallstruct __log_expr : unary_function<_Tp, _Tp>
5857a984708SDavid Chisnall{
5867a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5877a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5887a984708SDavid Chisnall        {return log(__x);}
5897a984708SDavid Chisnall};
5907a984708SDavid Chisnall
5917a984708SDavid Chisnalltemplate <class _Tp>
5927a984708SDavid Chisnallstruct __log10_expr : unary_function<_Tp, _Tp>
5937a984708SDavid Chisnall{
5947a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
5957a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
5967a984708SDavid Chisnall        {return log10(__x);}
5977a984708SDavid Chisnall};
5987a984708SDavid Chisnall
5997a984708SDavid Chisnalltemplate <class _Tp>
6007a984708SDavid Chisnallstruct __pow_expr : binary_function<_Tp, _Tp, _Tp>
6017a984708SDavid Chisnall{
6027a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6037a984708SDavid Chisnall    _Tp operator()(const _Tp& __x, const _Tp& __y) const
6047a984708SDavid Chisnall        {return pow(__x, __y);}
6057a984708SDavid Chisnall};
6067a984708SDavid Chisnall
6077a984708SDavid Chisnalltemplate <class _Tp>
6087a984708SDavid Chisnallstruct __sin_expr : unary_function<_Tp, _Tp>
6097a984708SDavid Chisnall{
6107a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6117a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
6127a984708SDavid Chisnall        {return sin(__x);}
6137a984708SDavid Chisnall};
6147a984708SDavid Chisnall
6157a984708SDavid Chisnalltemplate <class _Tp>
6167a984708SDavid Chisnallstruct __sinh_expr : unary_function<_Tp, _Tp>
6177a984708SDavid Chisnall{
6187a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6197a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
6207a984708SDavid Chisnall        {return sinh(__x);}
6217a984708SDavid Chisnall};
6227a984708SDavid Chisnall
6237a984708SDavid Chisnalltemplate <class _Tp>
6247a984708SDavid Chisnallstruct __sqrt_expr : unary_function<_Tp, _Tp>
6257a984708SDavid Chisnall{
6267a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6277a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
6287a984708SDavid Chisnall        {return sqrt(__x);}
6297a984708SDavid Chisnall};
6307a984708SDavid Chisnall
6317a984708SDavid Chisnalltemplate <class _Tp>
6327a984708SDavid Chisnallstruct __tan_expr : unary_function<_Tp, _Tp>
6337a984708SDavid Chisnall{
6347a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6357a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
6367a984708SDavid Chisnall        {return tan(__x);}
6377a984708SDavid Chisnall};
6387a984708SDavid Chisnall
6397a984708SDavid Chisnalltemplate <class _Tp>
6407a984708SDavid Chisnallstruct __tanh_expr : unary_function<_Tp, _Tp>
6417a984708SDavid Chisnall{
6427a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6437a984708SDavid Chisnall    _Tp operator()(const _Tp& __x) const
6447a984708SDavid Chisnall        {return tanh(__x);}
6457a984708SDavid Chisnall};
6467a984708SDavid Chisnall
6477a984708SDavid Chisnalltemplate <class _ValExpr>
6487a984708SDavid Chisnallclass __slice_expr
6497a984708SDavid Chisnall{
6507a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
6517a984708SDavid Chisnallpublic:
6527a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
6537a984708SDavid Chisnall    typedef value_type result_type;
6547a984708SDavid Chisnall
6557a984708SDavid Chisnallprivate:
6567a984708SDavid Chisnall    _ValExpr __expr_;
6577a984708SDavid Chisnall    size_t __start_;
6587a984708SDavid Chisnall    size_t __size_;
6597a984708SDavid Chisnall    size_t __stride_;
6607a984708SDavid Chisnall
6617a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6627a984708SDavid Chisnall    __slice_expr(const slice& __sl, const _RmExpr& __e)
6637a984708SDavid Chisnall        : __expr_(__e),
6647a984708SDavid Chisnall          __start_(__sl.start()),
6657a984708SDavid Chisnall          __size_(__sl.size()),
6667a984708SDavid Chisnall          __stride_(__sl.stride())
6677a984708SDavid Chisnall        {}
6687a984708SDavid Chisnallpublic:
6697a984708SDavid Chisnall
6707a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6717a984708SDavid Chisnall    result_type operator[](size_t __i) const
6727a984708SDavid Chisnall        {return __expr_[__start_ + __i * __stride_];}
6737a984708SDavid Chisnall
6747a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
6757a984708SDavid Chisnall    size_t size() const {return __size_;}
6767a984708SDavid Chisnall
677aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
6787a984708SDavid Chisnall};
6797a984708SDavid Chisnall
6807a984708SDavid Chisnalltemplate <class _ValExpr>
6817a984708SDavid Chisnallclass __mask_expr;
6827a984708SDavid Chisnall
6837a984708SDavid Chisnalltemplate <class _ValExpr>
6847a984708SDavid Chisnallclass __indirect_expr;
6857a984708SDavid Chisnall
6867a984708SDavid Chisnalltemplate <class _ValExpr>
6877a984708SDavid Chisnallclass __shift_expr
6887a984708SDavid Chisnall{
6897a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
6907a984708SDavid Chisnallpublic:
6917a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
6927a984708SDavid Chisnall    typedef value_type result_type;
6937a984708SDavid Chisnall
6947a984708SDavid Chisnallprivate:
6957a984708SDavid Chisnall    _ValExpr __expr_;
6967a984708SDavid Chisnall    size_t __size_;
6977a984708SDavid Chisnall    ptrdiff_t __ul_;
6987a984708SDavid Chisnall    ptrdiff_t __sn_;
6997a984708SDavid Chisnall    ptrdiff_t __n_;
70094e3ee44SDavid Chisnall    static const ptrdiff_t _Np = static_cast<ptrdiff_t>(
7017a984708SDavid Chisnall                                    sizeof(ptrdiff_t) * __CHAR_BIT__ - 1);
7027a984708SDavid Chisnall
7037a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7047a984708SDavid Chisnall    __shift_expr(int __n, const _RmExpr& __e)
7057a984708SDavid Chisnall        : __expr_(__e),
7067a984708SDavid Chisnall          __size_(__e.size()),
7077a984708SDavid Chisnall          __n_(__n)
7087a984708SDavid Chisnall        {
70994e3ee44SDavid Chisnall            ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np);
71094e3ee44SDavid Chisnall            __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np);
7117a984708SDavid Chisnall            __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n);
7127a984708SDavid Chisnall        }
7137a984708SDavid Chisnallpublic:
7147a984708SDavid Chisnall
7157a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7167a984708SDavid Chisnall    result_type operator[](size_t __j) const
7177a984708SDavid Chisnall        {
71894e3ee44SDavid Chisnall            ptrdiff_t __i = static_cast<ptrdiff_t>(__j);
71994e3ee44SDavid Chisnall            ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np;
7207a984708SDavid Chisnall            return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m);
7217a984708SDavid Chisnall        }
7227a984708SDavid Chisnall
7237a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7247a984708SDavid Chisnall    size_t size() const {return __size_;}
7257a984708SDavid Chisnall
7267a984708SDavid Chisnall    template <class> friend class __val_expr;
7277a984708SDavid Chisnall};
7287a984708SDavid Chisnall
7297a984708SDavid Chisnalltemplate <class _ValExpr>
7307a984708SDavid Chisnallclass __cshift_expr
7317a984708SDavid Chisnall{
7327a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
7337a984708SDavid Chisnallpublic:
7347a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
7357a984708SDavid Chisnall    typedef value_type result_type;
7367a984708SDavid Chisnall
7377a984708SDavid Chisnallprivate:
7387a984708SDavid Chisnall    _ValExpr __expr_;
7397a984708SDavid Chisnall    size_t __size_;
7407a984708SDavid Chisnall    size_t __m_;
7417a984708SDavid Chisnall    size_t __o1_;
7427a984708SDavid Chisnall    size_t __o2_;
7437a984708SDavid Chisnall
7447a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7457a984708SDavid Chisnall    __cshift_expr(int __n, const _RmExpr& __e)
7467a984708SDavid Chisnall        : __expr_(__e),
7477a984708SDavid Chisnall          __size_(__e.size())
7487a984708SDavid Chisnall        {
7497a984708SDavid Chisnall            __n %= static_cast<int>(__size_);
7507a984708SDavid Chisnall            if (__n >= 0)
7517a984708SDavid Chisnall            {
7527a984708SDavid Chisnall                __m_ = __size_ - __n;
7537a984708SDavid Chisnall                __o1_ = __n;
7547a984708SDavid Chisnall                __o2_ = __n - __size_;
7557a984708SDavid Chisnall            }
7567a984708SDavid Chisnall            else
7577a984708SDavid Chisnall            {
7587a984708SDavid Chisnall                __m_ = -__n;
7597a984708SDavid Chisnall                __o1_ = __n + __size_;
7607a984708SDavid Chisnall                __o2_ = __n;
7617a984708SDavid Chisnall            }
7627a984708SDavid Chisnall        }
7637a984708SDavid Chisnallpublic:
7647a984708SDavid Chisnall
7657a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7667a984708SDavid Chisnall    result_type operator[](size_t __i) const
7677a984708SDavid Chisnall        {
7687a984708SDavid Chisnall            if (__i < __m_)
7697a984708SDavid Chisnall                return __expr_[__i + __o1_];
7707a984708SDavid Chisnall            return __expr_[__i + __o2_];
7717a984708SDavid Chisnall        }
7727a984708SDavid Chisnall
7737a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
7747a984708SDavid Chisnall    size_t size() const {return __size_;}
7757a984708SDavid Chisnall
7767a984708SDavid Chisnall    template <class> friend class __val_expr;
7777a984708SDavid Chisnall};
7787a984708SDavid Chisnall
7797a984708SDavid Chisnalltemplate<class _ValExpr>
7807a984708SDavid Chisnallclass __val_expr;
7817a984708SDavid Chisnall
7827a984708SDavid Chisnalltemplate<class _ValExpr>
7837a984708SDavid Chisnallstruct __is_val_expr : false_type {};
7847a984708SDavid Chisnall
7857a984708SDavid Chisnalltemplate<class _ValExpr>
7867a984708SDavid Chisnallstruct __is_val_expr<__val_expr<_ValExpr> > : true_type {};
7877a984708SDavid Chisnall
7887a984708SDavid Chisnalltemplate<class _Tp>
7897a984708SDavid Chisnallstruct __is_val_expr<valarray<_Tp> > : true_type {};
7907a984708SDavid Chisnall
7917a984708SDavid Chisnalltemplate<class _Tp>
792aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS valarray
7937a984708SDavid Chisnall{
7947a984708SDavid Chisnallpublic:
7957a984708SDavid Chisnall    typedef _Tp value_type;
7967a984708SDavid Chisnall    typedef _Tp result_type;
7977a984708SDavid Chisnall
7987a984708SDavid Chisnallprivate:
7997a984708SDavid Chisnall    value_type* __begin_;
8007a984708SDavid Chisnall    value_type* __end_;
8017a984708SDavid Chisnall
8027a984708SDavid Chisnallpublic:
8037a984708SDavid Chisnall    // construct/destroy:
8047a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
8057a984708SDavid Chisnall    valarray() : __begin_(0), __end_(0) {}
806*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
807aed8d94eSDimitry Andric    explicit valarray(size_t __n);
8089729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8097a984708SDavid Chisnall    valarray(const value_type& __x, size_t __n);
8107a984708SDavid Chisnall    valarray(const value_type* __p, size_t __n);
8117a984708SDavid Chisnall    valarray(const valarray& __v);
812540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8139729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
814936e9439SDimitry Andric    valarray(valarray&& __v) _NOEXCEPT;
8157a984708SDavid Chisnall    valarray(initializer_list<value_type> __il);
816540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8177a984708SDavid Chisnall    valarray(const slice_array<value_type>& __sa);
8187a984708SDavid Chisnall    valarray(const gslice_array<value_type>& __ga);
8197a984708SDavid Chisnall    valarray(const mask_array<value_type>& __ma);
8207a984708SDavid Chisnall    valarray(const indirect_array<value_type>& __ia);
821*b5893f02SDimitry Andric    inline _LIBCPP_HIDE_FROM_ABI_AFTER_V1
8227a984708SDavid Chisnall    ~valarray();
8237a984708SDavid Chisnall
8247a984708SDavid Chisnall    // assignment:
8257a984708SDavid Chisnall    valarray& operator=(const valarray& __v);
826540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8279729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
828936e9439SDimitry Andric    valarray& operator=(valarray&& __v) _NOEXCEPT;
8299729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8307a984708SDavid Chisnall    valarray& operator=(initializer_list<value_type>);
831540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8329729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8337a984708SDavid Chisnall    valarray& operator=(const value_type& __x);
8349729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8357a984708SDavid Chisnall    valarray& operator=(const slice_array<value_type>& __sa);
8369729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8377a984708SDavid Chisnall    valarray& operator=(const gslice_array<value_type>& __ga);
8389729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8397a984708SDavid Chisnall    valarray& operator=(const mask_array<value_type>& __ma);
8409729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8417a984708SDavid Chisnall    valarray& operator=(const indirect_array<value_type>& __ia);
8427a984708SDavid Chisnall    template <class _ValExpr>
8439729cf09SDimitry Andric        _LIBCPP_INLINE_VISIBILITY
8447a984708SDavid Chisnall        valarray& operator=(const __val_expr<_ValExpr>& __v);
8457a984708SDavid Chisnall
8467a984708SDavid Chisnall    // element access:
8477a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
8487a984708SDavid Chisnall    const value_type& operator[](size_t __i) const {return __begin_[__i];}
8497a984708SDavid Chisnall
8507a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
8517a984708SDavid Chisnall    value_type&       operator[](size_t __i)       {return __begin_[__i];}
8527a984708SDavid Chisnall
8537a984708SDavid Chisnall    // subset operations:
8549729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8557a984708SDavid Chisnall    __val_expr<__slice_expr<const valarray&> >    operator[](slice __s) const;
8569729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8577a984708SDavid Chisnall    slice_array<value_type>                       operator[](slice __s);
8589729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8597a984708SDavid Chisnall    __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const;
8609729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8617a984708SDavid Chisnall    gslice_array<value_type>   operator[](const gslice& __gs);
862540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8639729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8647a984708SDavid Chisnall    __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const;
8659729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8667a984708SDavid Chisnall    gslice_array<value_type>                      operator[](gslice&& __gs);
867540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8689729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8697a984708SDavid Chisnall    __val_expr<__mask_expr<const valarray&> >     operator[](const valarray<bool>& __vb) const;
8709729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8717a984708SDavid Chisnall    mask_array<value_type>                        operator[](const valarray<bool>& __vb);
872540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8739729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8747a984708SDavid Chisnall    __val_expr<__mask_expr<const valarray&> >     operator[](valarray<bool>&& __vb) const;
8759729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8767a984708SDavid Chisnall    mask_array<value_type>                        operator[](valarray<bool>&& __vb);
877540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8789729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8797a984708SDavid Chisnall    __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const;
8809729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8817a984708SDavid Chisnall    indirect_array<value_type>                    operator[](const valarray<size_t>& __vs);
882540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
8839729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8847a984708SDavid Chisnall    __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const;
8859729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8867a984708SDavid Chisnall    indirect_array<value_type>                    operator[](valarray<size_t>&& __vs);
887540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
8887a984708SDavid Chisnall
8897a984708SDavid Chisnall    // unary operators:
8907a984708SDavid Chisnall    valarray       operator+() const;
8917a984708SDavid Chisnall    valarray       operator-() const;
8927a984708SDavid Chisnall    valarray       operator~() const;
8937a984708SDavid Chisnall    valarray<bool> operator!() const;
8947a984708SDavid Chisnall
8957a984708SDavid Chisnall    // computed assignment:
8969729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8977a984708SDavid Chisnall    valarray& operator*= (const value_type& __x);
8989729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
8997a984708SDavid Chisnall    valarray& operator/= (const value_type& __x);
9009729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9017a984708SDavid Chisnall    valarray& operator%= (const value_type& __x);
9029729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9037a984708SDavid Chisnall    valarray& operator+= (const value_type& __x);
9049729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9057a984708SDavid Chisnall    valarray& operator-= (const value_type& __x);
9069729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9077a984708SDavid Chisnall    valarray& operator^= (const value_type& __x);
9089729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9097a984708SDavid Chisnall    valarray& operator&= (const value_type& __x);
9109729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9117a984708SDavid Chisnall    valarray& operator|= (const value_type& __x);
9129729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9137a984708SDavid Chisnall    valarray& operator<<=(const value_type& __x);
9149729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9157a984708SDavid Chisnall    valarray& operator>>=(const value_type& __x);
9167a984708SDavid Chisnall
9177a984708SDavid Chisnall    template <class _Expr>
9187a984708SDavid Chisnall    typename enable_if
9197a984708SDavid Chisnall    <
9207a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9217a984708SDavid Chisnall        valarray&
9227a984708SDavid Chisnall    >::type
9239729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9247a984708SDavid Chisnall    operator*= (const _Expr& __v);
9257a984708SDavid Chisnall
9267a984708SDavid Chisnall    template <class _Expr>
9277a984708SDavid Chisnall    typename enable_if
9287a984708SDavid Chisnall    <
9297a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9307a984708SDavid Chisnall        valarray&
9317a984708SDavid Chisnall    >::type
9329729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9337a984708SDavid Chisnall    operator/= (const _Expr& __v);
9347a984708SDavid Chisnall
9357a984708SDavid Chisnall    template <class _Expr>
9367a984708SDavid Chisnall    typename enable_if
9377a984708SDavid Chisnall    <
9387a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9397a984708SDavid Chisnall        valarray&
9407a984708SDavid Chisnall    >::type
9419729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9427a984708SDavid Chisnall    operator%= (const _Expr& __v);
9437a984708SDavid Chisnall
9447a984708SDavid Chisnall    template <class _Expr>
9457a984708SDavid Chisnall    typename enable_if
9467a984708SDavid Chisnall    <
9477a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9487a984708SDavid Chisnall        valarray&
9497a984708SDavid Chisnall    >::type
9509729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9517a984708SDavid Chisnall    operator+= (const _Expr& __v);
9527a984708SDavid Chisnall
9537a984708SDavid Chisnall    template <class _Expr>
9547a984708SDavid Chisnall    typename enable_if
9557a984708SDavid Chisnall    <
9567a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9577a984708SDavid Chisnall        valarray&
9587a984708SDavid Chisnall    >::type
9599729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9607a984708SDavid Chisnall    operator-= (const _Expr& __v);
9617a984708SDavid Chisnall
9627a984708SDavid Chisnall    template <class _Expr>
9637a984708SDavid Chisnall    typename enable_if
9647a984708SDavid Chisnall    <
9657a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9667a984708SDavid Chisnall        valarray&
9677a984708SDavid Chisnall    >::type
9689729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9697a984708SDavid Chisnall    operator^= (const _Expr& __v);
9707a984708SDavid Chisnall
9717a984708SDavid Chisnall    template <class _Expr>
9727a984708SDavid Chisnall    typename enable_if
9737a984708SDavid Chisnall    <
9747a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9757a984708SDavid Chisnall        valarray&
9767a984708SDavid Chisnall    >::type
9779729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9787a984708SDavid Chisnall    operator|= (const _Expr& __v);
9797a984708SDavid Chisnall
9807a984708SDavid Chisnall    template <class _Expr>
9817a984708SDavid Chisnall    typename enable_if
9827a984708SDavid Chisnall    <
9837a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9847a984708SDavid Chisnall        valarray&
9857a984708SDavid Chisnall    >::type
9869729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9877a984708SDavid Chisnall    operator&= (const _Expr& __v);
9887a984708SDavid Chisnall
9897a984708SDavid Chisnall    template <class _Expr>
9907a984708SDavid Chisnall    typename enable_if
9917a984708SDavid Chisnall    <
9927a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
9937a984708SDavid Chisnall        valarray&
9947a984708SDavid Chisnall    >::type
9959729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
9967a984708SDavid Chisnall    operator<<= (const _Expr& __v);
9977a984708SDavid Chisnall
9987a984708SDavid Chisnall    template <class _Expr>
9997a984708SDavid Chisnall    typename enable_if
10007a984708SDavid Chisnall    <
10017a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
10027a984708SDavid Chisnall        valarray&
10037a984708SDavid Chisnall    >::type
10049729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10057a984708SDavid Chisnall    operator>>= (const _Expr& __v);
10067a984708SDavid Chisnall
10077a984708SDavid Chisnall    // member functions:
10089729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1009936e9439SDimitry Andric    void swap(valarray& __v) _NOEXCEPT;
10107a984708SDavid Chisnall
10117a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
101294e3ee44SDavid Chisnall    size_t size() const {return static_cast<size_t>(__end_ - __begin_);}
10137a984708SDavid Chisnall
10149729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10157a984708SDavid Chisnall    value_type sum() const;
10169729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10177a984708SDavid Chisnall    value_type min() const;
10189729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
10197a984708SDavid Chisnall    value_type max() const;
10207a984708SDavid Chisnall
10217a984708SDavid Chisnall    valarray shift (int __i) const;
10227a984708SDavid Chisnall    valarray cshift(int __i) const;
10237a984708SDavid Chisnall    valarray apply(value_type __f(value_type)) const;
10247a984708SDavid Chisnall    valarray apply(value_type __f(const value_type&)) const;
10257a984708SDavid Chisnall    void     resize(size_t __n, value_type __x = value_type());
10267a984708SDavid Chisnall
10277a984708SDavid Chisnallprivate:
1028aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
1029aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array;
1030aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array;
1031aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array;
10327a984708SDavid Chisnall    template <class> friend class __mask_expr;
1033aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array;
10347a984708SDavid Chisnall    template <class> friend class __indirect_expr;
10357a984708SDavid Chisnall    template <class> friend class __val_expr;
10367a984708SDavid Chisnall
10377a984708SDavid Chisnall    template <class _Up>
10387a984708SDavid Chisnall    friend
10397a984708SDavid Chisnall    _Up*
10407a984708SDavid Chisnall    begin(valarray<_Up>& __v);
10417a984708SDavid Chisnall
10427a984708SDavid Chisnall    template <class _Up>
10437a984708SDavid Chisnall    friend
10447a984708SDavid Chisnall    const _Up*
10457a984708SDavid Chisnall    begin(const valarray<_Up>& __v);
10467a984708SDavid Chisnall
10477a984708SDavid Chisnall    template <class _Up>
10487a984708SDavid Chisnall    friend
10497a984708SDavid Chisnall    _Up*
10507a984708SDavid Chisnall    end(valarray<_Up>& __v);
10517a984708SDavid Chisnall
10527a984708SDavid Chisnall    template <class _Up>
10537a984708SDavid Chisnall    friend
10547a984708SDavid Chisnall    const _Up*
10557a984708SDavid Chisnall    end(const valarray<_Up>& __v);
10564ba319b5SDimitry Andric
1057*b5893f02SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
1058*b5893f02SDimitry Andric    void __clear(size_t __capacity);
10594ba319b5SDimitry Andric    valarray& __assign_range(const value_type* __f, const value_type* __l);
10607a984708SDavid Chisnall};
10617a984708SDavid Chisnall
10624f7ab58eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t))
10634f7ab58eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray())
10644f7ab58eSDimitry Andric_LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t))
10654f7ab58eSDimitry Andric
10667a984708SDavid Chisnalltemplate <class _Op, class _Tp>
10677a984708SDavid Chisnallstruct _UnaryOp<_Op, valarray<_Tp> >
10687a984708SDavid Chisnall{
10697a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
10707a984708SDavid Chisnall    typedef _Tp value_type;
10717a984708SDavid Chisnall
10727a984708SDavid Chisnall    _Op __op_;
10737a984708SDavid Chisnall    const valarray<_Tp>& __a0_;
10747a984708SDavid Chisnall
10757a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
10767a984708SDavid Chisnall    _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {}
10777a984708SDavid Chisnall
10787a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
10797a984708SDavid Chisnall    result_type operator[](size_t __i) const {return __op_(__a0_[__i]);}
10807a984708SDavid Chisnall
10817a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
10827a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
10837a984708SDavid Chisnall};
10847a984708SDavid Chisnall
10857a984708SDavid Chisnalltemplate <class _Op, class _Tp, class _A1>
10867a984708SDavid Chisnallstruct _BinaryOp<_Op, valarray<_Tp>, _A1>
10877a984708SDavid Chisnall{
10887a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
10897a984708SDavid Chisnall    typedef _Tp value_type;
10907a984708SDavid Chisnall
10917a984708SDavid Chisnall    _Op __op_;
10927a984708SDavid Chisnall    const valarray<_Tp>& __a0_;
10937a984708SDavid Chisnall    _A1 __a1_;
10947a984708SDavid Chisnall
10957a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
10967a984708SDavid Chisnall    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1)
10977a984708SDavid Chisnall        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
10987a984708SDavid Chisnall
10997a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11007a984708SDavid Chisnall    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11017a984708SDavid Chisnall
11027a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11037a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
11047a984708SDavid Chisnall};
11057a984708SDavid Chisnall
11067a984708SDavid Chisnalltemplate <class _Op, class _A0, class _Tp>
11077a984708SDavid Chisnallstruct _BinaryOp<_Op, _A0, valarray<_Tp> >
11087a984708SDavid Chisnall{
11097a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
11107a984708SDavid Chisnall    typedef _Tp value_type;
11117a984708SDavid Chisnall
11127a984708SDavid Chisnall    _Op __op_;
11137a984708SDavid Chisnall    _A0 __a0_;
11147a984708SDavid Chisnall    const valarray<_Tp>& __a1_;
11157a984708SDavid Chisnall
11167a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11177a984708SDavid Chisnall    _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1)
11187a984708SDavid Chisnall        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
11197a984708SDavid Chisnall
11207a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11217a984708SDavid Chisnall    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11227a984708SDavid Chisnall
11237a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11247a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
11257a984708SDavid Chisnall};
11267a984708SDavid Chisnall
11277a984708SDavid Chisnalltemplate <class _Op, class _Tp>
11287a984708SDavid Chisnallstruct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> >
11297a984708SDavid Chisnall{
11307a984708SDavid Chisnall    typedef typename _Op::result_type result_type;
11317a984708SDavid Chisnall    typedef _Tp value_type;
11327a984708SDavid Chisnall
11337a984708SDavid Chisnall    _Op __op_;
11347a984708SDavid Chisnall    const valarray<_Tp>& __a0_;
11357a984708SDavid Chisnall    const valarray<_Tp>& __a1_;
11367a984708SDavid Chisnall
11377a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11387a984708SDavid Chisnall    _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1)
11397a984708SDavid Chisnall        : __op_(__op), __a0_(__a0), __a1_(__a1) {}
11407a984708SDavid Chisnall
11417a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11427a984708SDavid Chisnall    value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);}
11437a984708SDavid Chisnall
11447a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
11457a984708SDavid Chisnall    size_t size() const {return __a0_.size();}
11467a984708SDavid Chisnall};
11477a984708SDavid Chisnall
11487a984708SDavid Chisnall// slice_array
11497a984708SDavid Chisnall
11507a984708SDavid Chisnalltemplate <class _Tp>
1151aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS slice_array
11527a984708SDavid Chisnall{
11537a984708SDavid Chisnallpublic:
11547a984708SDavid Chisnall    typedef _Tp value_type;
11557a984708SDavid Chisnall
11567a984708SDavid Chisnallprivate:
11577a984708SDavid Chisnall    value_type* __vp_;
11587a984708SDavid Chisnall    size_t __size_;
11597a984708SDavid Chisnall    size_t __stride_;
11607a984708SDavid Chisnall
11617a984708SDavid Chisnallpublic:
11627a984708SDavid Chisnall    template <class _Expr>
11637a984708SDavid Chisnall    typename enable_if
11647a984708SDavid Chisnall    <
11657a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
11667a984708SDavid Chisnall        void
11677a984708SDavid Chisnall    >::type
11689729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11697a984708SDavid Chisnall    operator=(const _Expr& __v) const;
11707a984708SDavid Chisnall
11717a984708SDavid Chisnall    template <class _Expr>
11727a984708SDavid Chisnall    typename enable_if
11737a984708SDavid Chisnall    <
11747a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
11757a984708SDavid Chisnall        void
11767a984708SDavid Chisnall    >::type
11779729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11787a984708SDavid Chisnall    operator*=(const _Expr& __v) const;
11797a984708SDavid Chisnall
11807a984708SDavid Chisnall    template <class _Expr>
11817a984708SDavid Chisnall    typename enable_if
11827a984708SDavid Chisnall    <
11837a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
11847a984708SDavid Chisnall        void
11857a984708SDavid Chisnall    >::type
11869729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11877a984708SDavid Chisnall    operator/=(const _Expr& __v) const;
11887a984708SDavid Chisnall
11897a984708SDavid Chisnall    template <class _Expr>
11907a984708SDavid Chisnall    typename enable_if
11917a984708SDavid Chisnall    <
11927a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
11937a984708SDavid Chisnall        void
11947a984708SDavid Chisnall    >::type
11959729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
11967a984708SDavid Chisnall    operator%=(const _Expr& __v) const;
11977a984708SDavid Chisnall
11987a984708SDavid Chisnall    template <class _Expr>
11997a984708SDavid Chisnall    typename enable_if
12007a984708SDavid Chisnall    <
12017a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12027a984708SDavid Chisnall        void
12037a984708SDavid Chisnall    >::type
12049729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12057a984708SDavid Chisnall    operator+=(const _Expr& __v) const;
12067a984708SDavid Chisnall
12077a984708SDavid Chisnall    template <class _Expr>
12087a984708SDavid Chisnall    typename enable_if
12097a984708SDavid Chisnall    <
12107a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12117a984708SDavid Chisnall        void
12127a984708SDavid Chisnall    >::type
12139729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12147a984708SDavid Chisnall    operator-=(const _Expr& __v) const;
12157a984708SDavid Chisnall
12167a984708SDavid Chisnall    template <class _Expr>
12177a984708SDavid Chisnall    typename enable_if
12187a984708SDavid Chisnall    <
12197a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12207a984708SDavid Chisnall        void
12217a984708SDavid Chisnall    >::type
12229729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12237a984708SDavid Chisnall    operator^=(const _Expr& __v) const;
12247a984708SDavid Chisnall
12257a984708SDavid Chisnall    template <class _Expr>
12267a984708SDavid Chisnall    typename enable_if
12277a984708SDavid Chisnall    <
12287a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12297a984708SDavid Chisnall        void
12307a984708SDavid Chisnall    >::type
12319729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12327a984708SDavid Chisnall    operator&=(const _Expr& __v) const;
12337a984708SDavid Chisnall
12347a984708SDavid Chisnall    template <class _Expr>
12357a984708SDavid Chisnall    typename enable_if
12367a984708SDavid Chisnall    <
12377a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12387a984708SDavid Chisnall        void
12397a984708SDavid Chisnall    >::type
12409729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12417a984708SDavid Chisnall    operator|=(const _Expr& __v) const;
12427a984708SDavid Chisnall
12437a984708SDavid Chisnall    template <class _Expr>
12447a984708SDavid Chisnall    typename enable_if
12457a984708SDavid Chisnall    <
12467a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12477a984708SDavid Chisnall        void
12487a984708SDavid Chisnall    >::type
12499729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12507a984708SDavid Chisnall    operator<<=(const _Expr& __v) const;
12517a984708SDavid Chisnall
12527a984708SDavid Chisnall    template <class _Expr>
12537a984708SDavid Chisnall    typename enable_if
12547a984708SDavid Chisnall    <
12557a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
12567a984708SDavid Chisnall        void
12577a984708SDavid Chisnall    >::type
12589729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12597a984708SDavid Chisnall    operator>>=(const _Expr& __v) const;
12607a984708SDavid Chisnall
12619729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12627a984708SDavid Chisnall    const slice_array& operator=(const slice_array& __sa) const;
12637a984708SDavid Chisnall
12649729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
12657a984708SDavid Chisnall    void operator=(const value_type& __x) const;
12667a984708SDavid Chisnall
12677a984708SDavid Chisnallprivate:
12687a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
12697a984708SDavid Chisnall    slice_array(const slice& __sl, const valarray<value_type>& __v)
12707a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())),
12717a984708SDavid Chisnall          __size_(__sl.size()),
12727a984708SDavid Chisnall          __stride_(__sl.stride())
12737a984708SDavid Chisnall        {}
12747a984708SDavid Chisnall
12757a984708SDavid Chisnall    template <class> friend class valarray;
12767a984708SDavid Chisnall    template <class> friend class sliceExpr;
12777a984708SDavid Chisnall};
12787a984708SDavid Chisnall
12797a984708SDavid Chisnalltemplate <class _Tp>
12809729cf09SDimitry Andricinline
12817a984708SDavid Chisnallconst slice_array<_Tp>&
12827a984708SDavid Chisnallslice_array<_Tp>::operator=(const slice_array& __sa) const
12837a984708SDavid Chisnall{
12847a984708SDavid Chisnall    value_type* __t = __vp_;
12857a984708SDavid Chisnall    const value_type* __s = __sa.__vp_;
12867a984708SDavid Chisnall    for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_)
12877a984708SDavid Chisnall        *__t = *__s;
1288d72607e9SDimitry Andric    return *this;
12897a984708SDavid Chisnall}
12907a984708SDavid Chisnall
12917a984708SDavid Chisnalltemplate <class _Tp>
12927a984708SDavid Chisnalltemplate <class _Expr>
12939729cf09SDimitry Andricinline
12947a984708SDavid Chisnalltypename enable_if
12957a984708SDavid Chisnall<
12967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
12977a984708SDavid Chisnall    void
12987a984708SDavid Chisnall>::type
12997a984708SDavid Chisnallslice_array<_Tp>::operator=(const _Expr& __v) const
13007a984708SDavid Chisnall{
13017a984708SDavid Chisnall    value_type* __t = __vp_;
13027a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13037a984708SDavid Chisnall        *__t = __v[__i];
13047a984708SDavid Chisnall}
13057a984708SDavid Chisnall
13067a984708SDavid Chisnalltemplate <class _Tp>
13077a984708SDavid Chisnalltemplate <class _Expr>
13089729cf09SDimitry Andricinline
13097a984708SDavid Chisnalltypename enable_if
13107a984708SDavid Chisnall<
13117a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13127a984708SDavid Chisnall    void
13137a984708SDavid Chisnall>::type
13147a984708SDavid Chisnallslice_array<_Tp>::operator*=(const _Expr& __v) const
13157a984708SDavid Chisnall{
13167a984708SDavid Chisnall    value_type* __t = __vp_;
13177a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13187a984708SDavid Chisnall        *__t *= __v[__i];
13197a984708SDavid Chisnall}
13207a984708SDavid Chisnall
13217a984708SDavid Chisnalltemplate <class _Tp>
13227a984708SDavid Chisnalltemplate <class _Expr>
13239729cf09SDimitry Andricinline
13247a984708SDavid Chisnalltypename enable_if
13257a984708SDavid Chisnall<
13267a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13277a984708SDavid Chisnall    void
13287a984708SDavid Chisnall>::type
13297a984708SDavid Chisnallslice_array<_Tp>::operator/=(const _Expr& __v) const
13307a984708SDavid Chisnall{
13317a984708SDavid Chisnall    value_type* __t = __vp_;
13327a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13337a984708SDavid Chisnall        *__t /= __v[__i];
13347a984708SDavid Chisnall}
13357a984708SDavid Chisnall
13367a984708SDavid Chisnalltemplate <class _Tp>
13377a984708SDavid Chisnalltemplate <class _Expr>
13389729cf09SDimitry Andricinline
13397a984708SDavid Chisnalltypename enable_if
13407a984708SDavid Chisnall<
13417a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13427a984708SDavid Chisnall    void
13437a984708SDavid Chisnall>::type
13447a984708SDavid Chisnallslice_array<_Tp>::operator%=(const _Expr& __v) const
13457a984708SDavid Chisnall{
13467a984708SDavid Chisnall    value_type* __t = __vp_;
13477a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13487a984708SDavid Chisnall        *__t %= __v[__i];
13497a984708SDavid Chisnall}
13507a984708SDavid Chisnall
13517a984708SDavid Chisnalltemplate <class _Tp>
13527a984708SDavid Chisnalltemplate <class _Expr>
13539729cf09SDimitry Andricinline
13547a984708SDavid Chisnalltypename enable_if
13557a984708SDavid Chisnall<
13567a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13577a984708SDavid Chisnall    void
13587a984708SDavid Chisnall>::type
13597a984708SDavid Chisnallslice_array<_Tp>::operator+=(const _Expr& __v) const
13607a984708SDavid Chisnall{
13617a984708SDavid Chisnall    value_type* __t = __vp_;
13627a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13637a984708SDavid Chisnall        *__t += __v[__i];
13647a984708SDavid Chisnall}
13657a984708SDavid Chisnall
13667a984708SDavid Chisnalltemplate <class _Tp>
13677a984708SDavid Chisnalltemplate <class _Expr>
13689729cf09SDimitry Andricinline
13697a984708SDavid Chisnalltypename enable_if
13707a984708SDavid Chisnall<
13717a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13727a984708SDavid Chisnall    void
13737a984708SDavid Chisnall>::type
13747a984708SDavid Chisnallslice_array<_Tp>::operator-=(const _Expr& __v) const
13757a984708SDavid Chisnall{
13767a984708SDavid Chisnall    value_type* __t = __vp_;
13777a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13787a984708SDavid Chisnall        *__t -= __v[__i];
13797a984708SDavid Chisnall}
13807a984708SDavid Chisnall
13817a984708SDavid Chisnalltemplate <class _Tp>
13827a984708SDavid Chisnalltemplate <class _Expr>
13839729cf09SDimitry Andricinline
13847a984708SDavid Chisnalltypename enable_if
13857a984708SDavid Chisnall<
13867a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
13877a984708SDavid Chisnall    void
13887a984708SDavid Chisnall>::type
13897a984708SDavid Chisnallslice_array<_Tp>::operator^=(const _Expr& __v) const
13907a984708SDavid Chisnall{
13917a984708SDavid Chisnall    value_type* __t = __vp_;
13927a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
13937a984708SDavid Chisnall        *__t ^= __v[__i];
13947a984708SDavid Chisnall}
13957a984708SDavid Chisnall
13967a984708SDavid Chisnalltemplate <class _Tp>
13977a984708SDavid Chisnalltemplate <class _Expr>
13989729cf09SDimitry Andricinline
13997a984708SDavid Chisnalltypename enable_if
14007a984708SDavid Chisnall<
14017a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
14027a984708SDavid Chisnall    void
14037a984708SDavid Chisnall>::type
14047a984708SDavid Chisnallslice_array<_Tp>::operator&=(const _Expr& __v) const
14057a984708SDavid Chisnall{
14067a984708SDavid Chisnall    value_type* __t = __vp_;
14077a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14087a984708SDavid Chisnall        *__t &= __v[__i];
14097a984708SDavid Chisnall}
14107a984708SDavid Chisnall
14117a984708SDavid Chisnalltemplate <class _Tp>
14127a984708SDavid Chisnalltemplate <class _Expr>
14139729cf09SDimitry Andricinline
14147a984708SDavid Chisnalltypename enable_if
14157a984708SDavid Chisnall<
14167a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
14177a984708SDavid Chisnall    void
14187a984708SDavid Chisnall>::type
14197a984708SDavid Chisnallslice_array<_Tp>::operator|=(const _Expr& __v) const
14207a984708SDavid Chisnall{
14217a984708SDavid Chisnall    value_type* __t = __vp_;
14227a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14237a984708SDavid Chisnall        *__t |= __v[__i];
14247a984708SDavid Chisnall}
14257a984708SDavid Chisnall
14267a984708SDavid Chisnalltemplate <class _Tp>
14277a984708SDavid Chisnalltemplate <class _Expr>
14289729cf09SDimitry Andricinline
14297a984708SDavid Chisnalltypename enable_if
14307a984708SDavid Chisnall<
14317a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
14327a984708SDavid Chisnall    void
14337a984708SDavid Chisnall>::type
14347a984708SDavid Chisnallslice_array<_Tp>::operator<<=(const _Expr& __v) const
14357a984708SDavid Chisnall{
14367a984708SDavid Chisnall    value_type* __t = __vp_;
14377a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14387a984708SDavid Chisnall        *__t <<= __v[__i];
14397a984708SDavid Chisnall}
14407a984708SDavid Chisnall
14417a984708SDavid Chisnalltemplate <class _Tp>
14427a984708SDavid Chisnalltemplate <class _Expr>
14439729cf09SDimitry Andricinline
14447a984708SDavid Chisnalltypename enable_if
14457a984708SDavid Chisnall<
14467a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
14477a984708SDavid Chisnall    void
14487a984708SDavid Chisnall>::type
14497a984708SDavid Chisnallslice_array<_Tp>::operator>>=(const _Expr& __v) const
14507a984708SDavid Chisnall{
14517a984708SDavid Chisnall    value_type* __t = __vp_;
14527a984708SDavid Chisnall    for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_)
14537a984708SDavid Chisnall        *__t >>= __v[__i];
14547a984708SDavid Chisnall}
14557a984708SDavid Chisnall
14567a984708SDavid Chisnalltemplate <class _Tp>
14579729cf09SDimitry Andricinline
14587a984708SDavid Chisnallvoid
14597a984708SDavid Chisnallslice_array<_Tp>::operator=(const value_type& __x) const
14607a984708SDavid Chisnall{
14617a984708SDavid Chisnall    value_type* __t = __vp_;
14627a984708SDavid Chisnall    for (size_t __n = __size_; __n; --__n, __t += __stride_)
14637a984708SDavid Chisnall        *__t = __x;
14647a984708SDavid Chisnall}
14657a984708SDavid Chisnall
14667a984708SDavid Chisnall// gslice
14677a984708SDavid Chisnall
14681bf9f7c1SDimitry Andricclass _LIBCPP_TYPE_VIS gslice
14697a984708SDavid Chisnall{
14707a984708SDavid Chisnall    valarray<size_t> __size_;
14717a984708SDavid Chisnall    valarray<size_t> __stride_;
14727a984708SDavid Chisnall    valarray<size_t> __1d_;
14737a984708SDavid Chisnall
14747a984708SDavid Chisnallpublic:
14757a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
14767a984708SDavid Chisnall    gslice() {}
14777a984708SDavid Chisnall
14787a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
14797a984708SDavid Chisnall    gslice(size_t __start, const valarray<size_t>& __size,
14807a984708SDavid Chisnall                           const valarray<size_t>& __stride)
14817a984708SDavid Chisnall        : __size_(__size),
14827a984708SDavid Chisnall          __stride_(__stride)
14837a984708SDavid Chisnall        {__init(__start);}
14847a984708SDavid Chisnall
1485540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
14867a984708SDavid Chisnall
14877a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
14887a984708SDavid Chisnall    gslice(size_t __start, const valarray<size_t>&  __size,
14897a984708SDavid Chisnall                                 valarray<size_t>&& __stride)
14907a984708SDavid Chisnall        : __size_(__size),
14917a984708SDavid Chisnall          __stride_(move(__stride))
14927a984708SDavid Chisnall        {__init(__start);}
14937a984708SDavid Chisnall
14947a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
14957a984708SDavid Chisnall    gslice(size_t __start,       valarray<size_t>&& __size,
14967a984708SDavid Chisnall                           const valarray<size_t>&  __stride)
14977a984708SDavid Chisnall        : __size_(move(__size)),
14987a984708SDavid Chisnall          __stride_(__stride)
14997a984708SDavid Chisnall        {__init(__start);}
15007a984708SDavid Chisnall
15017a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
15027a984708SDavid Chisnall    gslice(size_t __start,       valarray<size_t>&& __size,
15037a984708SDavid Chisnall                                 valarray<size_t>&& __stride)
15047a984708SDavid Chisnall        : __size_(move(__size)),
15057a984708SDavid Chisnall          __stride_(move(__stride))
15067a984708SDavid Chisnall        {__init(__start);}
15077a984708SDavid Chisnall
1508540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
15097a984708SDavid Chisnall
15107a984708SDavid Chisnall//  gslice(const gslice&)            = default;
15117a984708SDavid Chisnall//  gslice(gslice&&)                 = default;
15127a984708SDavid Chisnall//  gslice& operator=(const gslice&) = default;
15137a984708SDavid Chisnall//  gslice& operator=(gslice&&)      = default;
15147a984708SDavid Chisnall
15157a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
15167a984708SDavid Chisnall    size_t           start()  const {return __1d_.size() ? __1d_[0] : 0;}
15177a984708SDavid Chisnall
15187a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
15197a984708SDavid Chisnall    valarray<size_t> size()   const {return __size_;}
15207a984708SDavid Chisnall
15217a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
15227a984708SDavid Chisnall    valarray<size_t> stride() const {return __stride_;}
15237a984708SDavid Chisnall
15247a984708SDavid Chisnallprivate:
15257a984708SDavid Chisnall    void __init(size_t __start);
15267a984708SDavid Chisnall
15277a984708SDavid Chisnall    template <class> friend class gslice_array;
15287a984708SDavid Chisnall    template <class> friend class valarray;
15297a984708SDavid Chisnall    template <class> friend class __val_expr;
15307a984708SDavid Chisnall};
15317a984708SDavid Chisnall
15327a984708SDavid Chisnall// gslice_array
15337a984708SDavid Chisnall
15347a984708SDavid Chisnalltemplate <class _Tp>
1535aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS gslice_array
15367a984708SDavid Chisnall{
15377a984708SDavid Chisnallpublic:
15387a984708SDavid Chisnall    typedef _Tp value_type;
15397a984708SDavid Chisnall
15407a984708SDavid Chisnallprivate:
15417a984708SDavid Chisnall    value_type*      __vp_;
15427a984708SDavid Chisnall    valarray<size_t> __1d_;
15437a984708SDavid Chisnall
15447a984708SDavid Chisnallpublic:
15457a984708SDavid Chisnall    template <class _Expr>
15467a984708SDavid Chisnall    typename enable_if
15477a984708SDavid Chisnall    <
15487a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15497a984708SDavid Chisnall        void
15507a984708SDavid Chisnall    >::type
15519729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15527a984708SDavid Chisnall    operator=(const _Expr& __v) const;
15537a984708SDavid Chisnall
15547a984708SDavid Chisnall    template <class _Expr>
15557a984708SDavid Chisnall    typename enable_if
15567a984708SDavid Chisnall    <
15577a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15587a984708SDavid Chisnall        void
15597a984708SDavid Chisnall    >::type
15609729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15617a984708SDavid Chisnall    operator*=(const _Expr& __v) const;
15627a984708SDavid Chisnall
15637a984708SDavid Chisnall    template <class _Expr>
15647a984708SDavid Chisnall    typename enable_if
15657a984708SDavid Chisnall    <
15667a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15677a984708SDavid Chisnall        void
15687a984708SDavid Chisnall    >::type
15699729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15707a984708SDavid Chisnall    operator/=(const _Expr& __v) const;
15717a984708SDavid Chisnall
15727a984708SDavid Chisnall    template <class _Expr>
15737a984708SDavid Chisnall    typename enable_if
15747a984708SDavid Chisnall    <
15757a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15767a984708SDavid Chisnall        void
15777a984708SDavid Chisnall    >::type
15789729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15797a984708SDavid Chisnall    operator%=(const _Expr& __v) const;
15807a984708SDavid Chisnall
15817a984708SDavid Chisnall    template <class _Expr>
15827a984708SDavid Chisnall    typename enable_if
15837a984708SDavid Chisnall    <
15847a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15857a984708SDavid Chisnall        void
15867a984708SDavid Chisnall    >::type
15879729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15887a984708SDavid Chisnall    operator+=(const _Expr& __v) const;
15897a984708SDavid Chisnall
15907a984708SDavid Chisnall    template <class _Expr>
15917a984708SDavid Chisnall    typename enable_if
15927a984708SDavid Chisnall    <
15937a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
15947a984708SDavid Chisnall        void
15957a984708SDavid Chisnall    >::type
15969729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
15977a984708SDavid Chisnall    operator-=(const _Expr& __v) const;
15987a984708SDavid Chisnall
15997a984708SDavid Chisnall    template <class _Expr>
16007a984708SDavid Chisnall    typename enable_if
16017a984708SDavid Chisnall    <
16027a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
16037a984708SDavid Chisnall        void
16047a984708SDavid Chisnall    >::type
16059729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16067a984708SDavid Chisnall    operator^=(const _Expr& __v) const;
16077a984708SDavid Chisnall
16087a984708SDavid Chisnall    template <class _Expr>
16097a984708SDavid Chisnall    typename enable_if
16107a984708SDavid Chisnall    <
16117a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
16127a984708SDavid Chisnall        void
16137a984708SDavid Chisnall    >::type
16149729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16157a984708SDavid Chisnall    operator&=(const _Expr& __v) const;
16167a984708SDavid Chisnall
16177a984708SDavid Chisnall    template <class _Expr>
16187a984708SDavid Chisnall    typename enable_if
16197a984708SDavid Chisnall    <
16207a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
16217a984708SDavid Chisnall        void
16227a984708SDavid Chisnall    >::type
16239729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16247a984708SDavid Chisnall    operator|=(const _Expr& __v) const;
16257a984708SDavid Chisnall
16267a984708SDavid Chisnall    template <class _Expr>
16277a984708SDavid Chisnall    typename enable_if
16287a984708SDavid Chisnall    <
16297a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
16307a984708SDavid Chisnall        void
16317a984708SDavid Chisnall    >::type
16329729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16337a984708SDavid Chisnall    operator<<=(const _Expr& __v) const;
16347a984708SDavid Chisnall
16357a984708SDavid Chisnall    template <class _Expr>
16367a984708SDavid Chisnall    typename enable_if
16377a984708SDavid Chisnall    <
16387a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
16397a984708SDavid Chisnall        void
16407a984708SDavid Chisnall    >::type
16419729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16427a984708SDavid Chisnall    operator>>=(const _Expr& __v) const;
16437a984708SDavid Chisnall
16449729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16457a984708SDavid Chisnall    const gslice_array& operator=(const gslice_array& __ga) const;
16467a984708SDavid Chisnall
16479729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
16487a984708SDavid Chisnall    void operator=(const value_type& __x) const;
16497a984708SDavid Chisnall
16507a984708SDavid Chisnall//  gslice_array(const gslice_array&)            = default;
16517a984708SDavid Chisnall//  gslice_array(gslice_array&&)                 = default;
16527a984708SDavid Chisnall//  gslice_array& operator=(const gslice_array&) = default;
16537a984708SDavid Chisnall//  gslice_array& operator=(gslice_array&&)      = default;
16547a984708SDavid Chisnall
16557a984708SDavid Chisnallprivate:
16567a984708SDavid Chisnall    gslice_array(const gslice& __gs, const valarray<value_type>& __v)
16577a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_)),
16587a984708SDavid Chisnall          __1d_(__gs.__1d_)
16597a984708SDavid Chisnall        {}
16607a984708SDavid Chisnall
1661540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
16627a984708SDavid Chisnall    gslice_array(gslice&& __gs, const valarray<value_type>& __v)
16637a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_)),
16647a984708SDavid Chisnall          __1d_(move(__gs.__1d_))
16657a984708SDavid Chisnall        {}
1666540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
16677a984708SDavid Chisnall
16687a984708SDavid Chisnall    template <class> friend class valarray;
16697a984708SDavid Chisnall};
16707a984708SDavid Chisnall
16717a984708SDavid Chisnalltemplate <class _Tp>
16727a984708SDavid Chisnalltemplate <class _Expr>
16739729cf09SDimitry Andricinline
16747a984708SDavid Chisnalltypename enable_if
16757a984708SDavid Chisnall<
16767a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
16777a984708SDavid Chisnall    void
16787a984708SDavid Chisnall>::type
16797a984708SDavid Chisnallgslice_array<_Tp>::operator=(const _Expr& __v) const
16807a984708SDavid Chisnall{
16817a984708SDavid Chisnall    typedef const size_t* _Ip;
16827a984708SDavid Chisnall    size_t __j = 0;
16837a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
16847a984708SDavid Chisnall        __vp_[*__i] = __v[__j];
16857a984708SDavid Chisnall}
16867a984708SDavid Chisnall
16877a984708SDavid Chisnalltemplate <class _Tp>
16887a984708SDavid Chisnalltemplate <class _Expr>
16899729cf09SDimitry Andricinline
16907a984708SDavid Chisnalltypename enable_if
16917a984708SDavid Chisnall<
16927a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
16937a984708SDavid Chisnall    void
16947a984708SDavid Chisnall>::type
16957a984708SDavid Chisnallgslice_array<_Tp>::operator*=(const _Expr& __v) const
16967a984708SDavid Chisnall{
16977a984708SDavid Chisnall    typedef const size_t* _Ip;
16987a984708SDavid Chisnall    size_t __j = 0;
16997a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17007a984708SDavid Chisnall        __vp_[*__i] *= __v[__j];
17017a984708SDavid Chisnall}
17027a984708SDavid Chisnall
17037a984708SDavid Chisnalltemplate <class _Tp>
17047a984708SDavid Chisnalltemplate <class _Expr>
17059729cf09SDimitry Andricinline
17067a984708SDavid Chisnalltypename enable_if
17077a984708SDavid Chisnall<
17087a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17097a984708SDavid Chisnall    void
17107a984708SDavid Chisnall>::type
17117a984708SDavid Chisnallgslice_array<_Tp>::operator/=(const _Expr& __v) const
17127a984708SDavid Chisnall{
17137a984708SDavid Chisnall    typedef const size_t* _Ip;
17147a984708SDavid Chisnall    size_t __j = 0;
17157a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17167a984708SDavid Chisnall        __vp_[*__i] /= __v[__j];
17177a984708SDavid Chisnall}
17187a984708SDavid Chisnall
17197a984708SDavid Chisnalltemplate <class _Tp>
17207a984708SDavid Chisnalltemplate <class _Expr>
17219729cf09SDimitry Andricinline
17227a984708SDavid Chisnalltypename enable_if
17237a984708SDavid Chisnall<
17247a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17257a984708SDavid Chisnall    void
17267a984708SDavid Chisnall>::type
17277a984708SDavid Chisnallgslice_array<_Tp>::operator%=(const _Expr& __v) const
17287a984708SDavid Chisnall{
17297a984708SDavid Chisnall    typedef const size_t* _Ip;
17307a984708SDavid Chisnall    size_t __j = 0;
17317a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17327a984708SDavid Chisnall        __vp_[*__i] %= __v[__j];
17337a984708SDavid Chisnall}
17347a984708SDavid Chisnall
17357a984708SDavid Chisnalltemplate <class _Tp>
17367a984708SDavid Chisnalltemplate <class _Expr>
17379729cf09SDimitry Andricinline
17387a984708SDavid Chisnalltypename enable_if
17397a984708SDavid Chisnall<
17407a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17417a984708SDavid Chisnall    void
17427a984708SDavid Chisnall>::type
17437a984708SDavid Chisnallgslice_array<_Tp>::operator+=(const _Expr& __v) const
17447a984708SDavid Chisnall{
17457a984708SDavid Chisnall    typedef const size_t* _Ip;
17467a984708SDavid Chisnall    size_t __j = 0;
17477a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17487a984708SDavid Chisnall        __vp_[*__i] += __v[__j];
17497a984708SDavid Chisnall}
17507a984708SDavid Chisnall
17517a984708SDavid Chisnalltemplate <class _Tp>
17527a984708SDavid Chisnalltemplate <class _Expr>
17539729cf09SDimitry Andricinline
17547a984708SDavid Chisnalltypename enable_if
17557a984708SDavid Chisnall<
17567a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17577a984708SDavid Chisnall    void
17587a984708SDavid Chisnall>::type
17597a984708SDavid Chisnallgslice_array<_Tp>::operator-=(const _Expr& __v) const
17607a984708SDavid Chisnall{
17617a984708SDavid Chisnall    typedef const size_t* _Ip;
17627a984708SDavid Chisnall    size_t __j = 0;
17637a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17647a984708SDavid Chisnall        __vp_[*__i] -= __v[__j];
17657a984708SDavid Chisnall}
17667a984708SDavid Chisnall
17677a984708SDavid Chisnalltemplate <class _Tp>
17687a984708SDavid Chisnalltemplate <class _Expr>
17699729cf09SDimitry Andricinline
17707a984708SDavid Chisnalltypename enable_if
17717a984708SDavid Chisnall<
17727a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17737a984708SDavid Chisnall    void
17747a984708SDavid Chisnall>::type
17757a984708SDavid Chisnallgslice_array<_Tp>::operator^=(const _Expr& __v) const
17767a984708SDavid Chisnall{
17777a984708SDavid Chisnall    typedef const size_t* _Ip;
17787a984708SDavid Chisnall    size_t __j = 0;
17797a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17807a984708SDavid Chisnall        __vp_[*__i] ^= __v[__j];
17817a984708SDavid Chisnall}
17827a984708SDavid Chisnall
17837a984708SDavid Chisnalltemplate <class _Tp>
17847a984708SDavid Chisnalltemplate <class _Expr>
17859729cf09SDimitry Andricinline
17867a984708SDavid Chisnalltypename enable_if
17877a984708SDavid Chisnall<
17887a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
17897a984708SDavid Chisnall    void
17907a984708SDavid Chisnall>::type
17917a984708SDavid Chisnallgslice_array<_Tp>::operator&=(const _Expr& __v) const
17927a984708SDavid Chisnall{
17937a984708SDavid Chisnall    typedef const size_t* _Ip;
17947a984708SDavid Chisnall    size_t __j = 0;
17957a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
17967a984708SDavid Chisnall        __vp_[*__i] &= __v[__j];
17977a984708SDavid Chisnall}
17987a984708SDavid Chisnall
17997a984708SDavid Chisnalltemplate <class _Tp>
18007a984708SDavid Chisnalltemplate <class _Expr>
18019729cf09SDimitry Andricinline
18027a984708SDavid Chisnalltypename enable_if
18037a984708SDavid Chisnall<
18047a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
18057a984708SDavid Chisnall    void
18067a984708SDavid Chisnall>::type
18077a984708SDavid Chisnallgslice_array<_Tp>::operator|=(const _Expr& __v) const
18087a984708SDavid Chisnall{
18097a984708SDavid Chisnall    typedef const size_t* _Ip;
18107a984708SDavid Chisnall    size_t __j = 0;
18117a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18127a984708SDavid Chisnall        __vp_[*__i] |= __v[__j];
18137a984708SDavid Chisnall}
18147a984708SDavid Chisnall
18157a984708SDavid Chisnalltemplate <class _Tp>
18167a984708SDavid Chisnalltemplate <class _Expr>
18179729cf09SDimitry Andricinline
18187a984708SDavid Chisnalltypename enable_if
18197a984708SDavid Chisnall<
18207a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
18217a984708SDavid Chisnall    void
18227a984708SDavid Chisnall>::type
18237a984708SDavid Chisnallgslice_array<_Tp>::operator<<=(const _Expr& __v) const
18247a984708SDavid Chisnall{
18257a984708SDavid Chisnall    typedef const size_t* _Ip;
18267a984708SDavid Chisnall    size_t __j = 0;
18277a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18287a984708SDavid Chisnall        __vp_[*__i] <<= __v[__j];
18297a984708SDavid Chisnall}
18307a984708SDavid Chisnall
18317a984708SDavid Chisnalltemplate <class _Tp>
18327a984708SDavid Chisnalltemplate <class _Expr>
18339729cf09SDimitry Andricinline
18347a984708SDavid Chisnalltypename enable_if
18357a984708SDavid Chisnall<
18367a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
18377a984708SDavid Chisnall    void
18387a984708SDavid Chisnall>::type
18397a984708SDavid Chisnallgslice_array<_Tp>::operator>>=(const _Expr& __v) const
18407a984708SDavid Chisnall{
18417a984708SDavid Chisnall    typedef const size_t* _Ip;
18427a984708SDavid Chisnall    size_t __j = 0;
18437a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j)
18447a984708SDavid Chisnall        __vp_[*__i] >>= __v[__j];
18457a984708SDavid Chisnall}
18467a984708SDavid Chisnall
18477a984708SDavid Chisnalltemplate <class _Tp>
18489729cf09SDimitry Andricinline
18497a984708SDavid Chisnallconst gslice_array<_Tp>&
18507a984708SDavid Chisnallgslice_array<_Tp>::operator=(const gslice_array& __ga) const
18517a984708SDavid Chisnall{
18527a984708SDavid Chisnall    typedef const size_t* _Ip;
18537a984708SDavid Chisnall    const value_type* __s = __ga.__vp_;
18547a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_;
18557a984708SDavid Chisnall            __i != __e; ++__i, ++__j)
18567a984708SDavid Chisnall        __vp_[*__i] = __s[*__j];
18577a984708SDavid Chisnall    return *this;
18587a984708SDavid Chisnall}
18597a984708SDavid Chisnall
18607a984708SDavid Chisnalltemplate <class _Tp>
18619729cf09SDimitry Andricinline
18627a984708SDavid Chisnallvoid
18637a984708SDavid Chisnallgslice_array<_Tp>::operator=(const value_type& __x) const
18647a984708SDavid Chisnall{
18657a984708SDavid Chisnall    typedef const size_t* _Ip;
18667a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
18677a984708SDavid Chisnall        __vp_[*__i] = __x;
18687a984708SDavid Chisnall}
18697a984708SDavid Chisnall
18707a984708SDavid Chisnall// mask_array
18717a984708SDavid Chisnall
18727a984708SDavid Chisnalltemplate <class _Tp>
1873aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS mask_array
18747a984708SDavid Chisnall{
18757a984708SDavid Chisnallpublic:
18767a984708SDavid Chisnall    typedef _Tp value_type;
18777a984708SDavid Chisnall
18787a984708SDavid Chisnallprivate:
18797a984708SDavid Chisnall    value_type*      __vp_;
18807a984708SDavid Chisnall    valarray<size_t> __1d_;
18817a984708SDavid Chisnall
18827a984708SDavid Chisnallpublic:
18837a984708SDavid Chisnall    template <class _Expr>
18847a984708SDavid Chisnall    typename enable_if
18857a984708SDavid Chisnall    <
18867a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
18877a984708SDavid Chisnall        void
18887a984708SDavid Chisnall    >::type
18899729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
18907a984708SDavid Chisnall    operator=(const _Expr& __v) const;
18917a984708SDavid Chisnall
18927a984708SDavid Chisnall    template <class _Expr>
18937a984708SDavid Chisnall    typename enable_if
18947a984708SDavid Chisnall    <
18957a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
18967a984708SDavid Chisnall        void
18977a984708SDavid Chisnall    >::type
18989729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
18997a984708SDavid Chisnall    operator*=(const _Expr& __v) const;
19007a984708SDavid Chisnall
19017a984708SDavid Chisnall    template <class _Expr>
19027a984708SDavid Chisnall    typename enable_if
19037a984708SDavid Chisnall    <
19047a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19057a984708SDavid Chisnall        void
19067a984708SDavid Chisnall    >::type
19079729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19087a984708SDavid Chisnall    operator/=(const _Expr& __v) const;
19097a984708SDavid Chisnall
19107a984708SDavid Chisnall    template <class _Expr>
19117a984708SDavid Chisnall    typename enable_if
19127a984708SDavid Chisnall    <
19137a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19147a984708SDavid Chisnall        void
19157a984708SDavid Chisnall    >::type
19169729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19177a984708SDavid Chisnall    operator%=(const _Expr& __v) const;
19187a984708SDavid Chisnall
19197a984708SDavid Chisnall    template <class _Expr>
19207a984708SDavid Chisnall    typename enable_if
19217a984708SDavid Chisnall    <
19227a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19237a984708SDavid Chisnall        void
19247a984708SDavid Chisnall    >::type
19259729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19267a984708SDavid Chisnall    operator+=(const _Expr& __v) const;
19277a984708SDavid Chisnall
19287a984708SDavid Chisnall    template <class _Expr>
19297a984708SDavid Chisnall    typename enable_if
19307a984708SDavid Chisnall    <
19317a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19327a984708SDavid Chisnall        void
19337a984708SDavid Chisnall    >::type
19349729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19357a984708SDavid Chisnall    operator-=(const _Expr& __v) const;
19367a984708SDavid Chisnall
19377a984708SDavid Chisnall    template <class _Expr>
19387a984708SDavid Chisnall    typename enable_if
19397a984708SDavid Chisnall    <
19407a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19417a984708SDavid Chisnall        void
19427a984708SDavid Chisnall    >::type
19439729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19447a984708SDavid Chisnall    operator^=(const _Expr& __v) const;
19457a984708SDavid Chisnall
19467a984708SDavid Chisnall    template <class _Expr>
19477a984708SDavid Chisnall    typename enable_if
19487a984708SDavid Chisnall    <
19497a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19507a984708SDavid Chisnall        void
19517a984708SDavid Chisnall    >::type
19529729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19537a984708SDavid Chisnall    operator&=(const _Expr& __v) const;
19547a984708SDavid Chisnall
19557a984708SDavid Chisnall    template <class _Expr>
19567a984708SDavid Chisnall    typename enable_if
19577a984708SDavid Chisnall    <
19587a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19597a984708SDavid Chisnall        void
19607a984708SDavid Chisnall    >::type
19619729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19627a984708SDavid Chisnall    operator|=(const _Expr& __v) const;
19637a984708SDavid Chisnall
19647a984708SDavid Chisnall    template <class _Expr>
19657a984708SDavid Chisnall    typename enable_if
19667a984708SDavid Chisnall    <
19677a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19687a984708SDavid Chisnall        void
19697a984708SDavid Chisnall    >::type
19709729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19717a984708SDavid Chisnall    operator<<=(const _Expr& __v) const;
19727a984708SDavid Chisnall
19737a984708SDavid Chisnall    template <class _Expr>
19747a984708SDavid Chisnall    typename enable_if
19757a984708SDavid Chisnall    <
19767a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
19777a984708SDavid Chisnall        void
19787a984708SDavid Chisnall    >::type
19799729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19807a984708SDavid Chisnall    operator>>=(const _Expr& __v) const;
19817a984708SDavid Chisnall
19829729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19837a984708SDavid Chisnall    const mask_array& operator=(const mask_array& __ma) const;
19847a984708SDavid Chisnall
19859729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
19867a984708SDavid Chisnall    void operator=(const value_type& __x) const;
19877a984708SDavid Chisnall
19887a984708SDavid Chisnall//  mask_array(const mask_array&)            = default;
19897a984708SDavid Chisnall//  mask_array(mask_array&&)                 = default;
19907a984708SDavid Chisnall//  mask_array& operator=(const mask_array&) = default;
19917a984708SDavid Chisnall//  mask_array& operator=(mask_array&&)      = default;
19927a984708SDavid Chisnall
19937a984708SDavid Chisnallprivate:
19947a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
19957a984708SDavid Chisnall    mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v)
19967a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_)),
199794e3ee44SDavid Chisnall          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
19987a984708SDavid Chisnall          {
19997a984708SDavid Chisnall              size_t __j = 0;
20007a984708SDavid Chisnall              for (size_t __i = 0; __i < __vb.size(); ++__i)
20017a984708SDavid Chisnall                  if (__vb[__i])
20027a984708SDavid Chisnall                      __1d_[__j++] = __i;
20037a984708SDavid Chisnall          }
20047a984708SDavid Chisnall
20057a984708SDavid Chisnall    template <class> friend class valarray;
20067a984708SDavid Chisnall};
20077a984708SDavid Chisnall
20087a984708SDavid Chisnalltemplate <class _Tp>
20097a984708SDavid Chisnalltemplate <class _Expr>
20109729cf09SDimitry Andricinline
20117a984708SDavid Chisnalltypename enable_if
20127a984708SDavid Chisnall<
20137a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20147a984708SDavid Chisnall    void
20157a984708SDavid Chisnall>::type
20167a984708SDavid Chisnallmask_array<_Tp>::operator=(const _Expr& __v) const
20177a984708SDavid Chisnall{
20187a984708SDavid Chisnall    size_t __n = __1d_.size();
20197a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20207a984708SDavid Chisnall        __vp_[__1d_[__i]] = __v[__i];
20217a984708SDavid Chisnall}
20227a984708SDavid Chisnall
20237a984708SDavid Chisnalltemplate <class _Tp>
20247a984708SDavid Chisnalltemplate <class _Expr>
20259729cf09SDimitry Andricinline
20267a984708SDavid Chisnalltypename enable_if
20277a984708SDavid Chisnall<
20287a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20297a984708SDavid Chisnall    void
20307a984708SDavid Chisnall>::type
20317a984708SDavid Chisnallmask_array<_Tp>::operator*=(const _Expr& __v) const
20327a984708SDavid Chisnall{
20337a984708SDavid Chisnall    size_t __n = __1d_.size();
20347a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20357a984708SDavid Chisnall        __vp_[__1d_[__i]] *= __v[__i];
20367a984708SDavid Chisnall}
20377a984708SDavid Chisnall
20387a984708SDavid Chisnalltemplate <class _Tp>
20397a984708SDavid Chisnalltemplate <class _Expr>
20409729cf09SDimitry Andricinline
20417a984708SDavid Chisnalltypename enable_if
20427a984708SDavid Chisnall<
20437a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20447a984708SDavid Chisnall    void
20457a984708SDavid Chisnall>::type
20467a984708SDavid Chisnallmask_array<_Tp>::operator/=(const _Expr& __v) const
20477a984708SDavid Chisnall{
20487a984708SDavid Chisnall    size_t __n = __1d_.size();
20497a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20507a984708SDavid Chisnall        __vp_[__1d_[__i]] /= __v[__i];
20517a984708SDavid Chisnall}
20527a984708SDavid Chisnall
20537a984708SDavid Chisnalltemplate <class _Tp>
20547a984708SDavid Chisnalltemplate <class _Expr>
20559729cf09SDimitry Andricinline
20567a984708SDavid Chisnalltypename enable_if
20577a984708SDavid Chisnall<
20587a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20597a984708SDavid Chisnall    void
20607a984708SDavid Chisnall>::type
20617a984708SDavid Chisnallmask_array<_Tp>::operator%=(const _Expr& __v) const
20627a984708SDavid Chisnall{
20637a984708SDavid Chisnall    size_t __n = __1d_.size();
20647a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20657a984708SDavid Chisnall        __vp_[__1d_[__i]] %= __v[__i];
20667a984708SDavid Chisnall}
20677a984708SDavid Chisnall
20687a984708SDavid Chisnalltemplate <class _Tp>
20697a984708SDavid Chisnalltemplate <class _Expr>
20709729cf09SDimitry Andricinline
20717a984708SDavid Chisnalltypename enable_if
20727a984708SDavid Chisnall<
20737a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20747a984708SDavid Chisnall    void
20757a984708SDavid Chisnall>::type
20767a984708SDavid Chisnallmask_array<_Tp>::operator+=(const _Expr& __v) const
20777a984708SDavid Chisnall{
20787a984708SDavid Chisnall    size_t __n = __1d_.size();
20797a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20807a984708SDavid Chisnall        __vp_[__1d_[__i]] += __v[__i];
20817a984708SDavid Chisnall}
20827a984708SDavid Chisnall
20837a984708SDavid Chisnalltemplate <class _Tp>
20847a984708SDavid Chisnalltemplate <class _Expr>
20859729cf09SDimitry Andricinline
20867a984708SDavid Chisnalltypename enable_if
20877a984708SDavid Chisnall<
20887a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
20897a984708SDavid Chisnall    void
20907a984708SDavid Chisnall>::type
20917a984708SDavid Chisnallmask_array<_Tp>::operator-=(const _Expr& __v) const
20927a984708SDavid Chisnall{
20937a984708SDavid Chisnall    size_t __n = __1d_.size();
20947a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
20957a984708SDavid Chisnall        __vp_[__1d_[__i]] -= __v[__i];
20967a984708SDavid Chisnall}
20977a984708SDavid Chisnall
20987a984708SDavid Chisnalltemplate <class _Tp>
20997a984708SDavid Chisnalltemplate <class _Expr>
21009729cf09SDimitry Andricinline
21017a984708SDavid Chisnalltypename enable_if
21027a984708SDavid Chisnall<
21037a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
21047a984708SDavid Chisnall    void
21057a984708SDavid Chisnall>::type
21067a984708SDavid Chisnallmask_array<_Tp>::operator^=(const _Expr& __v) const
21077a984708SDavid Chisnall{
21087a984708SDavid Chisnall    size_t __n = __1d_.size();
21097a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21107a984708SDavid Chisnall        __vp_[__1d_[__i]] ^= __v[__i];
21117a984708SDavid Chisnall}
21127a984708SDavid Chisnall
21137a984708SDavid Chisnalltemplate <class _Tp>
21147a984708SDavid Chisnalltemplate <class _Expr>
21159729cf09SDimitry Andricinline
21167a984708SDavid Chisnalltypename enable_if
21177a984708SDavid Chisnall<
21187a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
21197a984708SDavid Chisnall    void
21207a984708SDavid Chisnall>::type
21217a984708SDavid Chisnallmask_array<_Tp>::operator&=(const _Expr& __v) const
21227a984708SDavid Chisnall{
21237a984708SDavid Chisnall    size_t __n = __1d_.size();
21247a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21257a984708SDavid Chisnall        __vp_[__1d_[__i]] &= __v[__i];
21267a984708SDavid Chisnall}
21277a984708SDavid Chisnall
21287a984708SDavid Chisnalltemplate <class _Tp>
21297a984708SDavid Chisnalltemplate <class _Expr>
21309729cf09SDimitry Andricinline
21317a984708SDavid Chisnalltypename enable_if
21327a984708SDavid Chisnall<
21337a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
21347a984708SDavid Chisnall    void
21357a984708SDavid Chisnall>::type
21367a984708SDavid Chisnallmask_array<_Tp>::operator|=(const _Expr& __v) const
21377a984708SDavid Chisnall{
21387a984708SDavid Chisnall    size_t __n = __1d_.size();
21397a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21407a984708SDavid Chisnall        __vp_[__1d_[__i]] |= __v[__i];
21417a984708SDavid Chisnall}
21427a984708SDavid Chisnall
21437a984708SDavid Chisnalltemplate <class _Tp>
21447a984708SDavid Chisnalltemplate <class _Expr>
21459729cf09SDimitry Andricinline
21467a984708SDavid Chisnalltypename enable_if
21477a984708SDavid Chisnall<
21487a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
21497a984708SDavid Chisnall    void
21507a984708SDavid Chisnall>::type
21517a984708SDavid Chisnallmask_array<_Tp>::operator<<=(const _Expr& __v) const
21527a984708SDavid Chisnall{
21537a984708SDavid Chisnall    size_t __n = __1d_.size();
21547a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21557a984708SDavid Chisnall        __vp_[__1d_[__i]] <<= __v[__i];
21567a984708SDavid Chisnall}
21577a984708SDavid Chisnall
21587a984708SDavid Chisnalltemplate <class _Tp>
21597a984708SDavid Chisnalltemplate <class _Expr>
21609729cf09SDimitry Andricinline
21617a984708SDavid Chisnalltypename enable_if
21627a984708SDavid Chisnall<
21637a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
21647a984708SDavid Chisnall    void
21657a984708SDavid Chisnall>::type
21667a984708SDavid Chisnallmask_array<_Tp>::operator>>=(const _Expr& __v) const
21677a984708SDavid Chisnall{
21687a984708SDavid Chisnall    size_t __n = __1d_.size();
21697a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21707a984708SDavid Chisnall        __vp_[__1d_[__i]] >>= __v[__i];
21717a984708SDavid Chisnall}
21727a984708SDavid Chisnall
21737a984708SDavid Chisnalltemplate <class _Tp>
21749729cf09SDimitry Andricinline
21757a984708SDavid Chisnallconst mask_array<_Tp>&
21767a984708SDavid Chisnallmask_array<_Tp>::operator=(const mask_array& __ma) const
21777a984708SDavid Chisnall{
21787a984708SDavid Chisnall    size_t __n = __1d_.size();
21797a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21807a984708SDavid Chisnall        __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]];
2181d72607e9SDimitry Andric    return *this;
21827a984708SDavid Chisnall}
21837a984708SDavid Chisnall
21847a984708SDavid Chisnalltemplate <class _Tp>
21859729cf09SDimitry Andricinline
21867a984708SDavid Chisnallvoid
21877a984708SDavid Chisnallmask_array<_Tp>::operator=(const value_type& __x) const
21887a984708SDavid Chisnall{
21897a984708SDavid Chisnall    size_t __n = __1d_.size();
21907a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
21917a984708SDavid Chisnall        __vp_[__1d_[__i]] = __x;
21927a984708SDavid Chisnall}
21937a984708SDavid Chisnall
21947a984708SDavid Chisnalltemplate <class _ValExpr>
21957a984708SDavid Chisnallclass __mask_expr
21967a984708SDavid Chisnall{
21977a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
21987a984708SDavid Chisnallpublic:
21997a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
22007a984708SDavid Chisnall    typedef value_type result_type;
22017a984708SDavid Chisnall
22027a984708SDavid Chisnallprivate:
22037a984708SDavid Chisnall    _ValExpr __expr_;
22047a984708SDavid Chisnall    valarray<size_t> __1d_;
22057a984708SDavid Chisnall
22067a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
22077a984708SDavid Chisnall    __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e)
22087a984708SDavid Chisnall        : __expr_(__e),
220994e3ee44SDavid Chisnall          __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true)))
22107a984708SDavid Chisnall          {
22117a984708SDavid Chisnall              size_t __j = 0;
22127a984708SDavid Chisnall              for (size_t __i = 0; __i < __vb.size(); ++__i)
22137a984708SDavid Chisnall                  if (__vb[__i])
22147a984708SDavid Chisnall                      __1d_[__j++] = __i;
22157a984708SDavid Chisnall          }
22167a984708SDavid Chisnall
22177a984708SDavid Chisnallpublic:
22187a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
22197a984708SDavid Chisnall    result_type operator[](size_t __i) const
22207a984708SDavid Chisnall        {return __expr_[__1d_[__i]];}
22217a984708SDavid Chisnall
22227a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
22237a984708SDavid Chisnall    size_t size() const {return __1d_.size();}
22247a984708SDavid Chisnall
22257a984708SDavid Chisnall    template <class> friend class valarray;
22267a984708SDavid Chisnall};
22277a984708SDavid Chisnall
22287a984708SDavid Chisnall// indirect_array
22297a984708SDavid Chisnall
22307a984708SDavid Chisnalltemplate <class _Tp>
2231aed8d94eSDimitry Andricclass _LIBCPP_TEMPLATE_VIS indirect_array
22327a984708SDavid Chisnall{
22337a984708SDavid Chisnallpublic:
22347a984708SDavid Chisnall    typedef _Tp value_type;
22357a984708SDavid Chisnall
22367a984708SDavid Chisnallprivate:
22377a984708SDavid Chisnall    value_type*      __vp_;
22387a984708SDavid Chisnall    valarray<size_t> __1d_;
22397a984708SDavid Chisnall
22407a984708SDavid Chisnallpublic:
22417a984708SDavid Chisnall    template <class _Expr>
22427a984708SDavid Chisnall    typename enable_if
22437a984708SDavid Chisnall    <
22447a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22457a984708SDavid Chisnall        void
22467a984708SDavid Chisnall    >::type
22479729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22487a984708SDavid Chisnall    operator=(const _Expr& __v) const;
22497a984708SDavid Chisnall
22507a984708SDavid Chisnall    template <class _Expr>
22517a984708SDavid Chisnall    typename enable_if
22527a984708SDavid Chisnall    <
22537a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22547a984708SDavid Chisnall        void
22557a984708SDavid Chisnall    >::type
22569729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22577a984708SDavid Chisnall    operator*=(const _Expr& __v) const;
22587a984708SDavid Chisnall
22597a984708SDavid Chisnall    template <class _Expr>
22607a984708SDavid Chisnall    typename enable_if
22617a984708SDavid Chisnall    <
22627a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22637a984708SDavid Chisnall        void
22647a984708SDavid Chisnall    >::type
22659729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22667a984708SDavid Chisnall    operator/=(const _Expr& __v) const;
22677a984708SDavid Chisnall
22687a984708SDavid Chisnall    template <class _Expr>
22697a984708SDavid Chisnall    typename enable_if
22707a984708SDavid Chisnall    <
22717a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22727a984708SDavid Chisnall        void
22737a984708SDavid Chisnall    >::type
22749729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22757a984708SDavid Chisnall    operator%=(const _Expr& __v) const;
22767a984708SDavid Chisnall
22777a984708SDavid Chisnall    template <class _Expr>
22787a984708SDavid Chisnall    typename enable_if
22797a984708SDavid Chisnall    <
22807a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22817a984708SDavid Chisnall        void
22827a984708SDavid Chisnall    >::type
22839729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22847a984708SDavid Chisnall    operator+=(const _Expr& __v) const;
22857a984708SDavid Chisnall
22867a984708SDavid Chisnall    template <class _Expr>
22877a984708SDavid Chisnall    typename enable_if
22887a984708SDavid Chisnall    <
22897a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22907a984708SDavid Chisnall        void
22917a984708SDavid Chisnall    >::type
22929729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
22937a984708SDavid Chisnall    operator-=(const _Expr& __v) const;
22947a984708SDavid Chisnall
22957a984708SDavid Chisnall    template <class _Expr>
22967a984708SDavid Chisnall    typename enable_if
22977a984708SDavid Chisnall    <
22987a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
22997a984708SDavid Chisnall        void
23007a984708SDavid Chisnall    >::type
23019729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23027a984708SDavid Chisnall    operator^=(const _Expr& __v) const;
23037a984708SDavid Chisnall
23047a984708SDavid Chisnall    template <class _Expr>
23057a984708SDavid Chisnall    typename enable_if
23067a984708SDavid Chisnall    <
23077a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
23087a984708SDavid Chisnall        void
23097a984708SDavid Chisnall    >::type
23109729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23117a984708SDavid Chisnall    operator&=(const _Expr& __v) const;
23127a984708SDavid Chisnall
23137a984708SDavid Chisnall    template <class _Expr>
23147a984708SDavid Chisnall    typename enable_if
23157a984708SDavid Chisnall    <
23167a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
23177a984708SDavid Chisnall        void
23187a984708SDavid Chisnall    >::type
23199729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23207a984708SDavid Chisnall    operator|=(const _Expr& __v) const;
23217a984708SDavid Chisnall
23227a984708SDavid Chisnall    template <class _Expr>
23237a984708SDavid Chisnall    typename enable_if
23247a984708SDavid Chisnall    <
23257a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
23267a984708SDavid Chisnall        void
23277a984708SDavid Chisnall    >::type
23289729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23297a984708SDavid Chisnall    operator<<=(const _Expr& __v) const;
23307a984708SDavid Chisnall
23317a984708SDavid Chisnall    template <class _Expr>
23327a984708SDavid Chisnall    typename enable_if
23337a984708SDavid Chisnall    <
23347a984708SDavid Chisnall        __is_val_expr<_Expr>::value,
23357a984708SDavid Chisnall        void
23367a984708SDavid Chisnall    >::type
23379729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23387a984708SDavid Chisnall    operator>>=(const _Expr& __v) const;
23397a984708SDavid Chisnall
23409729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23417a984708SDavid Chisnall    const indirect_array& operator=(const indirect_array& __ia) const;
23427a984708SDavid Chisnall
23439729cf09SDimitry Andric    _LIBCPP_INLINE_VISIBILITY
23447a984708SDavid Chisnall    void operator=(const value_type& __x) const;
23457a984708SDavid Chisnall
23467a984708SDavid Chisnall//  indirect_array(const indirect_array&)            = default;
23477a984708SDavid Chisnall//  indirect_array(indirect_array&&)                 = default;
23487a984708SDavid Chisnall//  indirect_array& operator=(const indirect_array&) = default;
23497a984708SDavid Chisnall//  indirect_array& operator=(indirect_array&&)      = default;
23507a984708SDavid Chisnall
23517a984708SDavid Chisnallprivate:
23527a984708SDavid Chisnall     _LIBCPP_INLINE_VISIBILITY
23537a984708SDavid Chisnall   indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v)
23547a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_)),
23557a984708SDavid Chisnall          __1d_(__ia)
23567a984708SDavid Chisnall        {}
23577a984708SDavid Chisnall
2358540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
23597a984708SDavid Chisnall
23607a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
23617a984708SDavid Chisnall    indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v)
23627a984708SDavid Chisnall        : __vp_(const_cast<value_type*>(__v.__begin_)),
23637a984708SDavid Chisnall          __1d_(move(__ia))
23647a984708SDavid Chisnall        {}
23657a984708SDavid Chisnall
2366540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
23677a984708SDavid Chisnall
23687a984708SDavid Chisnall    template <class> friend class valarray;
23697a984708SDavid Chisnall};
23707a984708SDavid Chisnall
23717a984708SDavid Chisnalltemplate <class _Tp>
23727a984708SDavid Chisnalltemplate <class _Expr>
23739729cf09SDimitry Andricinline
23747a984708SDavid Chisnalltypename enable_if
23757a984708SDavid Chisnall<
23767a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
23777a984708SDavid Chisnall    void
23787a984708SDavid Chisnall>::type
23797a984708SDavid Chisnallindirect_array<_Tp>::operator=(const _Expr& __v) const
23807a984708SDavid Chisnall{
23817a984708SDavid Chisnall    size_t __n = __1d_.size();
23827a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
23837a984708SDavid Chisnall        __vp_[__1d_[__i]] = __v[__i];
23847a984708SDavid Chisnall}
23857a984708SDavid Chisnall
23867a984708SDavid Chisnalltemplate <class _Tp>
23877a984708SDavid Chisnalltemplate <class _Expr>
23889729cf09SDimitry Andricinline
23897a984708SDavid Chisnalltypename enable_if
23907a984708SDavid Chisnall<
23917a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
23927a984708SDavid Chisnall    void
23937a984708SDavid Chisnall>::type
23947a984708SDavid Chisnallindirect_array<_Tp>::operator*=(const _Expr& __v) const
23957a984708SDavid Chisnall{
23967a984708SDavid Chisnall    size_t __n = __1d_.size();
23977a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
23987a984708SDavid Chisnall        __vp_[__1d_[__i]] *= __v[__i];
23997a984708SDavid Chisnall}
24007a984708SDavid Chisnall
24017a984708SDavid Chisnalltemplate <class _Tp>
24027a984708SDavid Chisnalltemplate <class _Expr>
24039729cf09SDimitry Andricinline
24047a984708SDavid Chisnalltypename enable_if
24057a984708SDavid Chisnall<
24067a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24077a984708SDavid Chisnall    void
24087a984708SDavid Chisnall>::type
24097a984708SDavid Chisnallindirect_array<_Tp>::operator/=(const _Expr& __v) const
24107a984708SDavid Chisnall{
24117a984708SDavid Chisnall    size_t __n = __1d_.size();
24127a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24137a984708SDavid Chisnall        __vp_[__1d_[__i]] /= __v[__i];
24147a984708SDavid Chisnall}
24157a984708SDavid Chisnall
24167a984708SDavid Chisnalltemplate <class _Tp>
24177a984708SDavid Chisnalltemplate <class _Expr>
24189729cf09SDimitry Andricinline
24197a984708SDavid Chisnalltypename enable_if
24207a984708SDavid Chisnall<
24217a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24227a984708SDavid Chisnall    void
24237a984708SDavid Chisnall>::type
24247a984708SDavid Chisnallindirect_array<_Tp>::operator%=(const _Expr& __v) const
24257a984708SDavid Chisnall{
24267a984708SDavid Chisnall    size_t __n = __1d_.size();
24277a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24287a984708SDavid Chisnall        __vp_[__1d_[__i]] %= __v[__i];
24297a984708SDavid Chisnall}
24307a984708SDavid Chisnall
24317a984708SDavid Chisnalltemplate <class _Tp>
24327a984708SDavid Chisnalltemplate <class _Expr>
24339729cf09SDimitry Andricinline
24347a984708SDavid Chisnalltypename enable_if
24357a984708SDavid Chisnall<
24367a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24377a984708SDavid Chisnall    void
24387a984708SDavid Chisnall>::type
24397a984708SDavid Chisnallindirect_array<_Tp>::operator+=(const _Expr& __v) const
24407a984708SDavid Chisnall{
24417a984708SDavid Chisnall    size_t __n = __1d_.size();
24427a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24437a984708SDavid Chisnall        __vp_[__1d_[__i]] += __v[__i];
24447a984708SDavid Chisnall}
24457a984708SDavid Chisnall
24467a984708SDavid Chisnalltemplate <class _Tp>
24477a984708SDavid Chisnalltemplate <class _Expr>
24489729cf09SDimitry Andricinline
24497a984708SDavid Chisnalltypename enable_if
24507a984708SDavid Chisnall<
24517a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24527a984708SDavid Chisnall    void
24537a984708SDavid Chisnall>::type
24547a984708SDavid Chisnallindirect_array<_Tp>::operator-=(const _Expr& __v) const
24557a984708SDavid Chisnall{
24567a984708SDavid Chisnall    size_t __n = __1d_.size();
24577a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24587a984708SDavid Chisnall        __vp_[__1d_[__i]] -= __v[__i];
24597a984708SDavid Chisnall}
24607a984708SDavid Chisnall
24617a984708SDavid Chisnalltemplate <class _Tp>
24627a984708SDavid Chisnalltemplate <class _Expr>
24639729cf09SDimitry Andricinline
24647a984708SDavid Chisnalltypename enable_if
24657a984708SDavid Chisnall<
24667a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24677a984708SDavid Chisnall    void
24687a984708SDavid Chisnall>::type
24697a984708SDavid Chisnallindirect_array<_Tp>::operator^=(const _Expr& __v) const
24707a984708SDavid Chisnall{
24717a984708SDavid Chisnall    size_t __n = __1d_.size();
24727a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24737a984708SDavid Chisnall        __vp_[__1d_[__i]] ^= __v[__i];
24747a984708SDavid Chisnall}
24757a984708SDavid Chisnall
24767a984708SDavid Chisnalltemplate <class _Tp>
24777a984708SDavid Chisnalltemplate <class _Expr>
24789729cf09SDimitry Andricinline
24797a984708SDavid Chisnalltypename enable_if
24807a984708SDavid Chisnall<
24817a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24827a984708SDavid Chisnall    void
24837a984708SDavid Chisnall>::type
24847a984708SDavid Chisnallindirect_array<_Tp>::operator&=(const _Expr& __v) const
24857a984708SDavid Chisnall{
24867a984708SDavid Chisnall    size_t __n = __1d_.size();
24877a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
24887a984708SDavid Chisnall        __vp_[__1d_[__i]] &= __v[__i];
24897a984708SDavid Chisnall}
24907a984708SDavid Chisnall
24917a984708SDavid Chisnalltemplate <class _Tp>
24927a984708SDavid Chisnalltemplate <class _Expr>
24939729cf09SDimitry Andricinline
24947a984708SDavid Chisnalltypename enable_if
24957a984708SDavid Chisnall<
24967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
24977a984708SDavid Chisnall    void
24987a984708SDavid Chisnall>::type
24997a984708SDavid Chisnallindirect_array<_Tp>::operator|=(const _Expr& __v) const
25007a984708SDavid Chisnall{
25017a984708SDavid Chisnall    size_t __n = __1d_.size();
25027a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
25037a984708SDavid Chisnall        __vp_[__1d_[__i]] |= __v[__i];
25047a984708SDavid Chisnall}
25057a984708SDavid Chisnall
25067a984708SDavid Chisnalltemplate <class _Tp>
25077a984708SDavid Chisnalltemplate <class _Expr>
25089729cf09SDimitry Andricinline
25097a984708SDavid Chisnalltypename enable_if
25107a984708SDavid Chisnall<
25117a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
25127a984708SDavid Chisnall    void
25137a984708SDavid Chisnall>::type
25147a984708SDavid Chisnallindirect_array<_Tp>::operator<<=(const _Expr& __v) const
25157a984708SDavid Chisnall{
25167a984708SDavid Chisnall    size_t __n = __1d_.size();
25177a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
25187a984708SDavid Chisnall        __vp_[__1d_[__i]] <<= __v[__i];
25197a984708SDavid Chisnall}
25207a984708SDavid Chisnall
25217a984708SDavid Chisnalltemplate <class _Tp>
25227a984708SDavid Chisnalltemplate <class _Expr>
25239729cf09SDimitry Andricinline
25247a984708SDavid Chisnalltypename enable_if
25257a984708SDavid Chisnall<
25267a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
25277a984708SDavid Chisnall    void
25287a984708SDavid Chisnall>::type
25297a984708SDavid Chisnallindirect_array<_Tp>::operator>>=(const _Expr& __v) const
25307a984708SDavid Chisnall{
25317a984708SDavid Chisnall    size_t __n = __1d_.size();
25327a984708SDavid Chisnall    for (size_t __i = 0; __i < __n; ++__i)
25337a984708SDavid Chisnall        __vp_[__1d_[__i]] >>= __v[__i];
25347a984708SDavid Chisnall}
25357a984708SDavid Chisnall
25367a984708SDavid Chisnalltemplate <class _Tp>
25379729cf09SDimitry Andricinline
25387a984708SDavid Chisnallconst indirect_array<_Tp>&
25397a984708SDavid Chisnallindirect_array<_Tp>::operator=(const indirect_array& __ia) const
25407a984708SDavid Chisnall{
25417a984708SDavid Chisnall    typedef const size_t* _Ip;
25427a984708SDavid Chisnall    const value_type* __s = __ia.__vp_;
25437a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_;
25447a984708SDavid Chisnall            __i != __e; ++__i, ++__j)
25457a984708SDavid Chisnall        __vp_[*__i] = __s[*__j];
25467a984708SDavid Chisnall    return *this;
25477a984708SDavid Chisnall}
25487a984708SDavid Chisnall
25497a984708SDavid Chisnalltemplate <class _Tp>
25509729cf09SDimitry Andricinline
25517a984708SDavid Chisnallvoid
25527a984708SDavid Chisnallindirect_array<_Tp>::operator=(const value_type& __x) const
25537a984708SDavid Chisnall{
25547a984708SDavid Chisnall    typedef const size_t* _Ip;
25557a984708SDavid Chisnall    for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i)
25567a984708SDavid Chisnall        __vp_[*__i] = __x;
25577a984708SDavid Chisnall}
25587a984708SDavid Chisnall
25597a984708SDavid Chisnalltemplate <class _ValExpr>
25607a984708SDavid Chisnallclass __indirect_expr
25617a984708SDavid Chisnall{
25627a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
25637a984708SDavid Chisnallpublic:
25647a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
25657a984708SDavid Chisnall    typedef value_type result_type;
25667a984708SDavid Chisnall
25677a984708SDavid Chisnallprivate:
25687a984708SDavid Chisnall    _ValExpr __expr_;
25697a984708SDavid Chisnall    valarray<size_t> __1d_;
25707a984708SDavid Chisnall
25717a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
25727a984708SDavid Chisnall    __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e)
25737a984708SDavid Chisnall        : __expr_(__e),
25747a984708SDavid Chisnall          __1d_(__ia)
25757a984708SDavid Chisnall          {}
25767a984708SDavid Chisnall
2577540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
25787a984708SDavid Chisnall
25797a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
25807a984708SDavid Chisnall    __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e)
25817a984708SDavid Chisnall        : __expr_(__e),
25827a984708SDavid Chisnall          __1d_(move(__ia))
25837a984708SDavid Chisnall          {}
25847a984708SDavid Chisnall
2585540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
25867a984708SDavid Chisnall
25877a984708SDavid Chisnallpublic:
25887a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
25897a984708SDavid Chisnall    result_type operator[](size_t __i) const
25907a984708SDavid Chisnall        {return __expr_[__1d_[__i]];}
25917a984708SDavid Chisnall
25927a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
25937a984708SDavid Chisnall    size_t size() const {return __1d_.size();}
25947a984708SDavid Chisnall
2595aed8d94eSDimitry Andric    template <class> friend class _LIBCPP_TEMPLATE_VIS valarray;
25967a984708SDavid Chisnall};
25977a984708SDavid Chisnall
25987a984708SDavid Chisnalltemplate<class _ValExpr>
25997a984708SDavid Chisnallclass __val_expr
26007a984708SDavid Chisnall{
26017a984708SDavid Chisnall    typedef typename remove_reference<_ValExpr>::type  _RmExpr;
26027a984708SDavid Chisnall
26037a984708SDavid Chisnall    _ValExpr __expr_;
26047a984708SDavid Chisnallpublic:
26057a984708SDavid Chisnall    typedef typename _RmExpr::value_type value_type;
26067a984708SDavid Chisnall    typedef typename _RmExpr::result_type result_type;
26077a984708SDavid Chisnall
26087a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26097a984708SDavid Chisnall    explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {}
26107a984708SDavid Chisnall
26117a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26127a984708SDavid Chisnall    result_type operator[](size_t __i) const
26137a984708SDavid Chisnall        {return __expr_[__i];}
26147a984708SDavid Chisnall
26157a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26167a984708SDavid Chisnall    __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const
26177a984708SDavid Chisnall        {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);}
26187a984708SDavid Chisnall
26197a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26207a984708SDavid Chisnall    __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const
26217a984708SDavid Chisnall        {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);}
26227a984708SDavid Chisnall
26237a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26247a984708SDavid Chisnall    __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const
26257a984708SDavid Chisnall        {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);}
26267a984708SDavid Chisnall
26277a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26287a984708SDavid Chisnall    __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const
26297a984708SDavid Chisnall        {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);}
26307a984708SDavid Chisnall
26317a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26327a984708SDavid Chisnall    __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> >
26337a984708SDavid Chisnall    operator+() const
26347a984708SDavid Chisnall    {
26357a984708SDavid Chisnall        typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr;
26367a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_));
26377a984708SDavid Chisnall    }
26387a984708SDavid Chisnall
26397a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26407a984708SDavid Chisnall    __val_expr<_UnaryOp<negate<value_type>, _ValExpr> >
26417a984708SDavid Chisnall    operator-() const
26427a984708SDavid Chisnall    {
26437a984708SDavid Chisnall        typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr;
26447a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_));
26457a984708SDavid Chisnall    }
26467a984708SDavid Chisnall
26477a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26487a984708SDavid Chisnall    __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> >
26497a984708SDavid Chisnall    operator~() const
26507a984708SDavid Chisnall    {
26517a984708SDavid Chisnall        typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr;
26527a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_));
26537a984708SDavid Chisnall    }
26547a984708SDavid Chisnall
26557a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26567a984708SDavid Chisnall    __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> >
26577a984708SDavid Chisnall    operator!() const
26587a984708SDavid Chisnall    {
26597a984708SDavid Chisnall        typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr;
26607a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_));
26617a984708SDavid Chisnall    }
26627a984708SDavid Chisnall
26637a984708SDavid Chisnall    operator valarray<result_type>() const;
26647a984708SDavid Chisnall
26657a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26667a984708SDavid Chisnall    size_t size() const {return __expr_.size();}
26677a984708SDavid Chisnall
26687a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26697a984708SDavid Chisnall    result_type sum() const
26707a984708SDavid Chisnall    {
26717a984708SDavid Chisnall        size_t __n = __expr_.size();
26727a984708SDavid Chisnall        result_type __r = __n ? __expr_[0] : result_type();
26737a984708SDavid Chisnall        for (size_t __i = 1; __i < __n; ++__i)
26747a984708SDavid Chisnall            __r += __expr_[__i];
26757a984708SDavid Chisnall        return __r;
26767a984708SDavid Chisnall    }
26777a984708SDavid Chisnall
26787a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26797a984708SDavid Chisnall    result_type min() const
26807a984708SDavid Chisnall    {
26817a984708SDavid Chisnall        size_t __n = size();
26827a984708SDavid Chisnall        result_type __r = __n ? (*this)[0] : result_type();
26837a984708SDavid Chisnall        for (size_t __i = 1; __i < __n; ++__i)
26847a984708SDavid Chisnall        {
26857a984708SDavid Chisnall            result_type __x = __expr_[__i];
26867a984708SDavid Chisnall            if (__x < __r)
26877a984708SDavid Chisnall                __r = __x;
26887a984708SDavid Chisnall        }
26897a984708SDavid Chisnall        return __r;
26907a984708SDavid Chisnall    }
26917a984708SDavid Chisnall
26927a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
26937a984708SDavid Chisnall    result_type max() const
26947a984708SDavid Chisnall    {
26957a984708SDavid Chisnall        size_t __n = size();
26967a984708SDavid Chisnall        result_type __r = __n ? (*this)[0] : result_type();
26977a984708SDavid Chisnall        for (size_t __i = 1; __i < __n; ++__i)
26987a984708SDavid Chisnall        {
26997a984708SDavid Chisnall            result_type __x = __expr_[__i];
27007a984708SDavid Chisnall            if (__r < __x)
27017a984708SDavid Chisnall                __r = __x;
27027a984708SDavid Chisnall        }
27037a984708SDavid Chisnall        return __r;
27047a984708SDavid Chisnall    }
27057a984708SDavid Chisnall
27067a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
27077a984708SDavid Chisnall    __val_expr<__shift_expr<_ValExpr> > shift (int __i) const
27087a984708SDavid Chisnall        {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));}
27097a984708SDavid Chisnall
27107a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
27117a984708SDavid Chisnall    __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const
27127a984708SDavid Chisnall        {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));}
27137a984708SDavid Chisnall
27147a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
27157a984708SDavid Chisnall    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> >
27167a984708SDavid Chisnall    apply(value_type __f(value_type)) const
27177a984708SDavid Chisnall    {
27187a984708SDavid Chisnall        typedef __apply_expr<value_type, value_type(*)(value_type)> _Op;
27197a984708SDavid Chisnall        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
27207a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
27217a984708SDavid Chisnall    }
27227a984708SDavid Chisnall
27237a984708SDavid Chisnall    _LIBCPP_INLINE_VISIBILITY
27247a984708SDavid Chisnall    __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> >
27257a984708SDavid Chisnall    apply(value_type __f(const value_type&)) const
27267a984708SDavid Chisnall    {
27277a984708SDavid Chisnall        typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op;
27287a984708SDavid Chisnall        typedef _UnaryOp<_Op, _ValExpr> _NewExpr;
27297a984708SDavid Chisnall        return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_));
27307a984708SDavid Chisnall    }
27317a984708SDavid Chisnall};
27327a984708SDavid Chisnall
27337a984708SDavid Chisnalltemplate<class _ValExpr>
27344f7ab58eSDimitry Andric__val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const
27357a984708SDavid Chisnall{
27367a984708SDavid Chisnall    valarray<result_type> __r;
27377a984708SDavid Chisnall    size_t __n = __expr_.size();
27387a984708SDavid Chisnall    if (__n)
27397a984708SDavid Chisnall    {
27407a984708SDavid Chisnall        __r.__begin_ =
27417a984708SDavid Chisnall            __r.__end_ =
27424ba319b5SDimitry Andric                static_cast<result_type*>(
2743*b5893f02SDimitry Andric                    _VSTD::__libcpp_allocate(__n * sizeof(result_type), _LIBCPP_ALIGNOF(result_type)));
27447a984708SDavid Chisnall        for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i)
27457a984708SDavid Chisnall            ::new (__r.__end_) result_type(__expr_[__i]);
27467a984708SDavid Chisnall    }
27477a984708SDavid Chisnall    return __r;
27487a984708SDavid Chisnall}
27497a984708SDavid Chisnall
27507a984708SDavid Chisnall// valarray
27517a984708SDavid Chisnall
27527a984708SDavid Chisnalltemplate <class _Tp>
27539729cf09SDimitry Andricinline
27547a984708SDavid Chisnallvalarray<_Tp>::valarray(size_t __n)
27557a984708SDavid Chisnall    : __begin_(0),
27567a984708SDavid Chisnall      __end_(0)
27577a984708SDavid Chisnall{
27584ba319b5SDimitry Andric    if (__n)
27594ba319b5SDimitry Andric    {
27604ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2761*b5893f02SDimitry Andric            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
27624ba319b5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
27634ba319b5SDimitry Andric        try
27644ba319b5SDimitry Andric        {
27654ba319b5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
2766*b5893f02SDimitry Andric            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
27674ba319b5SDimitry Andric                ::new (__end_) value_type();
27684ba319b5SDimitry Andric#ifndef _LIBCPP_NO_EXCEPTIONS
27694ba319b5SDimitry Andric        }
27704ba319b5SDimitry Andric        catch (...)
27714ba319b5SDimitry Andric        {
2772*b5893f02SDimitry Andric            __clear(__n);
27734ba319b5SDimitry Andric            throw;
27744ba319b5SDimitry Andric        }
27754ba319b5SDimitry Andric#endif  // _LIBCPP_NO_EXCEPTIONS
27764ba319b5SDimitry Andric    }
27777a984708SDavid Chisnall}
27787a984708SDavid Chisnall
27797a984708SDavid Chisnalltemplate <class _Tp>
27809729cf09SDimitry Andricinline
27817a984708SDavid Chisnallvalarray<_Tp>::valarray(const value_type& __x, size_t __n)
27827a984708SDavid Chisnall    : __begin_(0),
27837a984708SDavid Chisnall      __end_(0)
27847a984708SDavid Chisnall{
27857a984708SDavid Chisnall    resize(__n, __x);
27867a984708SDavid Chisnall}
27877a984708SDavid Chisnall
27887a984708SDavid Chisnalltemplate <class _Tp>
27897a984708SDavid Chisnallvalarray<_Tp>::valarray(const value_type* __p, size_t __n)
27907a984708SDavid Chisnall    : __begin_(0),
27917a984708SDavid Chisnall      __end_(0)
27927a984708SDavid Chisnall{
27937a984708SDavid Chisnall    if (__n)
27947a984708SDavid Chisnall    {
27954ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2796*b5893f02SDimitry Andric            _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
27977a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
27987a984708SDavid Chisnall        try
27997a984708SDavid Chisnall        {
28007a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
2801*b5893f02SDimitry Andric            for (size_t __n_left = __n; __n_left; ++__end_, ++__p, --__n_left)
28027a984708SDavid Chisnall                ::new (__end_) value_type(*__p);
28037a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28047a984708SDavid Chisnall        }
28057a984708SDavid Chisnall        catch (...)
28067a984708SDavid Chisnall        {
2807*b5893f02SDimitry Andric            __clear(__n);
28087a984708SDavid Chisnall            throw;
28097a984708SDavid Chisnall        }
28107a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
28117a984708SDavid Chisnall    }
28127a984708SDavid Chisnall}
28137a984708SDavid Chisnall
28147a984708SDavid Chisnalltemplate <class _Tp>
28157a984708SDavid Chisnallvalarray<_Tp>::valarray(const valarray& __v)
28167a984708SDavid Chisnall    : __begin_(0),
28177a984708SDavid Chisnall      __end_(0)
28187a984708SDavid Chisnall{
28197a984708SDavid Chisnall    if (__v.size())
28207a984708SDavid Chisnall    {
28214ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2822*b5893f02SDimitry Andric            _VSTD::__libcpp_allocate(__v.size() * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
28237a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28247a984708SDavid Chisnall        try
28257a984708SDavid Chisnall        {
28267a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
28277a984708SDavid Chisnall            for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p)
28287a984708SDavid Chisnall                ::new (__end_) value_type(*__p);
28297a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28307a984708SDavid Chisnall        }
28317a984708SDavid Chisnall        catch (...)
28327a984708SDavid Chisnall        {
2833*b5893f02SDimitry Andric            __clear(__v.size());
28347a984708SDavid Chisnall            throw;
28357a984708SDavid Chisnall        }
28367a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
28377a984708SDavid Chisnall    }
28387a984708SDavid Chisnall}
28397a984708SDavid Chisnall
2840540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
28417a984708SDavid Chisnall
28427a984708SDavid Chisnalltemplate <class _Tp>
28439729cf09SDimitry Andricinline
2844936e9439SDimitry Andricvalarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT
28457a984708SDavid Chisnall    : __begin_(__v.__begin_),
28467a984708SDavid Chisnall      __end_(__v.__end_)
28477a984708SDavid Chisnall{
28487a984708SDavid Chisnall    __v.__begin_ = __v.__end_ = nullptr;
28497a984708SDavid Chisnall}
28507a984708SDavid Chisnall
28517a984708SDavid Chisnalltemplate <class _Tp>
28527a984708SDavid Chisnallvalarray<_Tp>::valarray(initializer_list<value_type> __il)
28537a984708SDavid Chisnall    : __begin_(0),
28547a984708SDavid Chisnall      __end_(0)
28557a984708SDavid Chisnall{
2856*b5893f02SDimitry Andric    const size_t __n = __il.size();
28577a984708SDavid Chisnall    if (__n)
28587a984708SDavid Chisnall    {
28594ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2860*b5893f02SDimitry Andric_VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
28617a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28627a984708SDavid Chisnall        try
28637a984708SDavid Chisnall        {
28647a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
2865*b5893f02SDimitry Andric            size_t __n_left = __n;
2866*b5893f02SDimitry Andric            for (const value_type* __p = __il.begin(); __n_left; ++__end_, ++__p, --__n_left)
28677a984708SDavid Chisnall                ::new (__end_) value_type(*__p);
28687a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28697a984708SDavid Chisnall        }
28707a984708SDavid Chisnall        catch (...)
28717a984708SDavid Chisnall        {
2872*b5893f02SDimitry Andric            __clear(__n);
28737a984708SDavid Chisnall            throw;
28747a984708SDavid Chisnall        }
28757a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
28767a984708SDavid Chisnall    }
28777a984708SDavid Chisnall}
28787a984708SDavid Chisnall
2879540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
28807a984708SDavid Chisnall
28817a984708SDavid Chisnalltemplate <class _Tp>
28827a984708SDavid Chisnallvalarray<_Tp>::valarray(const slice_array<value_type>& __sa)
28837a984708SDavid Chisnall    : __begin_(0),
28847a984708SDavid Chisnall      __end_(0)
28857a984708SDavid Chisnall{
2886*b5893f02SDimitry Andric    const size_t __n = __sa.__size_;
28877a984708SDavid Chisnall    if (__n)
28887a984708SDavid Chisnall    {
28894ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2890*b5893f02SDimitry Andric          _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
28917a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28927a984708SDavid Chisnall        try
28937a984708SDavid Chisnall        {
28947a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
2895*b5893f02SDimitry Andric            size_t __n_left = __n;
2896*b5893f02SDimitry Andric            for (const value_type* __p = __sa.__vp_; __n_left; ++__end_, __p += __sa.__stride_, --__n_left)
28977a984708SDavid Chisnall                ::new (__end_) value_type(*__p);
28987a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
28997a984708SDavid Chisnall        }
29007a984708SDavid Chisnall        catch (...)
29017a984708SDavid Chisnall        {
2902*b5893f02SDimitry Andric            __clear(__n);
29037a984708SDavid Chisnall            throw;
29047a984708SDavid Chisnall        }
29057a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29067a984708SDavid Chisnall    }
29077a984708SDavid Chisnall}
29087a984708SDavid Chisnall
29097a984708SDavid Chisnalltemplate <class _Tp>
29107a984708SDavid Chisnallvalarray<_Tp>::valarray(const gslice_array<value_type>& __ga)
29117a984708SDavid Chisnall    : __begin_(0),
29127a984708SDavid Chisnall      __end_(0)
29137a984708SDavid Chisnall{
2914*b5893f02SDimitry Andric    const size_t __n = __ga.__1d_.size();
29157a984708SDavid Chisnall    if (__n)
29167a984708SDavid Chisnall    {
29174ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2918*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
29197a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29207a984708SDavid Chisnall        try
29217a984708SDavid Chisnall        {
29227a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29237a984708SDavid Chisnall            typedef const size_t* _Ip;
29247a984708SDavid Chisnall            const value_type* __s = __ga.__vp_;
29257a984708SDavid Chisnall            for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
29267a984708SDavid Chisnall                    __i != __e; ++__i, ++__end_)
29277a984708SDavid Chisnall                ::new (__end_) value_type(__s[*__i]);
29287a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29297a984708SDavid Chisnall        }
29307a984708SDavid Chisnall        catch (...)
29317a984708SDavid Chisnall        {
2932*b5893f02SDimitry Andric            __clear(__n);
29337a984708SDavid Chisnall            throw;
29347a984708SDavid Chisnall        }
29357a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29367a984708SDavid Chisnall    }
29377a984708SDavid Chisnall}
29387a984708SDavid Chisnall
29397a984708SDavid Chisnalltemplate <class _Tp>
29407a984708SDavid Chisnallvalarray<_Tp>::valarray(const mask_array<value_type>& __ma)
29417a984708SDavid Chisnall    : __begin_(0),
29427a984708SDavid Chisnall      __end_(0)
29437a984708SDavid Chisnall{
2944*b5893f02SDimitry Andric    const size_t __n = __ma.__1d_.size();
29457a984708SDavid Chisnall    if (__n)
29467a984708SDavid Chisnall    {
29474ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2948*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
29497a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29507a984708SDavid Chisnall        try
29517a984708SDavid Chisnall        {
29527a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29537a984708SDavid Chisnall            typedef const size_t* _Ip;
29547a984708SDavid Chisnall            const value_type* __s = __ma.__vp_;
29557a984708SDavid Chisnall            for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
29567a984708SDavid Chisnall                    __i != __e; ++__i, ++__end_)
29577a984708SDavid Chisnall                ::new (__end_) value_type(__s[*__i]);
29587a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29597a984708SDavid Chisnall        }
29607a984708SDavid Chisnall        catch (...)
29617a984708SDavid Chisnall        {
2962*b5893f02SDimitry Andric            __clear(__n);
29637a984708SDavid Chisnall            throw;
29647a984708SDavid Chisnall        }
29657a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29667a984708SDavid Chisnall    }
29677a984708SDavid Chisnall}
29687a984708SDavid Chisnall
29697a984708SDavid Chisnalltemplate <class _Tp>
29707a984708SDavid Chisnallvalarray<_Tp>::valarray(const indirect_array<value_type>& __ia)
29717a984708SDavid Chisnall    : __begin_(0),
29727a984708SDavid Chisnall      __end_(0)
29737a984708SDavid Chisnall{
2974*b5893f02SDimitry Andric    const size_t __n = __ia.__1d_.size();
29757a984708SDavid Chisnall    if (__n)
29767a984708SDavid Chisnall    {
29774ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
2978*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
29797a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29807a984708SDavid Chisnall        try
29817a984708SDavid Chisnall        {
29827a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29837a984708SDavid Chisnall            typedef const size_t* _Ip;
29847a984708SDavid Chisnall            const value_type* __s = __ia.__vp_;
29857a984708SDavid Chisnall            for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
29867a984708SDavid Chisnall                    __i != __e; ++__i, ++__end_)
29877a984708SDavid Chisnall                ::new (__end_) value_type(__s[*__i]);
29887a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
29897a984708SDavid Chisnall        }
29907a984708SDavid Chisnall        catch (...)
29917a984708SDavid Chisnall        {
2992*b5893f02SDimitry Andric            __clear(__n);
29937a984708SDavid Chisnall            throw;
29947a984708SDavid Chisnall        }
29957a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
29967a984708SDavid Chisnall    }
29977a984708SDavid Chisnall}
29987a984708SDavid Chisnall
29997a984708SDavid Chisnalltemplate <class _Tp>
30009729cf09SDimitry Andricinline
30017a984708SDavid Chisnallvalarray<_Tp>::~valarray()
30027a984708SDavid Chisnall{
3003*b5893f02SDimitry Andric    __clear(size());
30044ba319b5SDimitry Andric}
30054ba319b5SDimitry Andric
30064ba319b5SDimitry Andrictemplate <class _Tp>
30074ba319b5SDimitry Andricvalarray<_Tp>&
30084ba319b5SDimitry Andricvalarray<_Tp>::__assign_range(const value_type* __f, const value_type* __l)
30094ba319b5SDimitry Andric{
30104ba319b5SDimitry Andric    size_t __n = __l - __f;
30114ba319b5SDimitry Andric    if (size() != __n)
30124ba319b5SDimitry Andric    {
3013*b5893f02SDimitry Andric        __clear(size());
30144ba319b5SDimitry Andric        __begin_ = static_cast<value_type*>(
3015*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
30164ba319b5SDimitry Andric        __end_ = __begin_ + __n;
30174ba319b5SDimitry Andric        _VSTD::uninitialized_copy(__f, __l, __begin_);
30184ba319b5SDimitry Andric    } else {
30194ba319b5SDimitry Andric        _VSTD::copy(__f, __l, __begin_);
30204ba319b5SDimitry Andric    }
30214ba319b5SDimitry Andric    return *this;
30227a984708SDavid Chisnall}
30237a984708SDavid Chisnall
30247a984708SDavid Chisnalltemplate <class _Tp>
30257a984708SDavid Chisnallvalarray<_Tp>&
30267a984708SDavid Chisnallvalarray<_Tp>::operator=(const valarray& __v)
30277a984708SDavid Chisnall{
30287a984708SDavid Chisnall    if (this != &__v)
30294ba319b5SDimitry Andric        return __assign_range(__v.__begin_, __v.__end_);
30307a984708SDavid Chisnall    return *this;
30317a984708SDavid Chisnall}
30327a984708SDavid Chisnall
3033540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
30347a984708SDavid Chisnall
30357a984708SDavid Chisnalltemplate <class _Tp>
30369729cf09SDimitry Andricinline
30377a984708SDavid Chisnallvalarray<_Tp>&
3038936e9439SDimitry Andricvalarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT
30397a984708SDavid Chisnall{
3040*b5893f02SDimitry Andric    __clear(size());
30417a984708SDavid Chisnall    __begin_ = __v.__begin_;
30427a984708SDavid Chisnall    __end_ = __v.__end_;
30437a984708SDavid Chisnall    __v.__begin_ = nullptr;
30447a984708SDavid Chisnall    __v.__end_ = nullptr;
30457a984708SDavid Chisnall    return *this;
30467a984708SDavid Chisnall}
30477a984708SDavid Chisnall
30487a984708SDavid Chisnalltemplate <class _Tp>
30499729cf09SDimitry Andricinline
30507a984708SDavid Chisnallvalarray<_Tp>&
30517a984708SDavid Chisnallvalarray<_Tp>::operator=(initializer_list<value_type> __il)
30527a984708SDavid Chisnall{
30534ba319b5SDimitry Andric    return __assign_range(__il.begin(), __il.end());
30547a984708SDavid Chisnall}
30557a984708SDavid Chisnall
3056540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
30577a984708SDavid Chisnall
30587a984708SDavid Chisnalltemplate <class _Tp>
30599729cf09SDimitry Andricinline
30607a984708SDavid Chisnallvalarray<_Tp>&
30617a984708SDavid Chisnallvalarray<_Tp>::operator=(const value_type& __x)
30627a984708SDavid Chisnall{
30637a984708SDavid Chisnall    _VSTD::fill(__begin_, __end_, __x);
30647a984708SDavid Chisnall    return *this;
30657a984708SDavid Chisnall}
30667a984708SDavid Chisnall
30677a984708SDavid Chisnalltemplate <class _Tp>
30689729cf09SDimitry Andricinline
30697a984708SDavid Chisnallvalarray<_Tp>&
30707a984708SDavid Chisnallvalarray<_Tp>::operator=(const slice_array<value_type>& __sa)
30717a984708SDavid Chisnall{
30727a984708SDavid Chisnall    value_type* __t = __begin_;
30737a984708SDavid Chisnall    const value_type* __s = __sa.__vp_;
30747a984708SDavid Chisnall    for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t)
30757a984708SDavid Chisnall        *__t = *__s;
30767a984708SDavid Chisnall    return *this;
30777a984708SDavid Chisnall}
30787a984708SDavid Chisnall
30797a984708SDavid Chisnalltemplate <class _Tp>
30809729cf09SDimitry Andricinline
30817a984708SDavid Chisnallvalarray<_Tp>&
30827a984708SDavid Chisnallvalarray<_Tp>::operator=(const gslice_array<value_type>& __ga)
30837a984708SDavid Chisnall{
30847a984708SDavid Chisnall    typedef const size_t* _Ip;
30857a984708SDavid Chisnall    value_type* __t = __begin_;
30867a984708SDavid Chisnall    const value_type* __s = __ga.__vp_;
30877a984708SDavid Chisnall    for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_;
30887a984708SDavid Chisnall                    __i != __e; ++__i, ++__t)
30897a984708SDavid Chisnall        *__t = __s[*__i];
30907a984708SDavid Chisnall    return *this;
30917a984708SDavid Chisnall}
30927a984708SDavid Chisnall
30937a984708SDavid Chisnalltemplate <class _Tp>
30949729cf09SDimitry Andricinline
30957a984708SDavid Chisnallvalarray<_Tp>&
30967a984708SDavid Chisnallvalarray<_Tp>::operator=(const mask_array<value_type>& __ma)
30977a984708SDavid Chisnall{
30987a984708SDavid Chisnall    typedef const size_t* _Ip;
30997a984708SDavid Chisnall    value_type* __t = __begin_;
31007a984708SDavid Chisnall    const value_type* __s = __ma.__vp_;
31017a984708SDavid Chisnall    for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_;
31027a984708SDavid Chisnall                    __i != __e; ++__i, ++__t)
31037a984708SDavid Chisnall        *__t = __s[*__i];
31047a984708SDavid Chisnall    return *this;
31057a984708SDavid Chisnall}
31067a984708SDavid Chisnall
31077a984708SDavid Chisnalltemplate <class _Tp>
31089729cf09SDimitry Andricinline
31097a984708SDavid Chisnallvalarray<_Tp>&
31107a984708SDavid Chisnallvalarray<_Tp>::operator=(const indirect_array<value_type>& __ia)
31117a984708SDavid Chisnall{
31127a984708SDavid Chisnall    typedef const size_t* _Ip;
31137a984708SDavid Chisnall    value_type* __t = __begin_;
31147a984708SDavid Chisnall    const value_type* __s = __ia.__vp_;
31157a984708SDavid Chisnall    for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_;
31167a984708SDavid Chisnall                    __i != __e; ++__i, ++__t)
31177a984708SDavid Chisnall        *__t = __s[*__i];
31187a984708SDavid Chisnall    return *this;
31197a984708SDavid Chisnall}
31207a984708SDavid Chisnall
31217a984708SDavid Chisnalltemplate <class _Tp>
31227a984708SDavid Chisnalltemplate <class _ValExpr>
31239729cf09SDimitry Andricinline
31247a984708SDavid Chisnallvalarray<_Tp>&
31257a984708SDavid Chisnallvalarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v)
31267a984708SDavid Chisnall{
31277a984708SDavid Chisnall    size_t __n = __v.size();
31287a984708SDavid Chisnall    if (size() != __n)
31297a984708SDavid Chisnall        resize(__n);
31307a984708SDavid Chisnall    value_type* __t = __begin_;
31317a984708SDavid Chisnall    for (size_t __i = 0; __i != __n; ++__t, ++__i)
31327a984708SDavid Chisnall        *__t = result_type(__v[__i]);
31337a984708SDavid Chisnall    return *this;
31347a984708SDavid Chisnall}
31357a984708SDavid Chisnall
31367a984708SDavid Chisnalltemplate <class _Tp>
31379729cf09SDimitry Andricinline
31387a984708SDavid Chisnall__val_expr<__slice_expr<const valarray<_Tp>&> >
31397a984708SDavid Chisnallvalarray<_Tp>::operator[](slice __s) const
31407a984708SDavid Chisnall{
31417a984708SDavid Chisnall    return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this));
31427a984708SDavid Chisnall}
31437a984708SDavid Chisnall
31447a984708SDavid Chisnalltemplate <class _Tp>
31459729cf09SDimitry Andricinline
31467a984708SDavid Chisnallslice_array<_Tp>
31477a984708SDavid Chisnallvalarray<_Tp>::operator[](slice __s)
31487a984708SDavid Chisnall{
31497a984708SDavid Chisnall    return slice_array<value_type>(__s, *this);
31507a984708SDavid Chisnall}
31517a984708SDavid Chisnall
31527a984708SDavid Chisnalltemplate <class _Tp>
31539729cf09SDimitry Andricinline
31547a984708SDavid Chisnall__val_expr<__indirect_expr<const valarray<_Tp>&> >
31557a984708SDavid Chisnallvalarray<_Tp>::operator[](const gslice& __gs) const
31567a984708SDavid Chisnall{
31577a984708SDavid Chisnall    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this));
31587a984708SDavid Chisnall}
31597a984708SDavid Chisnall
31607a984708SDavid Chisnalltemplate <class _Tp>
31619729cf09SDimitry Andricinline
31627a984708SDavid Chisnallgslice_array<_Tp>
31637a984708SDavid Chisnallvalarray<_Tp>::operator[](const gslice& __gs)
31647a984708SDavid Chisnall{
31657a984708SDavid Chisnall    return gslice_array<value_type>(__gs, *this);
31667a984708SDavid Chisnall}
31677a984708SDavid Chisnall
3168540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
31697a984708SDavid Chisnall
31707a984708SDavid Chisnalltemplate <class _Tp>
31719729cf09SDimitry Andricinline
31727a984708SDavid Chisnall__val_expr<__indirect_expr<const valarray<_Tp>&> >
31737a984708SDavid Chisnallvalarray<_Tp>::operator[](gslice&& __gs) const
31747a984708SDavid Chisnall{
31757a984708SDavid Chisnall    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this));
31767a984708SDavid Chisnall}
31777a984708SDavid Chisnall
31787a984708SDavid Chisnalltemplate <class _Tp>
31799729cf09SDimitry Andricinline
31807a984708SDavid Chisnallgslice_array<_Tp>
31817a984708SDavid Chisnallvalarray<_Tp>::operator[](gslice&& __gs)
31827a984708SDavid Chisnall{
31837a984708SDavid Chisnall    return gslice_array<value_type>(move(__gs), *this);
31847a984708SDavid Chisnall}
31857a984708SDavid Chisnall
3186540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
31877a984708SDavid Chisnall
31887a984708SDavid Chisnalltemplate <class _Tp>
31899729cf09SDimitry Andricinline
31907a984708SDavid Chisnall__val_expr<__mask_expr<const valarray<_Tp>&> >
31917a984708SDavid Chisnallvalarray<_Tp>::operator[](const valarray<bool>& __vb) const
31927a984708SDavid Chisnall{
31937a984708SDavid Chisnall    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this));
31947a984708SDavid Chisnall}
31957a984708SDavid Chisnall
31967a984708SDavid Chisnalltemplate <class _Tp>
31979729cf09SDimitry Andricinline
31987a984708SDavid Chisnallmask_array<_Tp>
31997a984708SDavid Chisnallvalarray<_Tp>::operator[](const valarray<bool>& __vb)
32007a984708SDavid Chisnall{
32017a984708SDavid Chisnall    return mask_array<value_type>(__vb, *this);
32027a984708SDavid Chisnall}
32037a984708SDavid Chisnall
3204540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
32057a984708SDavid Chisnall
32067a984708SDavid Chisnalltemplate <class _Tp>
32079729cf09SDimitry Andricinline
32087a984708SDavid Chisnall__val_expr<__mask_expr<const valarray<_Tp>&> >
32097a984708SDavid Chisnallvalarray<_Tp>::operator[](valarray<bool>&& __vb) const
32107a984708SDavid Chisnall{
32117a984708SDavid Chisnall    return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this));
32127a984708SDavid Chisnall}
32137a984708SDavid Chisnall
32147a984708SDavid Chisnalltemplate <class _Tp>
32159729cf09SDimitry Andricinline
32167a984708SDavid Chisnallmask_array<_Tp>
32177a984708SDavid Chisnallvalarray<_Tp>::operator[](valarray<bool>&& __vb)
32187a984708SDavid Chisnall{
32197a984708SDavid Chisnall    return mask_array<value_type>(move(__vb), *this);
32207a984708SDavid Chisnall}
32217a984708SDavid Chisnall
3222540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
32237a984708SDavid Chisnall
32247a984708SDavid Chisnalltemplate <class _Tp>
32259729cf09SDimitry Andricinline
32267a984708SDavid Chisnall__val_expr<__indirect_expr<const valarray<_Tp>&> >
32277a984708SDavid Chisnallvalarray<_Tp>::operator[](const valarray<size_t>& __vs) const
32287a984708SDavid Chisnall{
32297a984708SDavid Chisnall    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this));
32307a984708SDavid Chisnall}
32317a984708SDavid Chisnall
32327a984708SDavid Chisnalltemplate <class _Tp>
32339729cf09SDimitry Andricinline
32347a984708SDavid Chisnallindirect_array<_Tp>
32357a984708SDavid Chisnallvalarray<_Tp>::operator[](const valarray<size_t>& __vs)
32367a984708SDavid Chisnall{
32377a984708SDavid Chisnall    return indirect_array<value_type>(__vs, *this);
32387a984708SDavid Chisnall}
32397a984708SDavid Chisnall
3240540d2a8bSDimitry Andric#ifndef _LIBCPP_CXX03_LANG
32417a984708SDavid Chisnall
32427a984708SDavid Chisnalltemplate <class _Tp>
32439729cf09SDimitry Andricinline
32447a984708SDavid Chisnall__val_expr<__indirect_expr<const valarray<_Tp>&> >
32457a984708SDavid Chisnallvalarray<_Tp>::operator[](valarray<size_t>&& __vs) const
32467a984708SDavid Chisnall{
32477a984708SDavid Chisnall    return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this));
32487a984708SDavid Chisnall}
32497a984708SDavid Chisnall
32507a984708SDavid Chisnalltemplate <class _Tp>
32519729cf09SDimitry Andricinline
32527a984708SDavid Chisnallindirect_array<_Tp>
32537a984708SDavid Chisnallvalarray<_Tp>::operator[](valarray<size_t>&& __vs)
32547a984708SDavid Chisnall{
32557a984708SDavid Chisnall    return indirect_array<value_type>(move(__vs), *this);
32567a984708SDavid Chisnall}
32577a984708SDavid Chisnall
3258540d2a8bSDimitry Andric#endif  // _LIBCPP_CXX03_LANG
32597a984708SDavid Chisnall
32607a984708SDavid Chisnalltemplate <class _Tp>
32617a984708SDavid Chisnallvalarray<_Tp>
32627a984708SDavid Chisnallvalarray<_Tp>::operator+() const
32637a984708SDavid Chisnall{
32647a984708SDavid Chisnall    valarray<value_type> __r;
32657a984708SDavid Chisnall    size_t __n = size();
32667a984708SDavid Chisnall    if (__n)
32677a984708SDavid Chisnall    {
32687a984708SDavid Chisnall        __r.__begin_ =
32697a984708SDavid Chisnall            __r.__end_ =
32704ba319b5SDimitry Andric                static_cast<value_type*>(
3271*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
32727a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
32737a984708SDavid Chisnall            ::new (__r.__end_) value_type(+*__p);
32747a984708SDavid Chisnall    }
32757a984708SDavid Chisnall    return __r;
32767a984708SDavid Chisnall}
32777a984708SDavid Chisnall
32787a984708SDavid Chisnalltemplate <class _Tp>
32797a984708SDavid Chisnallvalarray<_Tp>
32807a984708SDavid Chisnallvalarray<_Tp>::operator-() const
32817a984708SDavid Chisnall{
32827a984708SDavid Chisnall    valarray<value_type> __r;
32837a984708SDavid Chisnall    size_t __n = size();
32847a984708SDavid Chisnall    if (__n)
32857a984708SDavid Chisnall    {
32867a984708SDavid Chisnall        __r.__begin_ =
32877a984708SDavid Chisnall            __r.__end_ =
32884ba319b5SDimitry Andric                static_cast<value_type*>(
3289*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
32907a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
32917a984708SDavid Chisnall            ::new (__r.__end_) value_type(-*__p);
32927a984708SDavid Chisnall    }
32937a984708SDavid Chisnall    return __r;
32947a984708SDavid Chisnall}
32957a984708SDavid Chisnall
32967a984708SDavid Chisnalltemplate <class _Tp>
32977a984708SDavid Chisnallvalarray<_Tp>
32987a984708SDavid Chisnallvalarray<_Tp>::operator~() const
32997a984708SDavid Chisnall{
33007a984708SDavid Chisnall    valarray<value_type> __r;
33017a984708SDavid Chisnall    size_t __n = size();
33027a984708SDavid Chisnall    if (__n)
33037a984708SDavid Chisnall    {
33047a984708SDavid Chisnall        __r.__begin_ =
33057a984708SDavid Chisnall            __r.__end_ =
33064ba319b5SDimitry Andric                static_cast<value_type*>(
3307*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
33087a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
33097a984708SDavid Chisnall            ::new (__r.__end_) value_type(~*__p);
33107a984708SDavid Chisnall    }
33117a984708SDavid Chisnall    return __r;
33127a984708SDavid Chisnall}
33137a984708SDavid Chisnall
33147a984708SDavid Chisnalltemplate <class _Tp>
33157a984708SDavid Chisnallvalarray<bool>
33167a984708SDavid Chisnallvalarray<_Tp>::operator!() const
33177a984708SDavid Chisnall{
33187a984708SDavid Chisnall    valarray<bool> __r;
33197a984708SDavid Chisnall    size_t __n = size();
33207a984708SDavid Chisnall    if (__n)
33217a984708SDavid Chisnall    {
33227a984708SDavid Chisnall        __r.__begin_ =
33237a984708SDavid Chisnall            __r.__end_ =
3324*b5893f02SDimitry Andric                static_cast<bool*>(_VSTD::__libcpp_allocate(__n * sizeof(bool), _LIBCPP_ALIGNOF(bool)));
33257a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
33267a984708SDavid Chisnall            ::new (__r.__end_) bool(!*__p);
33277a984708SDavid Chisnall    }
33287a984708SDavid Chisnall    return __r;
33297a984708SDavid Chisnall}
33307a984708SDavid Chisnall
33317a984708SDavid Chisnalltemplate <class _Tp>
33329729cf09SDimitry Andricinline
33337a984708SDavid Chisnallvalarray<_Tp>&
33347a984708SDavid Chisnallvalarray<_Tp>::operator*=(const value_type& __x)
33357a984708SDavid Chisnall{
33367a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33377a984708SDavid Chisnall        *__p *= __x;
33387a984708SDavid Chisnall    return *this;
33397a984708SDavid Chisnall}
33407a984708SDavid Chisnall
33417a984708SDavid Chisnalltemplate <class _Tp>
33429729cf09SDimitry Andricinline
33437a984708SDavid Chisnallvalarray<_Tp>&
33447a984708SDavid Chisnallvalarray<_Tp>::operator/=(const value_type& __x)
33457a984708SDavid Chisnall{
33467a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33477a984708SDavid Chisnall        *__p /= __x;
33487a984708SDavid Chisnall    return *this;
33497a984708SDavid Chisnall}
33507a984708SDavid Chisnall
33517a984708SDavid Chisnalltemplate <class _Tp>
33529729cf09SDimitry Andricinline
33537a984708SDavid Chisnallvalarray<_Tp>&
33547a984708SDavid Chisnallvalarray<_Tp>::operator%=(const value_type& __x)
33557a984708SDavid Chisnall{
33567a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33577a984708SDavid Chisnall        *__p %= __x;
33587a984708SDavid Chisnall    return *this;
33597a984708SDavid Chisnall}
33607a984708SDavid Chisnall
33617a984708SDavid Chisnalltemplate <class _Tp>
33629729cf09SDimitry Andricinline
33637a984708SDavid Chisnallvalarray<_Tp>&
33647a984708SDavid Chisnallvalarray<_Tp>::operator+=(const value_type& __x)
33657a984708SDavid Chisnall{
33667a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33677a984708SDavid Chisnall        *__p += __x;
33687a984708SDavid Chisnall    return *this;
33697a984708SDavid Chisnall}
33707a984708SDavid Chisnall
33717a984708SDavid Chisnalltemplate <class _Tp>
33729729cf09SDimitry Andricinline
33737a984708SDavid Chisnallvalarray<_Tp>&
33747a984708SDavid Chisnallvalarray<_Tp>::operator-=(const value_type& __x)
33757a984708SDavid Chisnall{
33767a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33777a984708SDavid Chisnall        *__p -= __x;
33787a984708SDavid Chisnall    return *this;
33797a984708SDavid Chisnall}
33807a984708SDavid Chisnall
33817a984708SDavid Chisnalltemplate <class _Tp>
33829729cf09SDimitry Andricinline
33837a984708SDavid Chisnallvalarray<_Tp>&
33847a984708SDavid Chisnallvalarray<_Tp>::operator^=(const value_type& __x)
33857a984708SDavid Chisnall{
33867a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33877a984708SDavid Chisnall        *__p ^= __x;
33887a984708SDavid Chisnall    return *this;
33897a984708SDavid Chisnall}
33907a984708SDavid Chisnall
33917a984708SDavid Chisnalltemplate <class _Tp>
33929729cf09SDimitry Andricinline
33937a984708SDavid Chisnallvalarray<_Tp>&
33947a984708SDavid Chisnallvalarray<_Tp>::operator&=(const value_type& __x)
33957a984708SDavid Chisnall{
33967a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
33977a984708SDavid Chisnall        *__p &= __x;
33987a984708SDavid Chisnall    return *this;
33997a984708SDavid Chisnall}
34007a984708SDavid Chisnall
34017a984708SDavid Chisnalltemplate <class _Tp>
34029729cf09SDimitry Andricinline
34037a984708SDavid Chisnallvalarray<_Tp>&
34047a984708SDavid Chisnallvalarray<_Tp>::operator|=(const value_type& __x)
34057a984708SDavid Chisnall{
34067a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
34077a984708SDavid Chisnall        *__p |= __x;
34087a984708SDavid Chisnall    return *this;
34097a984708SDavid Chisnall}
34107a984708SDavid Chisnall
34117a984708SDavid Chisnalltemplate <class _Tp>
34129729cf09SDimitry Andricinline
34137a984708SDavid Chisnallvalarray<_Tp>&
34147a984708SDavid Chisnallvalarray<_Tp>::operator<<=(const value_type& __x)
34157a984708SDavid Chisnall{
34167a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
34177a984708SDavid Chisnall        *__p <<= __x;
34187a984708SDavid Chisnall    return *this;
34197a984708SDavid Chisnall}
34207a984708SDavid Chisnall
34217a984708SDavid Chisnalltemplate <class _Tp>
34229729cf09SDimitry Andricinline
34237a984708SDavid Chisnallvalarray<_Tp>&
34247a984708SDavid Chisnallvalarray<_Tp>::operator>>=(const value_type& __x)
34257a984708SDavid Chisnall{
34267a984708SDavid Chisnall    for (value_type* __p = __begin_; __p != __end_; ++__p)
34277a984708SDavid Chisnall        *__p >>= __x;
34287a984708SDavid Chisnall    return *this;
34297a984708SDavid Chisnall}
34307a984708SDavid Chisnall
34317a984708SDavid Chisnalltemplate <class _Tp>
34327a984708SDavid Chisnalltemplate <class _Expr>
34339729cf09SDimitry Andricinline
34347a984708SDavid Chisnalltypename enable_if
34357a984708SDavid Chisnall<
34367a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
34377a984708SDavid Chisnall    valarray<_Tp>&
34387a984708SDavid Chisnall>::type
34397a984708SDavid Chisnallvalarray<_Tp>::operator*=(const _Expr& __v)
34407a984708SDavid Chisnall{
34417a984708SDavid Chisnall    size_t __i = 0;
34427a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34437a984708SDavid Chisnall        *__t *= __v[__i];
34447a984708SDavid Chisnall    return *this;
34457a984708SDavid Chisnall}
34467a984708SDavid Chisnall
34477a984708SDavid Chisnalltemplate <class _Tp>
34487a984708SDavid Chisnalltemplate <class _Expr>
34499729cf09SDimitry Andricinline
34507a984708SDavid Chisnalltypename enable_if
34517a984708SDavid Chisnall<
34527a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
34537a984708SDavid Chisnall    valarray<_Tp>&
34547a984708SDavid Chisnall>::type
34557a984708SDavid Chisnallvalarray<_Tp>::operator/=(const _Expr& __v)
34567a984708SDavid Chisnall{
34577a984708SDavid Chisnall    size_t __i = 0;
34587a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34597a984708SDavid Chisnall        *__t /= __v[__i];
34607a984708SDavid Chisnall    return *this;
34617a984708SDavid Chisnall}
34627a984708SDavid Chisnall
34637a984708SDavid Chisnalltemplate <class _Tp>
34647a984708SDavid Chisnalltemplate <class _Expr>
34659729cf09SDimitry Andricinline
34667a984708SDavid Chisnalltypename enable_if
34677a984708SDavid Chisnall<
34687a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
34697a984708SDavid Chisnall    valarray<_Tp>&
34707a984708SDavid Chisnall>::type
34717a984708SDavid Chisnallvalarray<_Tp>::operator%=(const _Expr& __v)
34727a984708SDavid Chisnall{
34737a984708SDavid Chisnall    size_t __i = 0;
34747a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34757a984708SDavid Chisnall        *__t %= __v[__i];
34767a984708SDavid Chisnall    return *this;
34777a984708SDavid Chisnall}
34787a984708SDavid Chisnall
34797a984708SDavid Chisnalltemplate <class _Tp>
34807a984708SDavid Chisnalltemplate <class _Expr>
34819729cf09SDimitry Andricinline
34827a984708SDavid Chisnalltypename enable_if
34837a984708SDavid Chisnall<
34847a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
34857a984708SDavid Chisnall    valarray<_Tp>&
34867a984708SDavid Chisnall>::type
34877a984708SDavid Chisnallvalarray<_Tp>::operator+=(const _Expr& __v)
34887a984708SDavid Chisnall{
34897a984708SDavid Chisnall    size_t __i = 0;
34907a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
34917a984708SDavid Chisnall        *__t += __v[__i];
34927a984708SDavid Chisnall    return *this;
34937a984708SDavid Chisnall}
34947a984708SDavid Chisnall
34957a984708SDavid Chisnalltemplate <class _Tp>
34967a984708SDavid Chisnalltemplate <class _Expr>
34979729cf09SDimitry Andricinline
34987a984708SDavid Chisnalltypename enable_if
34997a984708SDavid Chisnall<
35007a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35017a984708SDavid Chisnall    valarray<_Tp>&
35027a984708SDavid Chisnall>::type
35037a984708SDavid Chisnallvalarray<_Tp>::operator-=(const _Expr& __v)
35047a984708SDavid Chisnall{
35057a984708SDavid Chisnall    size_t __i = 0;
35067a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35077a984708SDavid Chisnall        *__t -= __v[__i];
35087a984708SDavid Chisnall    return *this;
35097a984708SDavid Chisnall}
35107a984708SDavid Chisnall
35117a984708SDavid Chisnalltemplate <class _Tp>
35127a984708SDavid Chisnalltemplate <class _Expr>
35139729cf09SDimitry Andricinline
35147a984708SDavid Chisnalltypename enable_if
35157a984708SDavid Chisnall<
35167a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35177a984708SDavid Chisnall    valarray<_Tp>&
35187a984708SDavid Chisnall>::type
35197a984708SDavid Chisnallvalarray<_Tp>::operator^=(const _Expr& __v)
35207a984708SDavid Chisnall{
35217a984708SDavid Chisnall    size_t __i = 0;
35227a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35237a984708SDavid Chisnall        *__t ^= __v[__i];
35247a984708SDavid Chisnall    return *this;
35257a984708SDavid Chisnall}
35267a984708SDavid Chisnall
35277a984708SDavid Chisnalltemplate <class _Tp>
35287a984708SDavid Chisnalltemplate <class _Expr>
35299729cf09SDimitry Andricinline
35307a984708SDavid Chisnalltypename enable_if
35317a984708SDavid Chisnall<
35327a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35337a984708SDavid Chisnall    valarray<_Tp>&
35347a984708SDavid Chisnall>::type
35357a984708SDavid Chisnallvalarray<_Tp>::operator|=(const _Expr& __v)
35367a984708SDavid Chisnall{
35377a984708SDavid Chisnall    size_t __i = 0;
35387a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35397a984708SDavid Chisnall        *__t |= __v[__i];
35407a984708SDavid Chisnall    return *this;
35417a984708SDavid Chisnall}
35427a984708SDavid Chisnall
35437a984708SDavid Chisnalltemplate <class _Tp>
35447a984708SDavid Chisnalltemplate <class _Expr>
35459729cf09SDimitry Andricinline
35467a984708SDavid Chisnalltypename enable_if
35477a984708SDavid Chisnall<
35487a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35497a984708SDavid Chisnall    valarray<_Tp>&
35507a984708SDavid Chisnall>::type
35517a984708SDavid Chisnallvalarray<_Tp>::operator&=(const _Expr& __v)
35527a984708SDavid Chisnall{
35537a984708SDavid Chisnall    size_t __i = 0;
35547a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35557a984708SDavid Chisnall        *__t &= __v[__i];
35567a984708SDavid Chisnall    return *this;
35577a984708SDavid Chisnall}
35587a984708SDavid Chisnall
35597a984708SDavid Chisnalltemplate <class _Tp>
35607a984708SDavid Chisnalltemplate <class _Expr>
35619729cf09SDimitry Andricinline
35627a984708SDavid Chisnalltypename enable_if
35637a984708SDavid Chisnall<
35647a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35657a984708SDavid Chisnall    valarray<_Tp>&
35667a984708SDavid Chisnall>::type
35677a984708SDavid Chisnallvalarray<_Tp>::operator<<=(const _Expr& __v)
35687a984708SDavid Chisnall{
35697a984708SDavid Chisnall    size_t __i = 0;
35707a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35717a984708SDavid Chisnall        *__t <<= __v[__i];
35727a984708SDavid Chisnall    return *this;
35737a984708SDavid Chisnall}
35747a984708SDavid Chisnall
35757a984708SDavid Chisnalltemplate <class _Tp>
35767a984708SDavid Chisnalltemplate <class _Expr>
35779729cf09SDimitry Andricinline
35787a984708SDavid Chisnalltypename enable_if
35797a984708SDavid Chisnall<
35807a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
35817a984708SDavid Chisnall    valarray<_Tp>&
35827a984708SDavid Chisnall>::type
35837a984708SDavid Chisnallvalarray<_Tp>::operator>>=(const _Expr& __v)
35847a984708SDavid Chisnall{
35857a984708SDavid Chisnall    size_t __i = 0;
35867a984708SDavid Chisnall    for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i)
35877a984708SDavid Chisnall        *__t >>= __v[__i];
35887a984708SDavid Chisnall    return *this;
35897a984708SDavid Chisnall}
35907a984708SDavid Chisnall
35917a984708SDavid Chisnalltemplate <class _Tp>
35929729cf09SDimitry Andricinline
35937a984708SDavid Chisnallvoid
3594936e9439SDimitry Andricvalarray<_Tp>::swap(valarray& __v) _NOEXCEPT
35957a984708SDavid Chisnall{
35967a984708SDavid Chisnall    _VSTD::swap(__begin_, __v.__begin_);
35977a984708SDavid Chisnall    _VSTD::swap(__end_, __v.__end_);
35987a984708SDavid Chisnall}
35997a984708SDavid Chisnall
36007a984708SDavid Chisnalltemplate <class _Tp>
36019729cf09SDimitry Andricinline
36027a984708SDavid Chisnall_Tp
36037a984708SDavid Chisnallvalarray<_Tp>::sum() const
36047a984708SDavid Chisnall{
36057a984708SDavid Chisnall    if (__begin_ == __end_)
36067a984708SDavid Chisnall        return value_type();
36077a984708SDavid Chisnall    const value_type* __p = __begin_;
36087a984708SDavid Chisnall    _Tp __r = *__p;
36097a984708SDavid Chisnall    for (++__p; __p != __end_; ++__p)
36107a984708SDavid Chisnall        __r += *__p;
36117a984708SDavid Chisnall    return __r;
36127a984708SDavid Chisnall}
36137a984708SDavid Chisnall
36147a984708SDavid Chisnalltemplate <class _Tp>
36159729cf09SDimitry Andricinline
36167a984708SDavid Chisnall_Tp
36177a984708SDavid Chisnallvalarray<_Tp>::min() const
36187a984708SDavid Chisnall{
36197a984708SDavid Chisnall    if (__begin_ == __end_)
36207a984708SDavid Chisnall        return value_type();
36217a984708SDavid Chisnall    return *_VSTD::min_element(__begin_, __end_);
36227a984708SDavid Chisnall}
36237a984708SDavid Chisnall
36247a984708SDavid Chisnalltemplate <class _Tp>
36259729cf09SDimitry Andricinline
36267a984708SDavid Chisnall_Tp
36277a984708SDavid Chisnallvalarray<_Tp>::max() const
36287a984708SDavid Chisnall{
36297a984708SDavid Chisnall    if (__begin_ == __end_)
36307a984708SDavid Chisnall        return value_type();
36317a984708SDavid Chisnall    return *_VSTD::max_element(__begin_, __end_);
36327a984708SDavid Chisnall}
36337a984708SDavid Chisnall
36347a984708SDavid Chisnalltemplate <class _Tp>
36357a984708SDavid Chisnallvalarray<_Tp>
36367a984708SDavid Chisnallvalarray<_Tp>::shift(int __i) const
36377a984708SDavid Chisnall{
36387a984708SDavid Chisnall    valarray<value_type> __r;
36397a984708SDavid Chisnall    size_t __n = size();
36407a984708SDavid Chisnall    if (__n)
36417a984708SDavid Chisnall    {
36427a984708SDavid Chisnall        __r.__begin_ =
36437a984708SDavid Chisnall            __r.__end_ =
36444ba319b5SDimitry Andric                static_cast<value_type*>(
3645*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
36467a984708SDavid Chisnall        const value_type* __sb;
36477a984708SDavid Chisnall        value_type* __tb;
36487a984708SDavid Chisnall        value_type* __te;
36497a984708SDavid Chisnall        if (__i >= 0)
36507a984708SDavid Chisnall        {
36517a984708SDavid Chisnall            __i = _VSTD::min(__i, static_cast<int>(__n));
36527a984708SDavid Chisnall            __sb = __begin_ + __i;
36537a984708SDavid Chisnall            __tb = __r.__begin_;
36547a984708SDavid Chisnall            __te = __r.__begin_ + (__n - __i);
36557a984708SDavid Chisnall        }
36567a984708SDavid Chisnall        else
36577a984708SDavid Chisnall        {
36587a984708SDavid Chisnall            __i = _VSTD::min(-__i, static_cast<int>(__n));
36597a984708SDavid Chisnall            __sb = __begin_;
36607a984708SDavid Chisnall            __tb = __r.__begin_ + __i;
36617a984708SDavid Chisnall            __te = __r.__begin_ + __n;
36627a984708SDavid Chisnall        }
36637a984708SDavid Chisnall        for (; __r.__end_ != __tb; ++__r.__end_)
36647a984708SDavid Chisnall            ::new (__r.__end_) value_type();
36657a984708SDavid Chisnall        for (; __r.__end_ != __te; ++__r.__end_, ++__sb)
36667a984708SDavid Chisnall            ::new (__r.__end_) value_type(*__sb);
36677a984708SDavid Chisnall        for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_)
36687a984708SDavid Chisnall            ::new (__r.__end_) value_type();
36697a984708SDavid Chisnall    }
36707a984708SDavid Chisnall    return __r;
36717a984708SDavid Chisnall}
36727a984708SDavid Chisnall
36737a984708SDavid Chisnalltemplate <class _Tp>
36747a984708SDavid Chisnallvalarray<_Tp>
36757a984708SDavid Chisnallvalarray<_Tp>::cshift(int __i) const
36767a984708SDavid Chisnall{
36777a984708SDavid Chisnall    valarray<value_type> __r;
36787a984708SDavid Chisnall    size_t __n = size();
36797a984708SDavid Chisnall    if (__n)
36807a984708SDavid Chisnall    {
36817a984708SDavid Chisnall        __r.__begin_ =
36827a984708SDavid Chisnall            __r.__end_ =
36834ba319b5SDimitry Andric                static_cast<value_type*>(
3684*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
36857a984708SDavid Chisnall        __i %= static_cast<int>(__n);
36867a984708SDavid Chisnall        const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i;
36877a984708SDavid Chisnall        for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s)
36887a984708SDavid Chisnall            ::new (__r.__end_) value_type(*__s);
36897a984708SDavid Chisnall        for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s)
36907a984708SDavid Chisnall            ::new (__r.__end_) value_type(*__s);
36917a984708SDavid Chisnall    }
36927a984708SDavid Chisnall    return __r;
36937a984708SDavid Chisnall}
36947a984708SDavid Chisnall
36957a984708SDavid Chisnalltemplate <class _Tp>
36967a984708SDavid Chisnallvalarray<_Tp>
36977a984708SDavid Chisnallvalarray<_Tp>::apply(value_type __f(value_type)) const
36987a984708SDavid Chisnall{
36997a984708SDavid Chisnall    valarray<value_type> __r;
37007a984708SDavid Chisnall    size_t __n = size();
37017a984708SDavid Chisnall    if (__n)
37027a984708SDavid Chisnall    {
37037a984708SDavid Chisnall        __r.__begin_ =
37047a984708SDavid Chisnall            __r.__end_ =
37054ba319b5SDimitry Andric                static_cast<value_type*>(
3706*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
37077a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
37087a984708SDavid Chisnall            ::new (__r.__end_) value_type(__f(*__p));
37097a984708SDavid Chisnall    }
37107a984708SDavid Chisnall    return __r;
37117a984708SDavid Chisnall}
37127a984708SDavid Chisnall
37137a984708SDavid Chisnalltemplate <class _Tp>
37147a984708SDavid Chisnallvalarray<_Tp>
37157a984708SDavid Chisnallvalarray<_Tp>::apply(value_type __f(const value_type&)) const
37167a984708SDavid Chisnall{
37177a984708SDavid Chisnall    valarray<value_type> __r;
37187a984708SDavid Chisnall    size_t __n = size();
37197a984708SDavid Chisnall    if (__n)
37207a984708SDavid Chisnall    {
37217a984708SDavid Chisnall        __r.__begin_ =
37227a984708SDavid Chisnall            __r.__end_ =
37234ba319b5SDimitry Andric                static_cast<value_type*>(
3724*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
37257a984708SDavid Chisnall        for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n)
37267a984708SDavid Chisnall            ::new (__r.__end_) value_type(__f(*__p));
37277a984708SDavid Chisnall    }
37287a984708SDavid Chisnall    return __r;
37297a984708SDavid Chisnall}
37307a984708SDavid Chisnall
37317a984708SDavid Chisnalltemplate <class _Tp>
3732*b5893f02SDimitry Andricinline
3733*b5893f02SDimitry Andricvoid valarray<_Tp>::__clear(size_t __capacity)
37347a984708SDavid Chisnall{
37357a984708SDavid Chisnall  if (__begin_ != nullptr)
37367a984708SDavid Chisnall  {
37377a984708SDavid Chisnall    while (__end_ != __begin_)
37387a984708SDavid Chisnall      (--__end_)->~value_type();
3739*b5893f02SDimitry Andric    _VSTD::__libcpp_deallocate(__begin_, __capacity * sizeof(value_type), _LIBCPP_ALIGNOF(value_type));
37407a984708SDavid Chisnall    __begin_ = __end_ = nullptr;
37417a984708SDavid Chisnall  }
37424ba319b5SDimitry Andric}
37434ba319b5SDimitry Andric
37444ba319b5SDimitry Andrictemplate <class _Tp>
37454ba319b5SDimitry Andricvoid
37464ba319b5SDimitry Andricvalarray<_Tp>::resize(size_t __n, value_type __x)
37474ba319b5SDimitry Andric{
3748*b5893f02SDimitry Andric    __clear(size());
37497a984708SDavid Chisnall    if (__n)
37507a984708SDavid Chisnall    {
37514ba319b5SDimitry Andric        __begin_ = __end_ = static_cast<value_type*>(
3752*b5893f02SDimitry Andric           _VSTD::__libcpp_allocate(__n * sizeof(value_type), _LIBCPP_ALIGNOF(value_type)));
37537a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
37547a984708SDavid Chisnall        try
37557a984708SDavid Chisnall        {
37567a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
3757*b5893f02SDimitry Andric            for (size_t __n_left = __n; __n_left; --__n_left, ++__end_)
37587a984708SDavid Chisnall                ::new (__end_) value_type(__x);
37597a984708SDavid Chisnall#ifndef _LIBCPP_NO_EXCEPTIONS
37607a984708SDavid Chisnall        }
37617a984708SDavid Chisnall        catch (...)
37627a984708SDavid Chisnall        {
3763*b5893f02SDimitry Andric            __clear(__n);
37647a984708SDavid Chisnall            throw;
37657a984708SDavid Chisnall        }
37667a984708SDavid Chisnall#endif  // _LIBCPP_NO_EXCEPTIONS
37677a984708SDavid Chisnall    }
37687a984708SDavid Chisnall}
37697a984708SDavid Chisnall
37707a984708SDavid Chisnalltemplate<class _Tp>
37717a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
37727a984708SDavid Chisnallvoid
3773936e9439SDimitry Andricswap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT
37747a984708SDavid Chisnall{
37757a984708SDavid Chisnall    __x.swap(__y);
37767a984708SDavid Chisnall}
37777a984708SDavid Chisnall
37787a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
37797a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
37807a984708SDavid Chisnalltypename enable_if
37817a984708SDavid Chisnall<
37827a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
37837a984708SDavid Chisnall    __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> >
37847a984708SDavid Chisnall>::type
37857a984708SDavid Chisnalloperator*(const _Expr1& __x, const _Expr2& __y)
37867a984708SDavid Chisnall{
37877a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
37887a984708SDavid Chisnall    typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op;
37897a984708SDavid Chisnall    return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y));
37907a984708SDavid Chisnall}
37917a984708SDavid Chisnall
37927a984708SDavid Chisnalltemplate<class _Expr>
37937a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
37947a984708SDavid Chisnalltypename enable_if
37957a984708SDavid Chisnall<
37967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
37977a984708SDavid Chisnall    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
37987a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
37997a984708SDavid Chisnall>::type
38007a984708SDavid Chisnalloperator*(const _Expr& __x, const typename _Expr::value_type& __y)
38017a984708SDavid Chisnall{
38027a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
38037a984708SDavid Chisnall    typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op;
38047a984708SDavid Chisnall    return __val_expr<_Op>(_Op(multiplies<value_type>(),
38057a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
38067a984708SDavid Chisnall}
38077a984708SDavid Chisnall
38087a984708SDavid Chisnalltemplate<class _Expr>
38097a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38107a984708SDavid Chisnalltypename enable_if
38117a984708SDavid Chisnall<
38127a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
38137a984708SDavid Chisnall    __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>,
38147a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
38157a984708SDavid Chisnall>::type
38167a984708SDavid Chisnalloperator*(const typename _Expr::value_type& __x, const _Expr& __y)
38177a984708SDavid Chisnall{
38187a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
38197a984708SDavid Chisnall    typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op;
38207a984708SDavid Chisnall    return __val_expr<_Op>(_Op(multiplies<value_type>(),
38217a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
38227a984708SDavid Chisnall}
38237a984708SDavid Chisnall
38247a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
38257a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38267a984708SDavid Chisnalltypename enable_if
38277a984708SDavid Chisnall<
38287a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
38297a984708SDavid Chisnall    __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> >
38307a984708SDavid Chisnall>::type
38317a984708SDavid Chisnalloperator/(const _Expr1& __x, const _Expr2& __y)
38327a984708SDavid Chisnall{
38337a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
38347a984708SDavid Chisnall    typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op;
38357a984708SDavid Chisnall    return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y));
38367a984708SDavid Chisnall}
38377a984708SDavid Chisnall
38387a984708SDavid Chisnalltemplate<class _Expr>
38397a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38407a984708SDavid Chisnalltypename enable_if
38417a984708SDavid Chisnall<
38427a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
38437a984708SDavid Chisnall    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
38447a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
38457a984708SDavid Chisnall>::type
38467a984708SDavid Chisnalloperator/(const _Expr& __x, const typename _Expr::value_type& __y)
38477a984708SDavid Chisnall{
38487a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
38497a984708SDavid Chisnall    typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op;
38507a984708SDavid Chisnall    return __val_expr<_Op>(_Op(divides<value_type>(),
38517a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
38527a984708SDavid Chisnall}
38537a984708SDavid Chisnall
38547a984708SDavid Chisnalltemplate<class _Expr>
38557a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38567a984708SDavid Chisnalltypename enable_if
38577a984708SDavid Chisnall<
38587a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
38597a984708SDavid Chisnall    __val_expr<_BinaryOp<divides<typename _Expr::value_type>,
38607a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
38617a984708SDavid Chisnall>::type
38627a984708SDavid Chisnalloperator/(const typename _Expr::value_type& __x, const _Expr& __y)
38637a984708SDavid Chisnall{
38647a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
38657a984708SDavid Chisnall    typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op;
38667a984708SDavid Chisnall    return __val_expr<_Op>(_Op(divides<value_type>(),
38677a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
38687a984708SDavid Chisnall}
38697a984708SDavid Chisnall
38707a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
38717a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38727a984708SDavid Chisnalltypename enable_if
38737a984708SDavid Chisnall<
38747a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
38757a984708SDavid Chisnall    __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> >
38767a984708SDavid Chisnall>::type
38777a984708SDavid Chisnalloperator%(const _Expr1& __x, const _Expr2& __y)
38787a984708SDavid Chisnall{
38797a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
38807a984708SDavid Chisnall    typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op;
38817a984708SDavid Chisnall    return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y));
38827a984708SDavid Chisnall}
38837a984708SDavid Chisnall
38847a984708SDavid Chisnalltemplate<class _Expr>
38857a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
38867a984708SDavid Chisnalltypename enable_if
38877a984708SDavid Chisnall<
38887a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
38897a984708SDavid Chisnall    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
38907a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
38917a984708SDavid Chisnall>::type
38927a984708SDavid Chisnalloperator%(const _Expr& __x, const typename _Expr::value_type& __y)
38937a984708SDavid Chisnall{
38947a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
38957a984708SDavid Chisnall    typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
38967a984708SDavid Chisnall    return __val_expr<_Op>(_Op(modulus<value_type>(),
38977a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
38987a984708SDavid Chisnall}
38997a984708SDavid Chisnall
39007a984708SDavid Chisnalltemplate<class _Expr>
39017a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39027a984708SDavid Chisnalltypename enable_if
39037a984708SDavid Chisnall<
39047a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
39057a984708SDavid Chisnall    __val_expr<_BinaryOp<modulus<typename _Expr::value_type>,
39067a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
39077a984708SDavid Chisnall>::type
39087a984708SDavid Chisnalloperator%(const typename _Expr::value_type& __x, const _Expr& __y)
39097a984708SDavid Chisnall{
39107a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
39117a984708SDavid Chisnall    typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
39127a984708SDavid Chisnall    return __val_expr<_Op>(_Op(modulus<value_type>(),
39137a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
39147a984708SDavid Chisnall}
39157a984708SDavid Chisnall
39167a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
39177a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39187a984708SDavid Chisnalltypename enable_if
39197a984708SDavid Chisnall<
39207a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
39217a984708SDavid Chisnall    __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> >
39227a984708SDavid Chisnall>::type
39237a984708SDavid Chisnalloperator+(const _Expr1& __x, const _Expr2& __y)
39247a984708SDavid Chisnall{
39257a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
39267a984708SDavid Chisnall    typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op;
39277a984708SDavid Chisnall    return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y));
39287a984708SDavid Chisnall}
39297a984708SDavid Chisnall
39307a984708SDavid Chisnalltemplate<class _Expr>
39317a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39327a984708SDavid Chisnalltypename enable_if
39337a984708SDavid Chisnall<
39347a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
39357a984708SDavid Chisnall    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
39367a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
39377a984708SDavid Chisnall>::type
39387a984708SDavid Chisnalloperator+(const _Expr& __x, const typename _Expr::value_type& __y)
39397a984708SDavid Chisnall{
39407a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
39417a984708SDavid Chisnall    typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
39427a984708SDavid Chisnall    return __val_expr<_Op>(_Op(plus<value_type>(),
39437a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
39447a984708SDavid Chisnall}
39457a984708SDavid Chisnall
39467a984708SDavid Chisnalltemplate<class _Expr>
39477a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39487a984708SDavid Chisnalltypename enable_if
39497a984708SDavid Chisnall<
39507a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
39517a984708SDavid Chisnall    __val_expr<_BinaryOp<plus<typename _Expr::value_type>,
39527a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
39537a984708SDavid Chisnall>::type
39547a984708SDavid Chisnalloperator+(const typename _Expr::value_type& __x, const _Expr& __y)
39557a984708SDavid Chisnall{
39567a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
39577a984708SDavid Chisnall    typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
39587a984708SDavid Chisnall    return __val_expr<_Op>(_Op(plus<value_type>(),
39597a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
39607a984708SDavid Chisnall}
39617a984708SDavid Chisnall
39627a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
39637a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39647a984708SDavid Chisnalltypename enable_if
39657a984708SDavid Chisnall<
39667a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
39677a984708SDavid Chisnall    __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> >
39687a984708SDavid Chisnall>::type
39697a984708SDavid Chisnalloperator-(const _Expr1& __x, const _Expr2& __y)
39707a984708SDavid Chisnall{
39717a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
39727a984708SDavid Chisnall    typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op;
39737a984708SDavid Chisnall    return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y));
39747a984708SDavid Chisnall}
39757a984708SDavid Chisnall
39767a984708SDavid Chisnalltemplate<class _Expr>
39777a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39787a984708SDavid Chisnalltypename enable_if
39797a984708SDavid Chisnall<
39807a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
39817a984708SDavid Chisnall    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
39827a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
39837a984708SDavid Chisnall>::type
39847a984708SDavid Chisnalloperator-(const _Expr& __x, const typename _Expr::value_type& __y)
39857a984708SDavid Chisnall{
39867a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
39877a984708SDavid Chisnall    typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op;
39887a984708SDavid Chisnall    return __val_expr<_Op>(_Op(minus<value_type>(),
39897a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
39907a984708SDavid Chisnall}
39917a984708SDavid Chisnall
39927a984708SDavid Chisnalltemplate<class _Expr>
39937a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
39947a984708SDavid Chisnalltypename enable_if
39957a984708SDavid Chisnall<
39967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
39977a984708SDavid Chisnall    __val_expr<_BinaryOp<minus<typename _Expr::value_type>,
39987a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
39997a984708SDavid Chisnall>::type
40007a984708SDavid Chisnalloperator-(const typename _Expr::value_type& __x, const _Expr& __y)
40017a984708SDavid Chisnall{
40027a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
40037a984708SDavid Chisnall    typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op;
40047a984708SDavid Chisnall    return __val_expr<_Op>(_Op(minus<value_type>(),
40057a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
40067a984708SDavid Chisnall}
40077a984708SDavid Chisnall
40087a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
40097a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40107a984708SDavid Chisnalltypename enable_if
40117a984708SDavid Chisnall<
40127a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
40137a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> >
40147a984708SDavid Chisnall>::type
40157a984708SDavid Chisnalloperator^(const _Expr1& __x, const _Expr2& __y)
40167a984708SDavid Chisnall{
40177a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
40187a984708SDavid Chisnall    typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op;
40197a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y));
40207a984708SDavid Chisnall}
40217a984708SDavid Chisnall
40227a984708SDavid Chisnalltemplate<class _Expr>
40237a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40247a984708SDavid Chisnalltypename enable_if
40257a984708SDavid Chisnall<
40267a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
40277a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
40287a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
40297a984708SDavid Chisnall>::type
40307a984708SDavid Chisnalloperator^(const _Expr& __x, const typename _Expr::value_type& __y)
40317a984708SDavid Chisnall{
40327a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
40337a984708SDavid Chisnall    typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op;
40347a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
40357a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
40367a984708SDavid Chisnall}
40377a984708SDavid Chisnall
40387a984708SDavid Chisnalltemplate<class _Expr>
40397a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40407a984708SDavid Chisnalltypename enable_if
40417a984708SDavid Chisnall<
40427a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
40437a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>,
40447a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
40457a984708SDavid Chisnall>::type
40467a984708SDavid Chisnalloperator^(const typename _Expr::value_type& __x, const _Expr& __y)
40477a984708SDavid Chisnall{
40487a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
40497a984708SDavid Chisnall    typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op;
40507a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_xor<value_type>(),
40517a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
40527a984708SDavid Chisnall}
40537a984708SDavid Chisnall
40547a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
40557a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40567a984708SDavid Chisnalltypename enable_if
40577a984708SDavid Chisnall<
40587a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
40597a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
40607a984708SDavid Chisnall>::type
40617a984708SDavid Chisnalloperator&(const _Expr1& __x, const _Expr2& __y)
40627a984708SDavid Chisnall{
40637a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
40647a984708SDavid Chisnall    typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op;
40657a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y));
40667a984708SDavid Chisnall}
40677a984708SDavid Chisnall
40687a984708SDavid Chisnalltemplate<class _Expr>
40697a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40707a984708SDavid Chisnalltypename enable_if
40717a984708SDavid Chisnall<
40727a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
40737a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
40747a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
40757a984708SDavid Chisnall>::type
40767a984708SDavid Chisnalloperator&(const _Expr& __x, const typename _Expr::value_type& __y)
40777a984708SDavid Chisnall{
40787a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
40797a984708SDavid Chisnall    typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
40807a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_and<value_type>(),
40817a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
40827a984708SDavid Chisnall}
40837a984708SDavid Chisnall
40847a984708SDavid Chisnalltemplate<class _Expr>
40857a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
40867a984708SDavid Chisnalltypename enable_if
40877a984708SDavid Chisnall<
40887a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
40897a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>,
40907a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
40917a984708SDavid Chisnall>::type
40927a984708SDavid Chisnalloperator&(const typename _Expr::value_type& __x, const _Expr& __y)
40937a984708SDavid Chisnall{
40947a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
40957a984708SDavid Chisnall    typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
40967a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_and<value_type>(),
40977a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
40987a984708SDavid Chisnall}
40997a984708SDavid Chisnall
41007a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
41017a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41027a984708SDavid Chisnalltypename enable_if
41037a984708SDavid Chisnall<
41047a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
41057a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
41067a984708SDavid Chisnall>::type
41077a984708SDavid Chisnalloperator|(const _Expr1& __x, const _Expr2& __y)
41087a984708SDavid Chisnall{
41097a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
41107a984708SDavid Chisnall    typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op;
41117a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y));
41127a984708SDavid Chisnall}
41137a984708SDavid Chisnall
41147a984708SDavid Chisnalltemplate<class _Expr>
41157a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41167a984708SDavid Chisnalltypename enable_if
41177a984708SDavid Chisnall<
41187a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
41197a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
41207a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
41217a984708SDavid Chisnall>::type
41227a984708SDavid Chisnalloperator|(const _Expr& __x, const typename _Expr::value_type& __y)
41237a984708SDavid Chisnall{
41247a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
41257a984708SDavid Chisnall    typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
41267a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_or<value_type>(),
41277a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
41287a984708SDavid Chisnall}
41297a984708SDavid Chisnall
41307a984708SDavid Chisnalltemplate<class _Expr>
41317a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41327a984708SDavid Chisnalltypename enable_if
41337a984708SDavid Chisnall<
41347a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
41357a984708SDavid Chisnall    __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>,
41367a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
41377a984708SDavid Chisnall>::type
41387a984708SDavid Chisnalloperator|(const typename _Expr::value_type& __x, const _Expr& __y)
41397a984708SDavid Chisnall{
41407a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
41417a984708SDavid Chisnall    typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
41427a984708SDavid Chisnall    return __val_expr<_Op>(_Op(bit_or<value_type>(),
41437a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
41447a984708SDavid Chisnall}
41457a984708SDavid Chisnall
41467a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
41477a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41487a984708SDavid Chisnalltypename enable_if
41497a984708SDavid Chisnall<
41507a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
41517a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> >
41527a984708SDavid Chisnall>::type
41537a984708SDavid Chisnalloperator<<(const _Expr1& __x, const _Expr2& __y)
41547a984708SDavid Chisnall{
41557a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
41567a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op;
41577a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y));
41587a984708SDavid Chisnall}
41597a984708SDavid Chisnall
41607a984708SDavid Chisnalltemplate<class _Expr>
41617a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41627a984708SDavid Chisnalltypename enable_if
41637a984708SDavid Chisnall<
41647a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
41657a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
41667a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
41677a984708SDavid Chisnall>::type
41687a984708SDavid Chisnalloperator<<(const _Expr& __x, const typename _Expr::value_type& __y)
41697a984708SDavid Chisnall{
41707a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
41717a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op;
41727a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
41737a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
41747a984708SDavid Chisnall}
41757a984708SDavid Chisnall
41767a984708SDavid Chisnalltemplate<class _Expr>
41777a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41787a984708SDavid Chisnalltypename enable_if
41797a984708SDavid Chisnall<
41807a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
41817a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>,
41827a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
41837a984708SDavid Chisnall>::type
41847a984708SDavid Chisnalloperator<<(const typename _Expr::value_type& __x, const _Expr& __y)
41857a984708SDavid Chisnall{
41867a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
41877a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op;
41887a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(),
41897a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
41907a984708SDavid Chisnall}
41917a984708SDavid Chisnall
41927a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
41937a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
41947a984708SDavid Chisnalltypename enable_if
41957a984708SDavid Chisnall<
41967a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
41977a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> >
41987a984708SDavid Chisnall>::type
41997a984708SDavid Chisnalloperator>>(const _Expr1& __x, const _Expr2& __y)
42007a984708SDavid Chisnall{
42017a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
42027a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op;
42037a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y));
42047a984708SDavid Chisnall}
42057a984708SDavid Chisnall
42067a984708SDavid Chisnalltemplate<class _Expr>
42077a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42087a984708SDavid Chisnalltypename enable_if
42097a984708SDavid Chisnall<
42107a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
42117a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
42127a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
42137a984708SDavid Chisnall>::type
42147a984708SDavid Chisnalloperator>>(const _Expr& __x, const typename _Expr::value_type& __y)
42157a984708SDavid Chisnall{
42167a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
42177a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op;
42187a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
42197a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
42207a984708SDavid Chisnall}
42217a984708SDavid Chisnall
42227a984708SDavid Chisnalltemplate<class _Expr>
42237a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42247a984708SDavid Chisnalltypename enable_if
42257a984708SDavid Chisnall<
42267a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
42277a984708SDavid Chisnall    __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>,
42287a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
42297a984708SDavid Chisnall>::type
42307a984708SDavid Chisnalloperator>>(const typename _Expr::value_type& __x, const _Expr& __y)
42317a984708SDavid Chisnall{
42327a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
42337a984708SDavid Chisnall    typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op;
42347a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(),
42357a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
42367a984708SDavid Chisnall}
42377a984708SDavid Chisnall
42387a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
42397a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42407a984708SDavid Chisnalltypename enable_if
42417a984708SDavid Chisnall<
42427a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
42437a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> >
42447a984708SDavid Chisnall>::type
42457a984708SDavid Chisnalloperator&&(const _Expr1& __x, const _Expr2& __y)
42467a984708SDavid Chisnall{
42477a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
42487a984708SDavid Chisnall    typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op;
42497a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y));
42507a984708SDavid Chisnall}
42517a984708SDavid Chisnall
42527a984708SDavid Chisnalltemplate<class _Expr>
42537a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42547a984708SDavid Chisnalltypename enable_if
42557a984708SDavid Chisnall<
42567a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
42577a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
42587a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
42597a984708SDavid Chisnall>::type
42607a984708SDavid Chisnalloperator&&(const _Expr& __x, const typename _Expr::value_type& __y)
42617a984708SDavid Chisnall{
42627a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
42637a984708SDavid Chisnall    typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op;
42647a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_and<value_type>(),
42657a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
42667a984708SDavid Chisnall}
42677a984708SDavid Chisnall
42687a984708SDavid Chisnalltemplate<class _Expr>
42697a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42707a984708SDavid Chisnalltypename enable_if
42717a984708SDavid Chisnall<
42727a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
42737a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>,
42747a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
42757a984708SDavid Chisnall>::type
42767a984708SDavid Chisnalloperator&&(const typename _Expr::value_type& __x, const _Expr& __y)
42777a984708SDavid Chisnall{
42787a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
42797a984708SDavid Chisnall    typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op;
42807a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_and<value_type>(),
42817a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
42827a984708SDavid Chisnall}
42837a984708SDavid Chisnall
42847a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
42857a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
42867a984708SDavid Chisnalltypename enable_if
42877a984708SDavid Chisnall<
42887a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
42897a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> >
42907a984708SDavid Chisnall>::type
42917a984708SDavid Chisnalloperator||(const _Expr1& __x, const _Expr2& __y)
42927a984708SDavid Chisnall{
42937a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
42947a984708SDavid Chisnall    typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op;
42957a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y));
42967a984708SDavid Chisnall}
42977a984708SDavid Chisnall
42987a984708SDavid Chisnalltemplate<class _Expr>
42997a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43007a984708SDavid Chisnalltypename enable_if
43017a984708SDavid Chisnall<
43027a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
43037a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
43047a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
43057a984708SDavid Chisnall>::type
43067a984708SDavid Chisnalloperator||(const _Expr& __x, const typename _Expr::value_type& __y)
43077a984708SDavid Chisnall{
43087a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
43097a984708SDavid Chisnall    typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op;
43107a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_or<value_type>(),
43117a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
43127a984708SDavid Chisnall}
43137a984708SDavid Chisnall
43147a984708SDavid Chisnalltemplate<class _Expr>
43157a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43167a984708SDavid Chisnalltypename enable_if
43177a984708SDavid Chisnall<
43187a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
43197a984708SDavid Chisnall    __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>,
43207a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
43217a984708SDavid Chisnall>::type
43227a984708SDavid Chisnalloperator||(const typename _Expr::value_type& __x, const _Expr& __y)
43237a984708SDavid Chisnall{
43247a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
43257a984708SDavid Chisnall    typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op;
43267a984708SDavid Chisnall    return __val_expr<_Op>(_Op(logical_or<value_type>(),
43277a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
43287a984708SDavid Chisnall}
43297a984708SDavid Chisnall
43307a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
43317a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43327a984708SDavid Chisnalltypename enable_if
43337a984708SDavid Chisnall<
43347a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
43357a984708SDavid Chisnall    __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
43367a984708SDavid Chisnall>::type
43377a984708SDavid Chisnalloperator==(const _Expr1& __x, const _Expr2& __y)
43387a984708SDavid Chisnall{
43397a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
43407a984708SDavid Chisnall    typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op;
43417a984708SDavid Chisnall    return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y));
43427a984708SDavid Chisnall}
43437a984708SDavid Chisnall
43447a984708SDavid Chisnalltemplate<class _Expr>
43457a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43467a984708SDavid Chisnalltypename enable_if
43477a984708SDavid Chisnall<
43487a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
43497a984708SDavid Chisnall    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
43507a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
43517a984708SDavid Chisnall>::type
43527a984708SDavid Chisnalloperator==(const _Expr& __x, const typename _Expr::value_type& __y)
43537a984708SDavid Chisnall{
43547a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
43557a984708SDavid Chisnall    typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
43567a984708SDavid Chisnall    return __val_expr<_Op>(_Op(equal_to<value_type>(),
43577a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
43587a984708SDavid Chisnall}
43597a984708SDavid Chisnall
43607a984708SDavid Chisnalltemplate<class _Expr>
43617a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43627a984708SDavid Chisnalltypename enable_if
43637a984708SDavid Chisnall<
43647a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
43657a984708SDavid Chisnall    __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>,
43667a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
43677a984708SDavid Chisnall>::type
43687a984708SDavid Chisnalloperator==(const typename _Expr::value_type& __x, const _Expr& __y)
43697a984708SDavid Chisnall{
43707a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
43717a984708SDavid Chisnall    typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
43727a984708SDavid Chisnall    return __val_expr<_Op>(_Op(equal_to<value_type>(),
43737a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
43747a984708SDavid Chisnall}
43757a984708SDavid Chisnall
43767a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
43777a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43787a984708SDavid Chisnalltypename enable_if
43797a984708SDavid Chisnall<
43807a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
43817a984708SDavid Chisnall    __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> >
43827a984708SDavid Chisnall>::type
43837a984708SDavid Chisnalloperator!=(const _Expr1& __x, const _Expr2& __y)
43847a984708SDavid Chisnall{
43857a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
43867a984708SDavid Chisnall    typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op;
43877a984708SDavid Chisnall    return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y));
43887a984708SDavid Chisnall}
43897a984708SDavid Chisnall
43907a984708SDavid Chisnalltemplate<class _Expr>
43917a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
43927a984708SDavid Chisnalltypename enable_if
43937a984708SDavid Chisnall<
43947a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
43957a984708SDavid Chisnall    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
43967a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
43977a984708SDavid Chisnall>::type
43987a984708SDavid Chisnalloperator!=(const _Expr& __x, const typename _Expr::value_type& __y)
43997a984708SDavid Chisnall{
44007a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
44017a984708SDavid Chisnall    typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op;
44027a984708SDavid Chisnall    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
44037a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
44047a984708SDavid Chisnall}
44057a984708SDavid Chisnall
44067a984708SDavid Chisnalltemplate<class _Expr>
44077a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44087a984708SDavid Chisnalltypename enable_if
44097a984708SDavid Chisnall<
44107a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
44117a984708SDavid Chisnall    __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>,
44127a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
44137a984708SDavid Chisnall>::type
44147a984708SDavid Chisnalloperator!=(const typename _Expr::value_type& __x, const _Expr& __y)
44157a984708SDavid Chisnall{
44167a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
44177a984708SDavid Chisnall    typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op;
44187a984708SDavid Chisnall    return __val_expr<_Op>(_Op(not_equal_to<value_type>(),
44197a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
44207a984708SDavid Chisnall}
44217a984708SDavid Chisnall
44227a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
44237a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44247a984708SDavid Chisnalltypename enable_if
44257a984708SDavid Chisnall<
44267a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
44277a984708SDavid Chisnall    __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> >
44287a984708SDavid Chisnall>::type
44297a984708SDavid Chisnalloperator<(const _Expr1& __x, const _Expr2& __y)
44307a984708SDavid Chisnall{
44317a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
44327a984708SDavid Chisnall    typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op;
44337a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less<value_type>(), __x, __y));
44347a984708SDavid Chisnall}
44357a984708SDavid Chisnall
44367a984708SDavid Chisnalltemplate<class _Expr>
44377a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44387a984708SDavid Chisnalltypename enable_if
44397a984708SDavid Chisnall<
44407a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
44417a984708SDavid Chisnall    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
44427a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
44437a984708SDavid Chisnall>::type
44447a984708SDavid Chisnalloperator<(const _Expr& __x, const typename _Expr::value_type& __y)
44457a984708SDavid Chisnall{
44467a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
44477a984708SDavid Chisnall    typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op;
44487a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less<value_type>(),
44497a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
44507a984708SDavid Chisnall}
44517a984708SDavid Chisnall
44527a984708SDavid Chisnalltemplate<class _Expr>
44537a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44547a984708SDavid Chisnalltypename enable_if
44557a984708SDavid Chisnall<
44567a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
44577a984708SDavid Chisnall    __val_expr<_BinaryOp<less<typename _Expr::value_type>,
44587a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
44597a984708SDavid Chisnall>::type
44607a984708SDavid Chisnalloperator<(const typename _Expr::value_type& __x, const _Expr& __y)
44617a984708SDavid Chisnall{
44627a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
44637a984708SDavid Chisnall    typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op;
44647a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less<value_type>(),
44657a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
44667a984708SDavid Chisnall}
44677a984708SDavid Chisnall
44687a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
44697a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44707a984708SDavid Chisnalltypename enable_if
44717a984708SDavid Chisnall<
44727a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
44737a984708SDavid Chisnall    __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> >
44747a984708SDavid Chisnall>::type
44757a984708SDavid Chisnalloperator>(const _Expr1& __x, const _Expr2& __y)
44767a984708SDavid Chisnall{
44777a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
44787a984708SDavid Chisnall    typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op;
44797a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y));
44807a984708SDavid Chisnall}
44817a984708SDavid Chisnall
44827a984708SDavid Chisnalltemplate<class _Expr>
44837a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
44847a984708SDavid Chisnalltypename enable_if
44857a984708SDavid Chisnall<
44867a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
44877a984708SDavid Chisnall    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
44887a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
44897a984708SDavid Chisnall>::type
44907a984708SDavid Chisnalloperator>(const _Expr& __x, const typename _Expr::value_type& __y)
44917a984708SDavid Chisnall{
44927a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
44937a984708SDavid Chisnall    typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op;
44947a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater<value_type>(),
44957a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
44967a984708SDavid Chisnall}
44977a984708SDavid Chisnall
44987a984708SDavid Chisnalltemplate<class _Expr>
44997a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45007a984708SDavid Chisnalltypename enable_if
45017a984708SDavid Chisnall<
45027a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
45037a984708SDavid Chisnall    __val_expr<_BinaryOp<greater<typename _Expr::value_type>,
45047a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
45057a984708SDavid Chisnall>::type
45067a984708SDavid Chisnalloperator>(const typename _Expr::value_type& __x, const _Expr& __y)
45077a984708SDavid Chisnall{
45087a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
45097a984708SDavid Chisnall    typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op;
45107a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater<value_type>(),
45117a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
45127a984708SDavid Chisnall}
45137a984708SDavid Chisnall
45147a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
45157a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45167a984708SDavid Chisnalltypename enable_if
45177a984708SDavid Chisnall<
45187a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
45197a984708SDavid Chisnall    __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
45207a984708SDavid Chisnall>::type
45217a984708SDavid Chisnalloperator<=(const _Expr1& __x, const _Expr2& __y)
45227a984708SDavid Chisnall{
45237a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
45247a984708SDavid Chisnall    typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op;
45257a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y));
45267a984708SDavid Chisnall}
45277a984708SDavid Chisnall
45287a984708SDavid Chisnalltemplate<class _Expr>
45297a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45307a984708SDavid Chisnalltypename enable_if
45317a984708SDavid Chisnall<
45327a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
45337a984708SDavid Chisnall    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
45347a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
45357a984708SDavid Chisnall>::type
45367a984708SDavid Chisnalloperator<=(const _Expr& __x, const typename _Expr::value_type& __y)
45377a984708SDavid Chisnall{
45387a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
45397a984708SDavid Chisnall    typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
45407a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less_equal<value_type>(),
45417a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
45427a984708SDavid Chisnall}
45437a984708SDavid Chisnall
45447a984708SDavid Chisnalltemplate<class _Expr>
45457a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45467a984708SDavid Chisnalltypename enable_if
45477a984708SDavid Chisnall<
45487a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
45497a984708SDavid Chisnall    __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>,
45507a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
45517a984708SDavid Chisnall>::type
45527a984708SDavid Chisnalloperator<=(const typename _Expr::value_type& __x, const _Expr& __y)
45537a984708SDavid Chisnall{
45547a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
45557a984708SDavid Chisnall    typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
45567a984708SDavid Chisnall    return __val_expr<_Op>(_Op(less_equal<value_type>(),
45577a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
45587a984708SDavid Chisnall}
45597a984708SDavid Chisnall
45607a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
45617a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45627a984708SDavid Chisnalltypename enable_if
45637a984708SDavid Chisnall<
45647a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
45657a984708SDavid Chisnall    __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> >
45667a984708SDavid Chisnall>::type
45677a984708SDavid Chisnalloperator>=(const _Expr1& __x, const _Expr2& __y)
45687a984708SDavid Chisnall{
45697a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
45707a984708SDavid Chisnall    typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op;
45717a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y));
45727a984708SDavid Chisnall}
45737a984708SDavid Chisnall
45747a984708SDavid Chisnalltemplate<class _Expr>
45757a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45767a984708SDavid Chisnalltypename enable_if
45777a984708SDavid Chisnall<
45787a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
45797a984708SDavid Chisnall    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
45807a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
45817a984708SDavid Chisnall>::type
45827a984708SDavid Chisnalloperator>=(const _Expr& __x, const typename _Expr::value_type& __y)
45837a984708SDavid Chisnall{
45847a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
45857a984708SDavid Chisnall    typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op;
45867a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
45877a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
45887a984708SDavid Chisnall}
45897a984708SDavid Chisnall
45907a984708SDavid Chisnalltemplate<class _Expr>
45917a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
45927a984708SDavid Chisnalltypename enable_if
45937a984708SDavid Chisnall<
45947a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
45957a984708SDavid Chisnall    __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>,
45967a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
45977a984708SDavid Chisnall>::type
45987a984708SDavid Chisnalloperator>=(const typename _Expr::value_type& __x, const _Expr& __y)
45997a984708SDavid Chisnall{
46007a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46017a984708SDavid Chisnall    typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op;
46027a984708SDavid Chisnall    return __val_expr<_Op>(_Op(greater_equal<value_type>(),
46037a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
46047a984708SDavid Chisnall}
46057a984708SDavid Chisnall
46067a984708SDavid Chisnalltemplate<class _Expr>
46077a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46087a984708SDavid Chisnalltypename enable_if
46097a984708SDavid Chisnall<
46107a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46117a984708SDavid Chisnall    __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> >
46127a984708SDavid Chisnall>::type
46137a984708SDavid Chisnallabs(const _Expr& __x)
46147a984708SDavid Chisnall{
46157a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46167a984708SDavid Chisnall    typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op;
46177a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x));
46187a984708SDavid Chisnall}
46197a984708SDavid Chisnall
46207a984708SDavid Chisnalltemplate<class _Expr>
46217a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46227a984708SDavid Chisnalltypename enable_if
46237a984708SDavid Chisnall<
46247a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46257a984708SDavid Chisnall    __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> >
46267a984708SDavid Chisnall>::type
46277a984708SDavid Chisnallacos(const _Expr& __x)
46287a984708SDavid Chisnall{
46297a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46307a984708SDavid Chisnall    typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op;
46317a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x));
46327a984708SDavid Chisnall}
46337a984708SDavid Chisnall
46347a984708SDavid Chisnalltemplate<class _Expr>
46357a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46367a984708SDavid Chisnalltypename enable_if
46377a984708SDavid Chisnall<
46387a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46397a984708SDavid Chisnall    __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> >
46407a984708SDavid Chisnall>::type
46417a984708SDavid Chisnallasin(const _Expr& __x)
46427a984708SDavid Chisnall{
46437a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46447a984708SDavid Chisnall    typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op;
46457a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x));
46467a984708SDavid Chisnall}
46477a984708SDavid Chisnall
46487a984708SDavid Chisnalltemplate<class _Expr>
46497a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46507a984708SDavid Chisnalltypename enable_if
46517a984708SDavid Chisnall<
46527a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46537a984708SDavid Chisnall    __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> >
46547a984708SDavid Chisnall>::type
46557a984708SDavid Chisnallatan(const _Expr& __x)
46567a984708SDavid Chisnall{
46577a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46587a984708SDavid Chisnall    typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op;
46597a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x));
46607a984708SDavid Chisnall}
46617a984708SDavid Chisnall
46627a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
46637a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46647a984708SDavid Chisnalltypename enable_if
46657a984708SDavid Chisnall<
46667a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
46677a984708SDavid Chisnall    __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
46687a984708SDavid Chisnall>::type
46697a984708SDavid Chisnallatan2(const _Expr1& __x, const _Expr2& __y)
46707a984708SDavid Chisnall{
46717a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
46727a984708SDavid Chisnall    typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op;
46737a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y));
46747a984708SDavid Chisnall}
46757a984708SDavid Chisnall
46767a984708SDavid Chisnalltemplate<class _Expr>
46777a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46787a984708SDavid Chisnalltypename enable_if
46797a984708SDavid Chisnall<
46807a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46817a984708SDavid Chisnall    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
46827a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
46837a984708SDavid Chisnall>::type
46847a984708SDavid Chisnallatan2(const _Expr& __x, const typename _Expr::value_type& __y)
46857a984708SDavid Chisnall{
46867a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
46877a984708SDavid Chisnall    typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
46887a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
46897a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
46907a984708SDavid Chisnall}
46917a984708SDavid Chisnall
46927a984708SDavid Chisnalltemplate<class _Expr>
46937a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
46947a984708SDavid Chisnalltypename enable_if
46957a984708SDavid Chisnall<
46967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
46977a984708SDavid Chisnall    __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>,
46987a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
46997a984708SDavid Chisnall>::type
47007a984708SDavid Chisnallatan2(const typename _Expr::value_type& __x, const _Expr& __y)
47017a984708SDavid Chisnall{
47027a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47037a984708SDavid Chisnall    typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
47047a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__atan2_expr<value_type>(),
47057a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
47067a984708SDavid Chisnall}
47077a984708SDavid Chisnall
47087a984708SDavid Chisnalltemplate<class _Expr>
47097a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47107a984708SDavid Chisnalltypename enable_if
47117a984708SDavid Chisnall<
47127a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47137a984708SDavid Chisnall    __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> >
47147a984708SDavid Chisnall>::type
47157a984708SDavid Chisnallcos(const _Expr& __x)
47167a984708SDavid Chisnall{
47177a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47187a984708SDavid Chisnall    typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op;
47197a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x));
47207a984708SDavid Chisnall}
47217a984708SDavid Chisnall
47227a984708SDavid Chisnalltemplate<class _Expr>
47237a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47247a984708SDavid Chisnalltypename enable_if
47257a984708SDavid Chisnall<
47267a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47277a984708SDavid Chisnall    __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> >
47287a984708SDavid Chisnall>::type
47297a984708SDavid Chisnallcosh(const _Expr& __x)
47307a984708SDavid Chisnall{
47317a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47327a984708SDavid Chisnall    typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op;
47337a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x));
47347a984708SDavid Chisnall}
47357a984708SDavid Chisnall
47367a984708SDavid Chisnalltemplate<class _Expr>
47377a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47387a984708SDavid Chisnalltypename enable_if
47397a984708SDavid Chisnall<
47407a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47417a984708SDavid Chisnall    __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> >
47427a984708SDavid Chisnall>::type
47437a984708SDavid Chisnallexp(const _Expr& __x)
47447a984708SDavid Chisnall{
47457a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47467a984708SDavid Chisnall    typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op;
47477a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x));
47487a984708SDavid Chisnall}
47497a984708SDavid Chisnall
47507a984708SDavid Chisnalltemplate<class _Expr>
47517a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47527a984708SDavid Chisnalltypename enable_if
47537a984708SDavid Chisnall<
47547a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47557a984708SDavid Chisnall    __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> >
47567a984708SDavid Chisnall>::type
47577a984708SDavid Chisnalllog(const _Expr& __x)
47587a984708SDavid Chisnall{
47597a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47607a984708SDavid Chisnall    typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op;
47617a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x));
47627a984708SDavid Chisnall}
47637a984708SDavid Chisnall
47647a984708SDavid Chisnalltemplate<class _Expr>
47657a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47667a984708SDavid Chisnalltypename enable_if
47677a984708SDavid Chisnall<
47687a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47697a984708SDavid Chisnall    __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> >
47707a984708SDavid Chisnall>::type
47717a984708SDavid Chisnalllog10(const _Expr& __x)
47727a984708SDavid Chisnall{
47737a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
47747a984708SDavid Chisnall    typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op;
47757a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x));
47767a984708SDavid Chisnall}
47777a984708SDavid Chisnall
47787a984708SDavid Chisnalltemplate<class _Expr1, class _Expr2>
47797a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47807a984708SDavid Chisnalltypename enable_if
47817a984708SDavid Chisnall<
47827a984708SDavid Chisnall    __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value,
47837a984708SDavid Chisnall    __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> >
47847a984708SDavid Chisnall>::type
47857a984708SDavid Chisnallpow(const _Expr1& __x, const _Expr2& __y)
47867a984708SDavid Chisnall{
47877a984708SDavid Chisnall    typedef typename _Expr1::value_type value_type;
47887a984708SDavid Chisnall    typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op;
47897a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y));
47907a984708SDavid Chisnall}
47917a984708SDavid Chisnall
47927a984708SDavid Chisnalltemplate<class _Expr>
47937a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
47947a984708SDavid Chisnalltypename enable_if
47957a984708SDavid Chisnall<
47967a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
47977a984708SDavid Chisnall    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
47987a984708SDavid Chisnall               _Expr, __scalar_expr<typename _Expr::value_type> > >
47997a984708SDavid Chisnall>::type
48007a984708SDavid Chisnallpow(const _Expr& __x, const typename _Expr::value_type& __y)
48017a984708SDavid Chisnall{
48027a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48037a984708SDavid Chisnall    typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op;
48047a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
48057a984708SDavid Chisnall                           __x, __scalar_expr<value_type>(__y, __x.size())));
48067a984708SDavid Chisnall}
48077a984708SDavid Chisnall
48087a984708SDavid Chisnalltemplate<class _Expr>
48097a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48107a984708SDavid Chisnalltypename enable_if
48117a984708SDavid Chisnall<
48127a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48137a984708SDavid Chisnall    __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>,
48147a984708SDavid Chisnall               __scalar_expr<typename _Expr::value_type>, _Expr> >
48157a984708SDavid Chisnall>::type
48167a984708SDavid Chisnallpow(const typename _Expr::value_type& __x, const _Expr& __y)
48177a984708SDavid Chisnall{
48187a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48197a984708SDavid Chisnall    typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op;
48207a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__pow_expr<value_type>(),
48217a984708SDavid Chisnall                           __scalar_expr<value_type>(__x, __y.size()), __y));
48227a984708SDavid Chisnall}
48237a984708SDavid Chisnall
48247a984708SDavid Chisnalltemplate<class _Expr>
48257a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48267a984708SDavid Chisnalltypename enable_if
48277a984708SDavid Chisnall<
48287a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48297a984708SDavid Chisnall    __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> >
48307a984708SDavid Chisnall>::type
48317a984708SDavid Chisnallsin(const _Expr& __x)
48327a984708SDavid Chisnall{
48337a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48347a984708SDavid Chisnall    typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op;
48357a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x));
48367a984708SDavid Chisnall}
48377a984708SDavid Chisnall
48387a984708SDavid Chisnalltemplate<class _Expr>
48397a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48407a984708SDavid Chisnalltypename enable_if
48417a984708SDavid Chisnall<
48427a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48437a984708SDavid Chisnall    __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> >
48447a984708SDavid Chisnall>::type
48457a984708SDavid Chisnallsinh(const _Expr& __x)
48467a984708SDavid Chisnall{
48477a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48487a984708SDavid Chisnall    typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op;
48497a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x));
48507a984708SDavid Chisnall}
48517a984708SDavid Chisnall
48527a984708SDavid Chisnalltemplate<class _Expr>
48537a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48547a984708SDavid Chisnalltypename enable_if
48557a984708SDavid Chisnall<
48567a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48577a984708SDavid Chisnall    __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> >
48587a984708SDavid Chisnall>::type
48597a984708SDavid Chisnallsqrt(const _Expr& __x)
48607a984708SDavid Chisnall{
48617a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48627a984708SDavid Chisnall    typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op;
48637a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x));
48647a984708SDavid Chisnall}
48657a984708SDavid Chisnall
48667a984708SDavid Chisnalltemplate<class _Expr>
48677a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48687a984708SDavid Chisnalltypename enable_if
48697a984708SDavid Chisnall<
48707a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48717a984708SDavid Chisnall    __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> >
48727a984708SDavid Chisnall>::type
48737a984708SDavid Chisnalltan(const _Expr& __x)
48747a984708SDavid Chisnall{
48757a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48767a984708SDavid Chisnall    typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op;
48777a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x));
48787a984708SDavid Chisnall}
48797a984708SDavid Chisnall
48807a984708SDavid Chisnalltemplate<class _Expr>
48817a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48827a984708SDavid Chisnalltypename enable_if
48837a984708SDavid Chisnall<
48847a984708SDavid Chisnall    __is_val_expr<_Expr>::value,
48857a984708SDavid Chisnall    __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> >
48867a984708SDavid Chisnall>::type
48877a984708SDavid Chisnalltanh(const _Expr& __x)
48887a984708SDavid Chisnall{
48897a984708SDavid Chisnall    typedef typename _Expr::value_type value_type;
48907a984708SDavid Chisnall    typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op;
48917a984708SDavid Chisnall    return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x));
48927a984708SDavid Chisnall}
48937a984708SDavid Chisnall
48947a984708SDavid Chisnalltemplate <class _Tp>
48957a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
48967a984708SDavid Chisnall_Tp*
48977a984708SDavid Chisnallbegin(valarray<_Tp>& __v)
48987a984708SDavid Chisnall{
48997a984708SDavid Chisnall    return __v.__begin_;
49007a984708SDavid Chisnall}
49017a984708SDavid Chisnall
49027a984708SDavid Chisnalltemplate <class _Tp>
49037a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
49047a984708SDavid Chisnallconst _Tp*
49057a984708SDavid Chisnallbegin(const valarray<_Tp>& __v)
49067a984708SDavid Chisnall{
49077a984708SDavid Chisnall    return __v.__begin_;
49087a984708SDavid Chisnall}
49097a984708SDavid Chisnall
49107a984708SDavid Chisnalltemplate <class _Tp>
49117a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
49127a984708SDavid Chisnall_Tp*
49137a984708SDavid Chisnallend(valarray<_Tp>& __v)
49147a984708SDavid Chisnall{
49157a984708SDavid Chisnall    return __v.__end_;
49167a984708SDavid Chisnall}
49177a984708SDavid Chisnall
49187a984708SDavid Chisnalltemplate <class _Tp>
49197a984708SDavid Chisnallinline _LIBCPP_INLINE_VISIBILITY
49207a984708SDavid Chisnallconst _Tp*
49217a984708SDavid Chisnallend(const valarray<_Tp>& __v)
49227a984708SDavid Chisnall{
49237a984708SDavid Chisnall    return __v.__end_;
49247a984708SDavid Chisnall}
49257a984708SDavid Chisnall
49267a984708SDavid Chisnall_LIBCPP_END_NAMESPACE_STD
49277a984708SDavid Chisnall
4928f9448bf3SDimitry Andric_LIBCPP_POP_MACROS
4929f9448bf3SDimitry Andric
49307a984708SDavid Chisnall#endif  // _LIBCPP_VALARRAY
4931