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