1 // -*- C++ -*- 2 //===-------------------------- valarray ----------------------------------===// 3 // 4 // The LLVM Compiler Infrastructure 5 // 6 // This file is dual licensed under the MIT and the University of Illinois Open 7 // Source Licenses. See LICENSE.TXT for details. 8 // 9 //===----------------------------------------------------------------------===// 10 11 #ifndef _LIBCPP_VALARRAY 12 #define _LIBCPP_VALARRAY 13 14 /* 15 valarray synopsis 16 17 namespace std 18 { 19 20 template<class T> 21 class valarray 22 { 23 public: 24 typedef T value_type; 25 26 // construct/destroy: 27 valarray(); 28 explicit valarray(size_t n); 29 valarray(const value_type& x, size_t n); 30 valarray(const value_type* px, size_t n); 31 valarray(const valarray& v); 32 valarray(valarray&& v) noexcept; 33 valarray(const slice_array<value_type>& sa); 34 valarray(const gslice_array<value_type>& ga); 35 valarray(const mask_array<value_type>& ma); 36 valarray(const indirect_array<value_type>& ia); 37 valarray(initializer_list<value_type> il); 38 ~valarray(); 39 40 // assignment: 41 valarray& operator=(const valarray& v); 42 valarray& operator=(valarray&& v) noexcept; 43 valarray& operator=(initializer_list<value_type> il); 44 valarray& operator=(const value_type& x); 45 valarray& operator=(const slice_array<value_type>& sa); 46 valarray& operator=(const gslice_array<value_type>& ga); 47 valarray& operator=(const mask_array<value_type>& ma); 48 valarray& operator=(const indirect_array<value_type>& ia); 49 50 // element access: 51 const value_type& operator[](size_t i) const; 52 value_type& operator[](size_t i); 53 54 // subset operations: 55 valarray operator[](slice s) const; 56 slice_array<value_type> operator[](slice s); 57 valarray operator[](const gslice& gs) const; 58 gslice_array<value_type> operator[](const gslice& gs); 59 valarray operator[](const valarray<bool>& vb) const; 60 mask_array<value_type> operator[](const valarray<bool>& vb); 61 valarray operator[](const valarray<size_t>& vs) const; 62 indirect_array<value_type> operator[](const valarray<size_t>& vs); 63 64 // unary operators: 65 valarray operator+() const; 66 valarray operator-() const; 67 valarray operator~() const; 68 valarray<bool> operator!() const; 69 70 // computed assignment: 71 valarray& operator*= (const value_type& x); 72 valarray& operator/= (const value_type& x); 73 valarray& operator%= (const value_type& x); 74 valarray& operator+= (const value_type& x); 75 valarray& operator-= (const value_type& x); 76 valarray& operator^= (const value_type& x); 77 valarray& operator&= (const value_type& x); 78 valarray& operator|= (const value_type& x); 79 valarray& operator<<=(const value_type& x); 80 valarray& operator>>=(const value_type& x); 81 82 valarray& operator*= (const valarray& v); 83 valarray& operator/= (const valarray& v); 84 valarray& operator%= (const valarray& v); 85 valarray& operator+= (const valarray& v); 86 valarray& operator-= (const valarray& v); 87 valarray& operator^= (const valarray& v); 88 valarray& operator|= (const valarray& v); 89 valarray& operator&= (const valarray& v); 90 valarray& operator<<=(const valarray& v); 91 valarray& operator>>=(const valarray& v); 92 93 // member functions: 94 void swap(valarray& v) noexcept; 95 96 size_t size() const; 97 98 value_type sum() const; 99 value_type min() const; 100 value_type max() const; 101 102 valarray shift (int i) const; 103 valarray cshift(int i) const; 104 valarray apply(value_type f(value_type)) const; 105 valarray apply(value_type f(const value_type&)) const; 106 void resize(size_t n, value_type x = value_type()); 107 }; 108 109 class slice 110 { 111 public: 112 slice(); 113 slice(size_t start, size_t size, size_t stride); 114 115 size_t start() const; 116 size_t size() const; 117 size_t stride() const; 118 }; 119 120 template <class T> 121 class slice_array 122 { 123 public: 124 typedef T value_type; 125 126 const slice_array& operator=(const slice_array& sa) const; 127 void operator= (const valarray<value_type>& v) const; 128 void operator*= (const valarray<value_type>& v) const; 129 void operator/= (const valarray<value_type>& v) const; 130 void operator%= (const valarray<value_type>& v) const; 131 void operator+= (const valarray<value_type>& v) const; 132 void operator-= (const valarray<value_type>& v) const; 133 void operator^= (const valarray<value_type>& v) const; 134 void operator&= (const valarray<value_type>& v) const; 135 void operator|= (const valarray<value_type>& v) const; 136 void operator<<=(const valarray<value_type>& v) const; 137 void operator>>=(const valarray<value_type>& v) const; 138 139 void operator=(const value_type& x) const; 140 141 slice_array() = delete; 142 }; 143 144 class gslice 145 { 146 public: 147 gslice(); 148 gslice(size_t start, const valarray<size_t>& size, 149 const valarray<size_t>& stride); 150 151 size_t start() const; 152 valarray<size_t> size() const; 153 valarray<size_t> stride() const; 154 }; 155 156 template <class T> 157 class gslice_array 158 { 159 public: 160 typedef T value_type; 161 162 void operator= (const valarray<value_type>& v) const; 163 void operator*= (const valarray<value_type>& v) const; 164 void operator/= (const valarray<value_type>& v) const; 165 void operator%= (const valarray<value_type>& v) const; 166 void operator+= (const valarray<value_type>& v) const; 167 void operator-= (const valarray<value_type>& v) const; 168 void operator^= (const valarray<value_type>& v) const; 169 void operator&= (const valarray<value_type>& v) const; 170 void operator|= (const valarray<value_type>& v) const; 171 void operator<<=(const valarray<value_type>& v) const; 172 void operator>>=(const valarray<value_type>& v) const; 173 174 gslice_array(const gslice_array& ga); 175 ~gslice_array(); 176 const gslice_array& operator=(const gslice_array& ga) const; 177 void operator=(const value_type& x) const; 178 179 gslice_array() = delete; 180 }; 181 182 template <class T> 183 class mask_array 184 { 185 public: 186 typedef T value_type; 187 188 void operator= (const valarray<value_type>& v) const; 189 void operator*= (const valarray<value_type>& v) const; 190 void operator/= (const valarray<value_type>& v) const; 191 void operator%= (const valarray<value_type>& v) const; 192 void operator+= (const valarray<value_type>& v) const; 193 void operator-= (const valarray<value_type>& v) const; 194 void operator^= (const valarray<value_type>& v) const; 195 void operator&= (const valarray<value_type>& v) const; 196 void operator|= (const valarray<value_type>& v) const; 197 void operator<<=(const valarray<value_type>& v) const; 198 void operator>>=(const valarray<value_type>& v) const; 199 200 mask_array(const mask_array& ma); 201 ~mask_array(); 202 const mask_array& operator=(const mask_array& ma) const; 203 void operator=(const value_type& x) const; 204 205 mask_array() = delete; 206 }; 207 208 template <class T> 209 class indirect_array 210 { 211 public: 212 typedef T value_type; 213 214 void operator= (const valarray<value_type>& v) const; 215 void operator*= (const valarray<value_type>& v) const; 216 void operator/= (const valarray<value_type>& v) const; 217 void operator%= (const valarray<value_type>& v) const; 218 void operator+= (const valarray<value_type>& v) const; 219 void operator-= (const valarray<value_type>& v) const; 220 void operator^= (const valarray<value_type>& v) const; 221 void operator&= (const valarray<value_type>& v) const; 222 void operator|= (const valarray<value_type>& v) const; 223 void operator<<=(const valarray<value_type>& v) const; 224 void operator>>=(const valarray<value_type>& v) const; 225 226 indirect_array(const indirect_array& ia); 227 ~indirect_array(); 228 const indirect_array& operator=(const indirect_array& ia) const; 229 void operator=(const value_type& x) const; 230 231 indirect_array() = delete; 232 }; 233 234 template<class T> void swap(valarray<T>& x, valarray<T>& y) noexcept; 235 236 template<class T> valarray<T> operator* (const valarray<T>& x, const valarray<T>& y); 237 template<class T> valarray<T> operator* (const valarray<T>& x, const T& y); 238 template<class T> valarray<T> operator* (const T& x, const valarray<T>& y); 239 240 template<class T> valarray<T> operator/ (const valarray<T>& x, const valarray<T>& y); 241 template<class T> valarray<T> operator/ (const valarray<T>& x, const T& y); 242 template<class T> valarray<T> operator/ (const T& x, const valarray<T>& y); 243 244 template<class T> valarray<T> operator% (const valarray<T>& x, const valarray<T>& y); 245 template<class T> valarray<T> operator% (const valarray<T>& x, const T& y); 246 template<class T> valarray<T> operator% (const T& x, const valarray<T>& y); 247 248 template<class T> valarray<T> operator+ (const valarray<T>& x, const valarray<T>& y); 249 template<class T> valarray<T> operator+ (const valarray<T>& x, const T& y); 250 template<class T> valarray<T> operator+ (const T& x, const valarray<T>& y); 251 252 template<class T> valarray<T> operator- (const valarray<T>& x, const valarray<T>& y); 253 template<class T> valarray<T> operator- (const valarray<T>& x, const T& y); 254 template<class T> valarray<T> operator- (const T& x, const valarray<T>& y); 255 256 template<class T> valarray<T> operator^ (const valarray<T>& x, const valarray<T>& y); 257 template<class T> valarray<T> operator^ (const valarray<T>& x, const T& y); 258 template<class T> valarray<T> operator^ (const T& x, const valarray<T>& y); 259 260 template<class T> valarray<T> operator& (const valarray<T>& x, const valarray<T>& y); 261 template<class T> valarray<T> operator& (const valarray<T>& x, const T& y); 262 template<class T> valarray<T> operator& (const T& x, const valarray<T>& y); 263 264 template<class T> valarray<T> operator| (const valarray<T>& x, const valarray<T>& y); 265 template<class T> valarray<T> operator| (const valarray<T>& x, const T& y); 266 template<class T> valarray<T> operator| (const T& x, const valarray<T>& y); 267 268 template<class T> valarray<T> operator<<(const valarray<T>& x, const valarray<T>& y); 269 template<class T> valarray<T> operator<<(const valarray<T>& x, const T& y); 270 template<class T> valarray<T> operator<<(const T& x, const valarray<T>& y); 271 272 template<class T> valarray<T> operator>>(const valarray<T>& x, const valarray<T>& y); 273 template<class T> valarray<T> operator>>(const valarray<T>& x, const T& y); 274 template<class T> valarray<T> operator>>(const T& x, const valarray<T>& y); 275 276 template<class T> valarray<bool> operator&&(const valarray<T>& x, const valarray<T>& y); 277 template<class T> valarray<bool> operator&&(const valarray<T>& x, const T& y); 278 template<class T> valarray<bool> operator&&(const T& x, const valarray<T>& y); 279 280 template<class T> valarray<bool> operator||(const valarray<T>& x, const valarray<T>& y); 281 template<class T> valarray<bool> operator||(const valarray<T>& x, const T& y); 282 template<class T> valarray<bool> operator||(const T& x, const valarray<T>& y); 283 284 template<class T> valarray<bool> operator==(const valarray<T>& x, const valarray<T>& y); 285 template<class T> valarray<bool> operator==(const valarray<T>& x, const T& y); 286 template<class T> valarray<bool> operator==(const T& x, const valarray<T>& y); 287 288 template<class T> valarray<bool> operator!=(const valarray<T>& x, const valarray<T>& y); 289 template<class T> valarray<bool> operator!=(const valarray<T>& x, const T& y); 290 template<class T> valarray<bool> operator!=(const T& x, const valarray<T>& y); 291 292 template<class T> valarray<bool> operator< (const valarray<T>& x, const valarray<T>& y); 293 template<class T> valarray<bool> operator< (const valarray<T>& x, const T& y); 294 template<class T> valarray<bool> operator< (const T& x, const valarray<T>& y); 295 296 template<class T> valarray<bool> operator> (const valarray<T>& x, const valarray<T>& y); 297 template<class T> valarray<bool> operator> (const valarray<T>& x, const T& y); 298 template<class T> valarray<bool> operator> (const T& x, const valarray<T>& y); 299 300 template<class T> valarray<bool> operator<=(const valarray<T>& x, const valarray<T>& y); 301 template<class T> valarray<bool> operator<=(const valarray<T>& x, const T& y); 302 template<class T> valarray<bool> operator<=(const T& x, const valarray<T>& y); 303 304 template<class T> valarray<bool> operator>=(const valarray<T>& x, const valarray<T>& y); 305 template<class T> valarray<bool> operator>=(const valarray<T>& x, const T& y); 306 template<class T> valarray<bool> operator>=(const T& x, const valarray<T>& y); 307 308 template<class T> valarray<T> abs (const valarray<T>& x); 309 template<class T> valarray<T> acos (const valarray<T>& x); 310 template<class T> valarray<T> asin (const valarray<T>& x); 311 template<class T> valarray<T> atan (const valarray<T>& x); 312 313 template<class T> valarray<T> atan2(const valarray<T>& x, const valarray<T>& y); 314 template<class T> valarray<T> atan2(const valarray<T>& x, const T& y); 315 template<class T> valarray<T> atan2(const T& x, const valarray<T>& y); 316 317 template<class T> valarray<T> cos (const valarray<T>& x); 318 template<class T> valarray<T> cosh (const valarray<T>& x); 319 template<class T> valarray<T> exp (const valarray<T>& x); 320 template<class T> valarray<T> log (const valarray<T>& x); 321 template<class T> valarray<T> log10(const valarray<T>& x); 322 323 template<class T> valarray<T> pow(const valarray<T>& x, const valarray<T>& y); 324 template<class T> valarray<T> pow(const valarray<T>& x, const T& y); 325 template<class T> valarray<T> pow(const T& x, const valarray<T>& y); 326 327 template<class T> valarray<T> sin (const valarray<T>& x); 328 template<class T> valarray<T> sinh (const valarray<T>& x); 329 template<class T> valarray<T> sqrt (const valarray<T>& x); 330 template<class T> valarray<T> tan (const valarray<T>& x); 331 template<class T> valarray<T> tanh (const valarray<T>& x); 332 333 template <class T> unspecified1 begin(valarray<T>& v); 334 template <class T> unspecified2 begin(const valarray<T>& v); 335 template <class T> unspecified1 end(valarray<T>& v); 336 template <class T> unspecified2 end(const valarray<T>& v); 337 338 } // std 339 340 */ 341 342 #include <__config> 343 #include <cstddef> 344 #include <cmath> 345 #include <initializer_list> 346 #include <algorithm> 347 #include <functional> 348 #include <new> 349 350 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 351 #pragma GCC system_header 352 #endif 353 354 _LIBCPP_PUSH_MACROS 355 #include <__undef_macros> 356 357 358 _LIBCPP_BEGIN_NAMESPACE_STD 359 360 template<class _Tp> class _LIBCPP_TEMPLATE_VIS valarray; 361 362 class _LIBCPP_TEMPLATE_VIS slice 363 { 364 size_t __start_; 365 size_t __size_; 366 size_t __stride_; 367 public: 368 _LIBCPP_INLINE_VISIBILITY 369 slice() 370 : __start_(0), 371 __size_(0), 372 __stride_(0) 373 {} 374 375 _LIBCPP_INLINE_VISIBILITY 376 slice(size_t __start, size_t __size, size_t __stride) 377 : __start_(__start), 378 __size_(__size), 379 __stride_(__stride) 380 {} 381 382 _LIBCPP_INLINE_VISIBILITY size_t start() const {return __start_;} 383 _LIBCPP_INLINE_VISIBILITY size_t size() const {return __size_;} 384 _LIBCPP_INLINE_VISIBILITY size_t stride() const {return __stride_;} 385 }; 386 387 template <class _Tp> class _LIBCPP_TEMPLATE_VIS slice_array; 388 class _LIBCPP_TYPE_VIS gslice; 389 template <class _Tp> class _LIBCPP_TEMPLATE_VIS gslice_array; 390 template <class _Tp> class _LIBCPP_TEMPLATE_VIS mask_array; 391 template <class _Tp> class _LIBCPP_TEMPLATE_VIS indirect_array; 392 393 template <class _Tp> 394 _LIBCPP_INLINE_VISIBILITY 395 _Tp* 396 begin(valarray<_Tp>& __v); 397 398 template <class _Tp> 399 _LIBCPP_INLINE_VISIBILITY 400 const _Tp* 401 begin(const valarray<_Tp>& __v); 402 403 template <class _Tp> 404 _LIBCPP_INLINE_VISIBILITY 405 _Tp* 406 end(valarray<_Tp>& __v); 407 408 template <class _Tp> 409 _LIBCPP_INLINE_VISIBILITY 410 const _Tp* 411 end(const valarray<_Tp>& __v); 412 413 template <class _Op, class _A0> 414 struct _UnaryOp 415 { 416 typedef typename _Op::result_type result_type; 417 typedef typename _A0::value_type value_type; 418 419 _Op __op_; 420 _A0 __a0_; 421 422 _LIBCPP_INLINE_VISIBILITY 423 _UnaryOp(const _Op& __op, const _A0& __a0) : __op_(__op), __a0_(__a0) {} 424 425 _LIBCPP_INLINE_VISIBILITY 426 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} 427 428 _LIBCPP_INLINE_VISIBILITY 429 size_t size() const {return __a0_.size();} 430 }; 431 432 template <class _Op, class _A0, class _A1> 433 struct _BinaryOp 434 { 435 typedef typename _Op::result_type result_type; 436 typedef typename _A0::value_type value_type; 437 438 _Op __op_; 439 _A0 __a0_; 440 _A1 __a1_; 441 442 _LIBCPP_INLINE_VISIBILITY 443 _BinaryOp(const _Op& __op, const _A0& __a0, const _A1& __a1) 444 : __op_(__op), __a0_(__a0), __a1_(__a1) {} 445 446 _LIBCPP_INLINE_VISIBILITY 447 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 448 449 _LIBCPP_INLINE_VISIBILITY 450 size_t size() const {return __a0_.size();} 451 }; 452 453 template <class _Tp> 454 class __scalar_expr 455 { 456 public: 457 typedef _Tp value_type; 458 typedef const _Tp& result_type; 459 private: 460 const value_type& __t_; 461 size_t __s_; 462 public: 463 _LIBCPP_INLINE_VISIBILITY 464 explicit __scalar_expr(const value_type& __t, size_t __s) : __t_(__t), __s_(__s) {} 465 466 _LIBCPP_INLINE_VISIBILITY 467 result_type operator[](size_t) const {return __t_;} 468 469 _LIBCPP_INLINE_VISIBILITY 470 size_t size() const {return __s_;} 471 }; 472 473 template <class _Tp> 474 struct __unary_plus : unary_function<_Tp, _Tp> 475 { 476 _LIBCPP_INLINE_VISIBILITY 477 _Tp operator()(const _Tp& __x) const 478 {return +__x;} 479 }; 480 481 template <class _Tp> 482 struct __bit_not : unary_function<_Tp, _Tp> 483 { 484 _LIBCPP_INLINE_VISIBILITY 485 _Tp operator()(const _Tp& __x) const 486 {return ~__x;} 487 }; 488 489 template <class _Tp> 490 struct __bit_shift_left : binary_function<_Tp, _Tp, _Tp> 491 { 492 _LIBCPP_INLINE_VISIBILITY 493 _Tp operator()(const _Tp& __x, const _Tp& __y) const 494 {return __x << __y;} 495 }; 496 497 template <class _Tp> 498 struct __bit_shift_right : binary_function<_Tp, _Tp, _Tp> 499 { 500 _LIBCPP_INLINE_VISIBILITY 501 _Tp operator()(const _Tp& __x, const _Tp& __y) const 502 {return __x >> __y;} 503 }; 504 505 template <class _Tp, class _Fp> 506 struct __apply_expr : unary_function<_Tp, _Tp> 507 { 508 private: 509 _Fp __f_; 510 public: 511 _LIBCPP_INLINE_VISIBILITY 512 explicit __apply_expr(_Fp __f) : __f_(__f) {} 513 514 _LIBCPP_INLINE_VISIBILITY 515 _Tp operator()(const _Tp& __x) const 516 {return __f_(__x);} 517 }; 518 519 template <class _Tp> 520 struct __abs_expr : unary_function<_Tp, _Tp> 521 { 522 _LIBCPP_INLINE_VISIBILITY 523 _Tp operator()(const _Tp& __x) const 524 {return abs(__x);} 525 }; 526 527 template <class _Tp> 528 struct __acos_expr : unary_function<_Tp, _Tp> 529 { 530 _LIBCPP_INLINE_VISIBILITY 531 _Tp operator()(const _Tp& __x) const 532 {return acos(__x);} 533 }; 534 535 template <class _Tp> 536 struct __asin_expr : unary_function<_Tp, _Tp> 537 { 538 _LIBCPP_INLINE_VISIBILITY 539 _Tp operator()(const _Tp& __x) const 540 {return asin(__x);} 541 }; 542 543 template <class _Tp> 544 struct __atan_expr : unary_function<_Tp, _Tp> 545 { 546 _LIBCPP_INLINE_VISIBILITY 547 _Tp operator()(const _Tp& __x) const 548 {return atan(__x);} 549 }; 550 551 template <class _Tp> 552 struct __atan2_expr : binary_function<_Tp, _Tp, _Tp> 553 { 554 _LIBCPP_INLINE_VISIBILITY 555 _Tp operator()(const _Tp& __x, const _Tp& __y) const 556 {return atan2(__x, __y);} 557 }; 558 559 template <class _Tp> 560 struct __cos_expr : unary_function<_Tp, _Tp> 561 { 562 _LIBCPP_INLINE_VISIBILITY 563 _Tp operator()(const _Tp& __x) const 564 {return cos(__x);} 565 }; 566 567 template <class _Tp> 568 struct __cosh_expr : unary_function<_Tp, _Tp> 569 { 570 _LIBCPP_INLINE_VISIBILITY 571 _Tp operator()(const _Tp& __x) const 572 {return cosh(__x);} 573 }; 574 575 template <class _Tp> 576 struct __exp_expr : unary_function<_Tp, _Tp> 577 { 578 _LIBCPP_INLINE_VISIBILITY 579 _Tp operator()(const _Tp& __x) const 580 {return exp(__x);} 581 }; 582 583 template <class _Tp> 584 struct __log_expr : unary_function<_Tp, _Tp> 585 { 586 _LIBCPP_INLINE_VISIBILITY 587 _Tp operator()(const _Tp& __x) const 588 {return log(__x);} 589 }; 590 591 template <class _Tp> 592 struct __log10_expr : unary_function<_Tp, _Tp> 593 { 594 _LIBCPP_INLINE_VISIBILITY 595 _Tp operator()(const _Tp& __x) const 596 {return log10(__x);} 597 }; 598 599 template <class _Tp> 600 struct __pow_expr : binary_function<_Tp, _Tp, _Tp> 601 { 602 _LIBCPP_INLINE_VISIBILITY 603 _Tp operator()(const _Tp& __x, const _Tp& __y) const 604 {return pow(__x, __y);} 605 }; 606 607 template <class _Tp> 608 struct __sin_expr : unary_function<_Tp, _Tp> 609 { 610 _LIBCPP_INLINE_VISIBILITY 611 _Tp operator()(const _Tp& __x) const 612 {return sin(__x);} 613 }; 614 615 template <class _Tp> 616 struct __sinh_expr : unary_function<_Tp, _Tp> 617 { 618 _LIBCPP_INLINE_VISIBILITY 619 _Tp operator()(const _Tp& __x) const 620 {return sinh(__x);} 621 }; 622 623 template <class _Tp> 624 struct __sqrt_expr : unary_function<_Tp, _Tp> 625 { 626 _LIBCPP_INLINE_VISIBILITY 627 _Tp operator()(const _Tp& __x) const 628 {return sqrt(__x);} 629 }; 630 631 template <class _Tp> 632 struct __tan_expr : unary_function<_Tp, _Tp> 633 { 634 _LIBCPP_INLINE_VISIBILITY 635 _Tp operator()(const _Tp& __x) const 636 {return tan(__x);} 637 }; 638 639 template <class _Tp> 640 struct __tanh_expr : unary_function<_Tp, _Tp> 641 { 642 _LIBCPP_INLINE_VISIBILITY 643 _Tp operator()(const _Tp& __x) const 644 {return tanh(__x);} 645 }; 646 647 template <class _ValExpr> 648 class __slice_expr 649 { 650 typedef typename remove_reference<_ValExpr>::type _RmExpr; 651 public: 652 typedef typename _RmExpr::value_type value_type; 653 typedef value_type result_type; 654 655 private: 656 _ValExpr __expr_; 657 size_t __start_; 658 size_t __size_; 659 size_t __stride_; 660 661 _LIBCPP_INLINE_VISIBILITY 662 __slice_expr(const slice& __sl, const _RmExpr& __e) 663 : __expr_(__e), 664 __start_(__sl.start()), 665 __size_(__sl.size()), 666 __stride_(__sl.stride()) 667 {} 668 public: 669 670 _LIBCPP_INLINE_VISIBILITY 671 result_type operator[](size_t __i) const 672 {return __expr_[__start_ + __i * __stride_];} 673 674 _LIBCPP_INLINE_VISIBILITY 675 size_t size() const {return __size_;} 676 677 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 678 }; 679 680 template <class _ValExpr> 681 class __mask_expr; 682 683 template <class _ValExpr> 684 class __indirect_expr; 685 686 template <class _ValExpr> 687 class __shift_expr 688 { 689 typedef typename remove_reference<_ValExpr>::type _RmExpr; 690 public: 691 typedef typename _RmExpr::value_type value_type; 692 typedef value_type result_type; 693 694 private: 695 _ValExpr __expr_; 696 size_t __size_; 697 ptrdiff_t __ul_; 698 ptrdiff_t __sn_; 699 ptrdiff_t __n_; 700 static const ptrdiff_t _Np = static_cast<ptrdiff_t>( 701 sizeof(ptrdiff_t) * __CHAR_BIT__ - 1); 702 703 _LIBCPP_INLINE_VISIBILITY 704 __shift_expr(int __n, const _RmExpr& __e) 705 : __expr_(__e), 706 __size_(__e.size()), 707 __n_(__n) 708 { 709 ptrdiff_t __neg_n = static_cast<ptrdiff_t>(__n_ >> _Np); 710 __sn_ = __neg_n | static_cast<ptrdiff_t>(static_cast<size_t>(-__n_) >> _Np); 711 __ul_ = ((__size_ - __n_) & ~__neg_n) | ((__n_ + 1) & __neg_n); 712 } 713 public: 714 715 _LIBCPP_INLINE_VISIBILITY 716 result_type operator[](size_t __j) const 717 { 718 ptrdiff_t __i = static_cast<ptrdiff_t>(__j); 719 ptrdiff_t __m = (__sn_ * __i - __ul_) >> _Np; 720 return (__expr_[(__i + __n_) & __m] & __m) | (value_type() & ~__m); 721 } 722 723 _LIBCPP_INLINE_VISIBILITY 724 size_t size() const {return __size_;} 725 726 template <class> friend class __val_expr; 727 }; 728 729 template <class _ValExpr> 730 class __cshift_expr 731 { 732 typedef typename remove_reference<_ValExpr>::type _RmExpr; 733 public: 734 typedef typename _RmExpr::value_type value_type; 735 typedef value_type result_type; 736 737 private: 738 _ValExpr __expr_; 739 size_t __size_; 740 size_t __m_; 741 size_t __o1_; 742 size_t __o2_; 743 744 _LIBCPP_INLINE_VISIBILITY 745 __cshift_expr(int __n, const _RmExpr& __e) 746 : __expr_(__e), 747 __size_(__e.size()) 748 { 749 __n %= static_cast<int>(__size_); 750 if (__n >= 0) 751 { 752 __m_ = __size_ - __n; 753 __o1_ = __n; 754 __o2_ = __n - __size_; 755 } 756 else 757 { 758 __m_ = -__n; 759 __o1_ = __n + __size_; 760 __o2_ = __n; 761 } 762 } 763 public: 764 765 _LIBCPP_INLINE_VISIBILITY 766 result_type operator[](size_t __i) const 767 { 768 if (__i < __m_) 769 return __expr_[__i + __o1_]; 770 return __expr_[__i + __o2_]; 771 } 772 773 _LIBCPP_INLINE_VISIBILITY 774 size_t size() const {return __size_;} 775 776 template <class> friend class __val_expr; 777 }; 778 779 template<class _ValExpr> 780 class __val_expr; 781 782 template<class _ValExpr> 783 struct __is_val_expr : false_type {}; 784 785 template<class _ValExpr> 786 struct __is_val_expr<__val_expr<_ValExpr> > : true_type {}; 787 788 template<class _Tp> 789 struct __is_val_expr<valarray<_Tp> > : true_type {}; 790 791 template<class _Tp> 792 class _LIBCPP_TEMPLATE_VIS valarray 793 { 794 public: 795 typedef _Tp value_type; 796 typedef _Tp result_type; 797 798 private: 799 value_type* __begin_; 800 value_type* __end_; 801 802 public: 803 // construct/destroy: 804 _LIBCPP_INLINE_VISIBILITY 805 valarray() : __begin_(0), __end_(0) {} 806 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 807 explicit valarray(size_t __n); 808 _LIBCPP_INLINE_VISIBILITY 809 valarray(const value_type& __x, size_t __n); 810 valarray(const value_type* __p, size_t __n); 811 valarray(const valarray& __v); 812 #ifndef _LIBCPP_CXX03_LANG 813 _LIBCPP_INLINE_VISIBILITY 814 valarray(valarray&& __v) _NOEXCEPT; 815 valarray(initializer_list<value_type> __il); 816 #endif // _LIBCPP_CXX03_LANG 817 valarray(const slice_array<value_type>& __sa); 818 valarray(const gslice_array<value_type>& __ga); 819 valarray(const mask_array<value_type>& __ma); 820 valarray(const indirect_array<value_type>& __ia); 821 inline _LIBCPP_EXTERN_TEMPLATE_INLINE_VISIBILITY 822 ~valarray(); 823 824 // assignment: 825 valarray& operator=(const valarray& __v); 826 #ifndef _LIBCPP_CXX03_LANG 827 _LIBCPP_INLINE_VISIBILITY 828 valarray& operator=(valarray&& __v) _NOEXCEPT; 829 _LIBCPP_INLINE_VISIBILITY 830 valarray& operator=(initializer_list<value_type>); 831 #endif // _LIBCPP_CXX03_LANG 832 _LIBCPP_INLINE_VISIBILITY 833 valarray& operator=(const value_type& __x); 834 _LIBCPP_INLINE_VISIBILITY 835 valarray& operator=(const slice_array<value_type>& __sa); 836 _LIBCPP_INLINE_VISIBILITY 837 valarray& operator=(const gslice_array<value_type>& __ga); 838 _LIBCPP_INLINE_VISIBILITY 839 valarray& operator=(const mask_array<value_type>& __ma); 840 _LIBCPP_INLINE_VISIBILITY 841 valarray& operator=(const indirect_array<value_type>& __ia); 842 template <class _ValExpr> 843 _LIBCPP_INLINE_VISIBILITY 844 valarray& operator=(const __val_expr<_ValExpr>& __v); 845 846 // element access: 847 _LIBCPP_INLINE_VISIBILITY 848 const value_type& operator[](size_t __i) const {return __begin_[__i];} 849 850 _LIBCPP_INLINE_VISIBILITY 851 value_type& operator[](size_t __i) {return __begin_[__i];} 852 853 // subset operations: 854 _LIBCPP_INLINE_VISIBILITY 855 __val_expr<__slice_expr<const valarray&> > operator[](slice __s) const; 856 _LIBCPP_INLINE_VISIBILITY 857 slice_array<value_type> operator[](slice __s); 858 _LIBCPP_INLINE_VISIBILITY 859 __val_expr<__indirect_expr<const valarray&> > operator[](const gslice& __gs) const; 860 _LIBCPP_INLINE_VISIBILITY 861 gslice_array<value_type> operator[](const gslice& __gs); 862 #ifndef _LIBCPP_CXX03_LANG 863 _LIBCPP_INLINE_VISIBILITY 864 __val_expr<__indirect_expr<const valarray&> > operator[](gslice&& __gs) const; 865 _LIBCPP_INLINE_VISIBILITY 866 gslice_array<value_type> operator[](gslice&& __gs); 867 #endif // _LIBCPP_CXX03_LANG 868 _LIBCPP_INLINE_VISIBILITY 869 __val_expr<__mask_expr<const valarray&> > operator[](const valarray<bool>& __vb) const; 870 _LIBCPP_INLINE_VISIBILITY 871 mask_array<value_type> operator[](const valarray<bool>& __vb); 872 #ifndef _LIBCPP_CXX03_LANG 873 _LIBCPP_INLINE_VISIBILITY 874 __val_expr<__mask_expr<const valarray&> > operator[](valarray<bool>&& __vb) const; 875 _LIBCPP_INLINE_VISIBILITY 876 mask_array<value_type> operator[](valarray<bool>&& __vb); 877 #endif // _LIBCPP_CXX03_LANG 878 _LIBCPP_INLINE_VISIBILITY 879 __val_expr<__indirect_expr<const valarray&> > operator[](const valarray<size_t>& __vs) const; 880 _LIBCPP_INLINE_VISIBILITY 881 indirect_array<value_type> operator[](const valarray<size_t>& __vs); 882 #ifndef _LIBCPP_CXX03_LANG 883 _LIBCPP_INLINE_VISIBILITY 884 __val_expr<__indirect_expr<const valarray&> > operator[](valarray<size_t>&& __vs) const; 885 _LIBCPP_INLINE_VISIBILITY 886 indirect_array<value_type> operator[](valarray<size_t>&& __vs); 887 #endif // _LIBCPP_CXX03_LANG 888 889 // unary operators: 890 valarray operator+() const; 891 valarray operator-() const; 892 valarray operator~() const; 893 valarray<bool> operator!() const; 894 895 // computed assignment: 896 _LIBCPP_INLINE_VISIBILITY 897 valarray& operator*= (const value_type& __x); 898 _LIBCPP_INLINE_VISIBILITY 899 valarray& operator/= (const value_type& __x); 900 _LIBCPP_INLINE_VISIBILITY 901 valarray& operator%= (const value_type& __x); 902 _LIBCPP_INLINE_VISIBILITY 903 valarray& operator+= (const value_type& __x); 904 _LIBCPP_INLINE_VISIBILITY 905 valarray& operator-= (const value_type& __x); 906 _LIBCPP_INLINE_VISIBILITY 907 valarray& operator^= (const value_type& __x); 908 _LIBCPP_INLINE_VISIBILITY 909 valarray& operator&= (const value_type& __x); 910 _LIBCPP_INLINE_VISIBILITY 911 valarray& operator|= (const value_type& __x); 912 _LIBCPP_INLINE_VISIBILITY 913 valarray& operator<<=(const value_type& __x); 914 _LIBCPP_INLINE_VISIBILITY 915 valarray& operator>>=(const value_type& __x); 916 917 template <class _Expr> 918 typename enable_if 919 < 920 __is_val_expr<_Expr>::value, 921 valarray& 922 >::type 923 _LIBCPP_INLINE_VISIBILITY 924 operator*= (const _Expr& __v); 925 926 template <class _Expr> 927 typename enable_if 928 < 929 __is_val_expr<_Expr>::value, 930 valarray& 931 >::type 932 _LIBCPP_INLINE_VISIBILITY 933 operator/= (const _Expr& __v); 934 935 template <class _Expr> 936 typename enable_if 937 < 938 __is_val_expr<_Expr>::value, 939 valarray& 940 >::type 941 _LIBCPP_INLINE_VISIBILITY 942 operator%= (const _Expr& __v); 943 944 template <class _Expr> 945 typename enable_if 946 < 947 __is_val_expr<_Expr>::value, 948 valarray& 949 >::type 950 _LIBCPP_INLINE_VISIBILITY 951 operator+= (const _Expr& __v); 952 953 template <class _Expr> 954 typename enable_if 955 < 956 __is_val_expr<_Expr>::value, 957 valarray& 958 >::type 959 _LIBCPP_INLINE_VISIBILITY 960 operator-= (const _Expr& __v); 961 962 template <class _Expr> 963 typename enable_if 964 < 965 __is_val_expr<_Expr>::value, 966 valarray& 967 >::type 968 _LIBCPP_INLINE_VISIBILITY 969 operator^= (const _Expr& __v); 970 971 template <class _Expr> 972 typename enable_if 973 < 974 __is_val_expr<_Expr>::value, 975 valarray& 976 >::type 977 _LIBCPP_INLINE_VISIBILITY 978 operator|= (const _Expr& __v); 979 980 template <class _Expr> 981 typename enable_if 982 < 983 __is_val_expr<_Expr>::value, 984 valarray& 985 >::type 986 _LIBCPP_INLINE_VISIBILITY 987 operator&= (const _Expr& __v); 988 989 template <class _Expr> 990 typename enable_if 991 < 992 __is_val_expr<_Expr>::value, 993 valarray& 994 >::type 995 _LIBCPP_INLINE_VISIBILITY 996 operator<<= (const _Expr& __v); 997 998 template <class _Expr> 999 typename enable_if 1000 < 1001 __is_val_expr<_Expr>::value, 1002 valarray& 1003 >::type 1004 _LIBCPP_INLINE_VISIBILITY 1005 operator>>= (const _Expr& __v); 1006 1007 // member functions: 1008 _LIBCPP_INLINE_VISIBILITY 1009 void swap(valarray& __v) _NOEXCEPT; 1010 1011 _LIBCPP_INLINE_VISIBILITY 1012 size_t size() const {return static_cast<size_t>(__end_ - __begin_);} 1013 1014 _LIBCPP_INLINE_VISIBILITY 1015 value_type sum() const; 1016 _LIBCPP_INLINE_VISIBILITY 1017 value_type min() const; 1018 _LIBCPP_INLINE_VISIBILITY 1019 value_type max() const; 1020 1021 valarray shift (int __i) const; 1022 valarray cshift(int __i) const; 1023 valarray apply(value_type __f(value_type)) const; 1024 valarray apply(value_type __f(const value_type&)) const; 1025 void resize(size_t __n, value_type __x = value_type()); 1026 1027 private: 1028 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 1029 template <class> friend class _LIBCPP_TEMPLATE_VIS slice_array; 1030 template <class> friend class _LIBCPP_TEMPLATE_VIS gslice_array; 1031 template <class> friend class _LIBCPP_TEMPLATE_VIS mask_array; 1032 template <class> friend class __mask_expr; 1033 template <class> friend class _LIBCPP_TEMPLATE_VIS indirect_array; 1034 template <class> friend class __indirect_expr; 1035 template <class> friend class __val_expr; 1036 1037 template <class _Up> 1038 friend 1039 _Up* 1040 begin(valarray<_Up>& __v); 1041 1042 template <class _Up> 1043 friend 1044 const _Up* 1045 begin(const valarray<_Up>& __v); 1046 1047 template <class _Up> 1048 friend 1049 _Up* 1050 end(valarray<_Up>& __v); 1051 1052 template <class _Up> 1053 friend 1054 const _Up* 1055 end(const valarray<_Up>& __v); 1056 }; 1057 1058 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::valarray(size_t)) 1059 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS valarray<size_t>::~valarray()) 1060 _LIBCPP_EXTERN_TEMPLATE(_LIBCPP_FUNC_VIS void valarray<size_t>::resize(size_t, size_t)) 1061 1062 template <class _Op, class _Tp> 1063 struct _UnaryOp<_Op, valarray<_Tp> > 1064 { 1065 typedef typename _Op::result_type result_type; 1066 typedef _Tp value_type; 1067 1068 _Op __op_; 1069 const valarray<_Tp>& __a0_; 1070 1071 _LIBCPP_INLINE_VISIBILITY 1072 _UnaryOp(const _Op& __op, const valarray<_Tp>& __a0) : __op_(__op), __a0_(__a0) {} 1073 1074 _LIBCPP_INLINE_VISIBILITY 1075 result_type operator[](size_t __i) const {return __op_(__a0_[__i]);} 1076 1077 _LIBCPP_INLINE_VISIBILITY 1078 size_t size() const {return __a0_.size();} 1079 }; 1080 1081 template <class _Op, class _Tp, class _A1> 1082 struct _BinaryOp<_Op, valarray<_Tp>, _A1> 1083 { 1084 typedef typename _Op::result_type result_type; 1085 typedef _Tp value_type; 1086 1087 _Op __op_; 1088 const valarray<_Tp>& __a0_; 1089 _A1 __a1_; 1090 1091 _LIBCPP_INLINE_VISIBILITY 1092 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const _A1& __a1) 1093 : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1094 1095 _LIBCPP_INLINE_VISIBILITY 1096 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1097 1098 _LIBCPP_INLINE_VISIBILITY 1099 size_t size() const {return __a0_.size();} 1100 }; 1101 1102 template <class _Op, class _A0, class _Tp> 1103 struct _BinaryOp<_Op, _A0, valarray<_Tp> > 1104 { 1105 typedef typename _Op::result_type result_type; 1106 typedef _Tp value_type; 1107 1108 _Op __op_; 1109 _A0 __a0_; 1110 const valarray<_Tp>& __a1_; 1111 1112 _LIBCPP_INLINE_VISIBILITY 1113 _BinaryOp(const _Op& __op, const _A0& __a0, const valarray<_Tp>& __a1) 1114 : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1115 1116 _LIBCPP_INLINE_VISIBILITY 1117 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1118 1119 _LIBCPP_INLINE_VISIBILITY 1120 size_t size() const {return __a0_.size();} 1121 }; 1122 1123 template <class _Op, class _Tp> 1124 struct _BinaryOp<_Op, valarray<_Tp>, valarray<_Tp> > 1125 { 1126 typedef typename _Op::result_type result_type; 1127 typedef _Tp value_type; 1128 1129 _Op __op_; 1130 const valarray<_Tp>& __a0_; 1131 const valarray<_Tp>& __a1_; 1132 1133 _LIBCPP_INLINE_VISIBILITY 1134 _BinaryOp(const _Op& __op, const valarray<_Tp>& __a0, const valarray<_Tp>& __a1) 1135 : __op_(__op), __a0_(__a0), __a1_(__a1) {} 1136 1137 _LIBCPP_INLINE_VISIBILITY 1138 value_type operator[](size_t __i) const {return __op_(__a0_[__i], __a1_[__i]);} 1139 1140 _LIBCPP_INLINE_VISIBILITY 1141 size_t size() const {return __a0_.size();} 1142 }; 1143 1144 // slice_array 1145 1146 template <class _Tp> 1147 class _LIBCPP_TEMPLATE_VIS slice_array 1148 { 1149 public: 1150 typedef _Tp value_type; 1151 1152 private: 1153 value_type* __vp_; 1154 size_t __size_; 1155 size_t __stride_; 1156 1157 public: 1158 template <class _Expr> 1159 typename enable_if 1160 < 1161 __is_val_expr<_Expr>::value, 1162 void 1163 >::type 1164 _LIBCPP_INLINE_VISIBILITY 1165 operator=(const _Expr& __v) const; 1166 1167 template <class _Expr> 1168 typename enable_if 1169 < 1170 __is_val_expr<_Expr>::value, 1171 void 1172 >::type 1173 _LIBCPP_INLINE_VISIBILITY 1174 operator*=(const _Expr& __v) const; 1175 1176 template <class _Expr> 1177 typename enable_if 1178 < 1179 __is_val_expr<_Expr>::value, 1180 void 1181 >::type 1182 _LIBCPP_INLINE_VISIBILITY 1183 operator/=(const _Expr& __v) const; 1184 1185 template <class _Expr> 1186 typename enable_if 1187 < 1188 __is_val_expr<_Expr>::value, 1189 void 1190 >::type 1191 _LIBCPP_INLINE_VISIBILITY 1192 operator%=(const _Expr& __v) const; 1193 1194 template <class _Expr> 1195 typename enable_if 1196 < 1197 __is_val_expr<_Expr>::value, 1198 void 1199 >::type 1200 _LIBCPP_INLINE_VISIBILITY 1201 operator+=(const _Expr& __v) const; 1202 1203 template <class _Expr> 1204 typename enable_if 1205 < 1206 __is_val_expr<_Expr>::value, 1207 void 1208 >::type 1209 _LIBCPP_INLINE_VISIBILITY 1210 operator-=(const _Expr& __v) const; 1211 1212 template <class _Expr> 1213 typename enable_if 1214 < 1215 __is_val_expr<_Expr>::value, 1216 void 1217 >::type 1218 _LIBCPP_INLINE_VISIBILITY 1219 operator^=(const _Expr& __v) const; 1220 1221 template <class _Expr> 1222 typename enable_if 1223 < 1224 __is_val_expr<_Expr>::value, 1225 void 1226 >::type 1227 _LIBCPP_INLINE_VISIBILITY 1228 operator&=(const _Expr& __v) const; 1229 1230 template <class _Expr> 1231 typename enable_if 1232 < 1233 __is_val_expr<_Expr>::value, 1234 void 1235 >::type 1236 _LIBCPP_INLINE_VISIBILITY 1237 operator|=(const _Expr& __v) const; 1238 1239 template <class _Expr> 1240 typename enable_if 1241 < 1242 __is_val_expr<_Expr>::value, 1243 void 1244 >::type 1245 _LIBCPP_INLINE_VISIBILITY 1246 operator<<=(const _Expr& __v) const; 1247 1248 template <class _Expr> 1249 typename enable_if 1250 < 1251 __is_val_expr<_Expr>::value, 1252 void 1253 >::type 1254 _LIBCPP_INLINE_VISIBILITY 1255 operator>>=(const _Expr& __v) const; 1256 1257 _LIBCPP_INLINE_VISIBILITY 1258 const slice_array& operator=(const slice_array& __sa) const; 1259 1260 _LIBCPP_INLINE_VISIBILITY 1261 void operator=(const value_type& __x) const; 1262 1263 private: 1264 _LIBCPP_INLINE_VISIBILITY 1265 slice_array(const slice& __sl, const valarray<value_type>& __v) 1266 : __vp_(const_cast<value_type*>(__v.__begin_ + __sl.start())), 1267 __size_(__sl.size()), 1268 __stride_(__sl.stride()) 1269 {} 1270 1271 template <class> friend class valarray; 1272 template <class> friend class sliceExpr; 1273 }; 1274 1275 template <class _Tp> 1276 inline 1277 const slice_array<_Tp>& 1278 slice_array<_Tp>::operator=(const slice_array& __sa) const 1279 { 1280 value_type* __t = __vp_; 1281 const value_type* __s = __sa.__vp_; 1282 for (size_t __n = __size_; __n; --__n, __t += __stride_, __s += __sa.__stride_) 1283 *__t = *__s; 1284 return *this; 1285 } 1286 1287 template <class _Tp> 1288 template <class _Expr> 1289 inline 1290 typename enable_if 1291 < 1292 __is_val_expr<_Expr>::value, 1293 void 1294 >::type 1295 slice_array<_Tp>::operator=(const _Expr& __v) const 1296 { 1297 value_type* __t = __vp_; 1298 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1299 *__t = __v[__i]; 1300 } 1301 1302 template <class _Tp> 1303 template <class _Expr> 1304 inline 1305 typename enable_if 1306 < 1307 __is_val_expr<_Expr>::value, 1308 void 1309 >::type 1310 slice_array<_Tp>::operator*=(const _Expr& __v) const 1311 { 1312 value_type* __t = __vp_; 1313 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1314 *__t *= __v[__i]; 1315 } 1316 1317 template <class _Tp> 1318 template <class _Expr> 1319 inline 1320 typename enable_if 1321 < 1322 __is_val_expr<_Expr>::value, 1323 void 1324 >::type 1325 slice_array<_Tp>::operator/=(const _Expr& __v) const 1326 { 1327 value_type* __t = __vp_; 1328 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1329 *__t /= __v[__i]; 1330 } 1331 1332 template <class _Tp> 1333 template <class _Expr> 1334 inline 1335 typename enable_if 1336 < 1337 __is_val_expr<_Expr>::value, 1338 void 1339 >::type 1340 slice_array<_Tp>::operator%=(const _Expr& __v) const 1341 { 1342 value_type* __t = __vp_; 1343 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1344 *__t %= __v[__i]; 1345 } 1346 1347 template <class _Tp> 1348 template <class _Expr> 1349 inline 1350 typename enable_if 1351 < 1352 __is_val_expr<_Expr>::value, 1353 void 1354 >::type 1355 slice_array<_Tp>::operator+=(const _Expr& __v) const 1356 { 1357 value_type* __t = __vp_; 1358 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1359 *__t += __v[__i]; 1360 } 1361 1362 template <class _Tp> 1363 template <class _Expr> 1364 inline 1365 typename enable_if 1366 < 1367 __is_val_expr<_Expr>::value, 1368 void 1369 >::type 1370 slice_array<_Tp>::operator-=(const _Expr& __v) const 1371 { 1372 value_type* __t = __vp_; 1373 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1374 *__t -= __v[__i]; 1375 } 1376 1377 template <class _Tp> 1378 template <class _Expr> 1379 inline 1380 typename enable_if 1381 < 1382 __is_val_expr<_Expr>::value, 1383 void 1384 >::type 1385 slice_array<_Tp>::operator^=(const _Expr& __v) const 1386 { 1387 value_type* __t = __vp_; 1388 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1389 *__t ^= __v[__i]; 1390 } 1391 1392 template <class _Tp> 1393 template <class _Expr> 1394 inline 1395 typename enable_if 1396 < 1397 __is_val_expr<_Expr>::value, 1398 void 1399 >::type 1400 slice_array<_Tp>::operator&=(const _Expr& __v) const 1401 { 1402 value_type* __t = __vp_; 1403 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1404 *__t &= __v[__i]; 1405 } 1406 1407 template <class _Tp> 1408 template <class _Expr> 1409 inline 1410 typename enable_if 1411 < 1412 __is_val_expr<_Expr>::value, 1413 void 1414 >::type 1415 slice_array<_Tp>::operator|=(const _Expr& __v) const 1416 { 1417 value_type* __t = __vp_; 1418 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1419 *__t |= __v[__i]; 1420 } 1421 1422 template <class _Tp> 1423 template <class _Expr> 1424 inline 1425 typename enable_if 1426 < 1427 __is_val_expr<_Expr>::value, 1428 void 1429 >::type 1430 slice_array<_Tp>::operator<<=(const _Expr& __v) const 1431 { 1432 value_type* __t = __vp_; 1433 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1434 *__t <<= __v[__i]; 1435 } 1436 1437 template <class _Tp> 1438 template <class _Expr> 1439 inline 1440 typename enable_if 1441 < 1442 __is_val_expr<_Expr>::value, 1443 void 1444 >::type 1445 slice_array<_Tp>::operator>>=(const _Expr& __v) const 1446 { 1447 value_type* __t = __vp_; 1448 for (size_t __i = 0; __i < __size_; ++__i, __t += __stride_) 1449 *__t >>= __v[__i]; 1450 } 1451 1452 template <class _Tp> 1453 inline 1454 void 1455 slice_array<_Tp>::operator=(const value_type& __x) const 1456 { 1457 value_type* __t = __vp_; 1458 for (size_t __n = __size_; __n; --__n, __t += __stride_) 1459 *__t = __x; 1460 } 1461 1462 // gslice 1463 1464 class _LIBCPP_TYPE_VIS gslice 1465 { 1466 valarray<size_t> __size_; 1467 valarray<size_t> __stride_; 1468 valarray<size_t> __1d_; 1469 1470 public: 1471 _LIBCPP_INLINE_VISIBILITY 1472 gslice() {} 1473 1474 _LIBCPP_INLINE_VISIBILITY 1475 gslice(size_t __start, const valarray<size_t>& __size, 1476 const valarray<size_t>& __stride) 1477 : __size_(__size), 1478 __stride_(__stride) 1479 {__init(__start);} 1480 1481 #ifndef _LIBCPP_CXX03_LANG 1482 1483 _LIBCPP_INLINE_VISIBILITY 1484 gslice(size_t __start, const valarray<size_t>& __size, 1485 valarray<size_t>&& __stride) 1486 : __size_(__size), 1487 __stride_(move(__stride)) 1488 {__init(__start);} 1489 1490 _LIBCPP_INLINE_VISIBILITY 1491 gslice(size_t __start, valarray<size_t>&& __size, 1492 const valarray<size_t>& __stride) 1493 : __size_(move(__size)), 1494 __stride_(__stride) 1495 {__init(__start);} 1496 1497 _LIBCPP_INLINE_VISIBILITY 1498 gslice(size_t __start, valarray<size_t>&& __size, 1499 valarray<size_t>&& __stride) 1500 : __size_(move(__size)), 1501 __stride_(move(__stride)) 1502 {__init(__start);} 1503 1504 #endif // _LIBCPP_CXX03_LANG 1505 1506 // gslice(const gslice&) = default; 1507 // gslice(gslice&&) = default; 1508 // gslice& operator=(const gslice&) = default; 1509 // gslice& operator=(gslice&&) = default; 1510 1511 _LIBCPP_INLINE_VISIBILITY 1512 size_t start() const {return __1d_.size() ? __1d_[0] : 0;} 1513 1514 _LIBCPP_INLINE_VISIBILITY 1515 valarray<size_t> size() const {return __size_;} 1516 1517 _LIBCPP_INLINE_VISIBILITY 1518 valarray<size_t> stride() const {return __stride_;} 1519 1520 private: 1521 void __init(size_t __start); 1522 1523 template <class> friend class gslice_array; 1524 template <class> friend class valarray; 1525 template <class> friend class __val_expr; 1526 }; 1527 1528 // gslice_array 1529 1530 template <class _Tp> 1531 class _LIBCPP_TEMPLATE_VIS gslice_array 1532 { 1533 public: 1534 typedef _Tp value_type; 1535 1536 private: 1537 value_type* __vp_; 1538 valarray<size_t> __1d_; 1539 1540 public: 1541 template <class _Expr> 1542 typename enable_if 1543 < 1544 __is_val_expr<_Expr>::value, 1545 void 1546 >::type 1547 _LIBCPP_INLINE_VISIBILITY 1548 operator=(const _Expr& __v) const; 1549 1550 template <class _Expr> 1551 typename enable_if 1552 < 1553 __is_val_expr<_Expr>::value, 1554 void 1555 >::type 1556 _LIBCPP_INLINE_VISIBILITY 1557 operator*=(const _Expr& __v) const; 1558 1559 template <class _Expr> 1560 typename enable_if 1561 < 1562 __is_val_expr<_Expr>::value, 1563 void 1564 >::type 1565 _LIBCPP_INLINE_VISIBILITY 1566 operator/=(const _Expr& __v) const; 1567 1568 template <class _Expr> 1569 typename enable_if 1570 < 1571 __is_val_expr<_Expr>::value, 1572 void 1573 >::type 1574 _LIBCPP_INLINE_VISIBILITY 1575 operator%=(const _Expr& __v) const; 1576 1577 template <class _Expr> 1578 typename enable_if 1579 < 1580 __is_val_expr<_Expr>::value, 1581 void 1582 >::type 1583 _LIBCPP_INLINE_VISIBILITY 1584 operator+=(const _Expr& __v) const; 1585 1586 template <class _Expr> 1587 typename enable_if 1588 < 1589 __is_val_expr<_Expr>::value, 1590 void 1591 >::type 1592 _LIBCPP_INLINE_VISIBILITY 1593 operator-=(const _Expr& __v) const; 1594 1595 template <class _Expr> 1596 typename enable_if 1597 < 1598 __is_val_expr<_Expr>::value, 1599 void 1600 >::type 1601 _LIBCPP_INLINE_VISIBILITY 1602 operator^=(const _Expr& __v) const; 1603 1604 template <class _Expr> 1605 typename enable_if 1606 < 1607 __is_val_expr<_Expr>::value, 1608 void 1609 >::type 1610 _LIBCPP_INLINE_VISIBILITY 1611 operator&=(const _Expr& __v) const; 1612 1613 template <class _Expr> 1614 typename enable_if 1615 < 1616 __is_val_expr<_Expr>::value, 1617 void 1618 >::type 1619 _LIBCPP_INLINE_VISIBILITY 1620 operator|=(const _Expr& __v) const; 1621 1622 template <class _Expr> 1623 typename enable_if 1624 < 1625 __is_val_expr<_Expr>::value, 1626 void 1627 >::type 1628 _LIBCPP_INLINE_VISIBILITY 1629 operator<<=(const _Expr& __v) const; 1630 1631 template <class _Expr> 1632 typename enable_if 1633 < 1634 __is_val_expr<_Expr>::value, 1635 void 1636 >::type 1637 _LIBCPP_INLINE_VISIBILITY 1638 operator>>=(const _Expr& __v) const; 1639 1640 _LIBCPP_INLINE_VISIBILITY 1641 const gslice_array& operator=(const gslice_array& __ga) const; 1642 1643 _LIBCPP_INLINE_VISIBILITY 1644 void operator=(const value_type& __x) const; 1645 1646 // gslice_array(const gslice_array&) = default; 1647 // gslice_array(gslice_array&&) = default; 1648 // gslice_array& operator=(const gslice_array&) = default; 1649 // gslice_array& operator=(gslice_array&&) = default; 1650 1651 private: 1652 gslice_array(const gslice& __gs, const valarray<value_type>& __v) 1653 : __vp_(const_cast<value_type*>(__v.__begin_)), 1654 __1d_(__gs.__1d_) 1655 {} 1656 1657 #ifndef _LIBCPP_CXX03_LANG 1658 gslice_array(gslice&& __gs, const valarray<value_type>& __v) 1659 : __vp_(const_cast<value_type*>(__v.__begin_)), 1660 __1d_(move(__gs.__1d_)) 1661 {} 1662 #endif // _LIBCPP_CXX03_LANG 1663 1664 template <class> friend class valarray; 1665 }; 1666 1667 template <class _Tp> 1668 template <class _Expr> 1669 inline 1670 typename enable_if 1671 < 1672 __is_val_expr<_Expr>::value, 1673 void 1674 >::type 1675 gslice_array<_Tp>::operator=(const _Expr& __v) const 1676 { 1677 typedef const size_t* _Ip; 1678 size_t __j = 0; 1679 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1680 __vp_[*__i] = __v[__j]; 1681 } 1682 1683 template <class _Tp> 1684 template <class _Expr> 1685 inline 1686 typename enable_if 1687 < 1688 __is_val_expr<_Expr>::value, 1689 void 1690 >::type 1691 gslice_array<_Tp>::operator*=(const _Expr& __v) const 1692 { 1693 typedef const size_t* _Ip; 1694 size_t __j = 0; 1695 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1696 __vp_[*__i] *= __v[__j]; 1697 } 1698 1699 template <class _Tp> 1700 template <class _Expr> 1701 inline 1702 typename enable_if 1703 < 1704 __is_val_expr<_Expr>::value, 1705 void 1706 >::type 1707 gslice_array<_Tp>::operator/=(const _Expr& __v) const 1708 { 1709 typedef const size_t* _Ip; 1710 size_t __j = 0; 1711 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1712 __vp_[*__i] /= __v[__j]; 1713 } 1714 1715 template <class _Tp> 1716 template <class _Expr> 1717 inline 1718 typename enable_if 1719 < 1720 __is_val_expr<_Expr>::value, 1721 void 1722 >::type 1723 gslice_array<_Tp>::operator%=(const _Expr& __v) const 1724 { 1725 typedef const size_t* _Ip; 1726 size_t __j = 0; 1727 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1728 __vp_[*__i] %= __v[__j]; 1729 } 1730 1731 template <class _Tp> 1732 template <class _Expr> 1733 inline 1734 typename enable_if 1735 < 1736 __is_val_expr<_Expr>::value, 1737 void 1738 >::type 1739 gslice_array<_Tp>::operator+=(const _Expr& __v) const 1740 { 1741 typedef const size_t* _Ip; 1742 size_t __j = 0; 1743 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1744 __vp_[*__i] += __v[__j]; 1745 } 1746 1747 template <class _Tp> 1748 template <class _Expr> 1749 inline 1750 typename enable_if 1751 < 1752 __is_val_expr<_Expr>::value, 1753 void 1754 >::type 1755 gslice_array<_Tp>::operator-=(const _Expr& __v) const 1756 { 1757 typedef const size_t* _Ip; 1758 size_t __j = 0; 1759 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1760 __vp_[*__i] -= __v[__j]; 1761 } 1762 1763 template <class _Tp> 1764 template <class _Expr> 1765 inline 1766 typename enable_if 1767 < 1768 __is_val_expr<_Expr>::value, 1769 void 1770 >::type 1771 gslice_array<_Tp>::operator^=(const _Expr& __v) const 1772 { 1773 typedef const size_t* _Ip; 1774 size_t __j = 0; 1775 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1776 __vp_[*__i] ^= __v[__j]; 1777 } 1778 1779 template <class _Tp> 1780 template <class _Expr> 1781 inline 1782 typename enable_if 1783 < 1784 __is_val_expr<_Expr>::value, 1785 void 1786 >::type 1787 gslice_array<_Tp>::operator&=(const _Expr& __v) const 1788 { 1789 typedef const size_t* _Ip; 1790 size_t __j = 0; 1791 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1792 __vp_[*__i] &= __v[__j]; 1793 } 1794 1795 template <class _Tp> 1796 template <class _Expr> 1797 inline 1798 typename enable_if 1799 < 1800 __is_val_expr<_Expr>::value, 1801 void 1802 >::type 1803 gslice_array<_Tp>::operator|=(const _Expr& __v) const 1804 { 1805 typedef const size_t* _Ip; 1806 size_t __j = 0; 1807 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1808 __vp_[*__i] |= __v[__j]; 1809 } 1810 1811 template <class _Tp> 1812 template <class _Expr> 1813 inline 1814 typename enable_if 1815 < 1816 __is_val_expr<_Expr>::value, 1817 void 1818 >::type 1819 gslice_array<_Tp>::operator<<=(const _Expr& __v) const 1820 { 1821 typedef const size_t* _Ip; 1822 size_t __j = 0; 1823 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1824 __vp_[*__i] <<= __v[__j]; 1825 } 1826 1827 template <class _Tp> 1828 template <class _Expr> 1829 inline 1830 typename enable_if 1831 < 1832 __is_val_expr<_Expr>::value, 1833 void 1834 >::type 1835 gslice_array<_Tp>::operator>>=(const _Expr& __v) const 1836 { 1837 typedef const size_t* _Ip; 1838 size_t __j = 0; 1839 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i, ++__j) 1840 __vp_[*__i] >>= __v[__j]; 1841 } 1842 1843 template <class _Tp> 1844 inline 1845 const gslice_array<_Tp>& 1846 gslice_array<_Tp>::operator=(const gslice_array& __ga) const 1847 { 1848 typedef const size_t* _Ip; 1849 const value_type* __s = __ga.__vp_; 1850 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ga.__1d_.__begin_; 1851 __i != __e; ++__i, ++__j) 1852 __vp_[*__i] = __s[*__j]; 1853 return *this; 1854 } 1855 1856 template <class _Tp> 1857 inline 1858 void 1859 gslice_array<_Tp>::operator=(const value_type& __x) const 1860 { 1861 typedef const size_t* _Ip; 1862 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) 1863 __vp_[*__i] = __x; 1864 } 1865 1866 // mask_array 1867 1868 template <class _Tp> 1869 class _LIBCPP_TEMPLATE_VIS mask_array 1870 { 1871 public: 1872 typedef _Tp value_type; 1873 1874 private: 1875 value_type* __vp_; 1876 valarray<size_t> __1d_; 1877 1878 public: 1879 template <class _Expr> 1880 typename enable_if 1881 < 1882 __is_val_expr<_Expr>::value, 1883 void 1884 >::type 1885 _LIBCPP_INLINE_VISIBILITY 1886 operator=(const _Expr& __v) const; 1887 1888 template <class _Expr> 1889 typename enable_if 1890 < 1891 __is_val_expr<_Expr>::value, 1892 void 1893 >::type 1894 _LIBCPP_INLINE_VISIBILITY 1895 operator*=(const _Expr& __v) const; 1896 1897 template <class _Expr> 1898 typename enable_if 1899 < 1900 __is_val_expr<_Expr>::value, 1901 void 1902 >::type 1903 _LIBCPP_INLINE_VISIBILITY 1904 operator/=(const _Expr& __v) const; 1905 1906 template <class _Expr> 1907 typename enable_if 1908 < 1909 __is_val_expr<_Expr>::value, 1910 void 1911 >::type 1912 _LIBCPP_INLINE_VISIBILITY 1913 operator%=(const _Expr& __v) const; 1914 1915 template <class _Expr> 1916 typename enable_if 1917 < 1918 __is_val_expr<_Expr>::value, 1919 void 1920 >::type 1921 _LIBCPP_INLINE_VISIBILITY 1922 operator+=(const _Expr& __v) const; 1923 1924 template <class _Expr> 1925 typename enable_if 1926 < 1927 __is_val_expr<_Expr>::value, 1928 void 1929 >::type 1930 _LIBCPP_INLINE_VISIBILITY 1931 operator-=(const _Expr& __v) const; 1932 1933 template <class _Expr> 1934 typename enable_if 1935 < 1936 __is_val_expr<_Expr>::value, 1937 void 1938 >::type 1939 _LIBCPP_INLINE_VISIBILITY 1940 operator^=(const _Expr& __v) const; 1941 1942 template <class _Expr> 1943 typename enable_if 1944 < 1945 __is_val_expr<_Expr>::value, 1946 void 1947 >::type 1948 _LIBCPP_INLINE_VISIBILITY 1949 operator&=(const _Expr& __v) const; 1950 1951 template <class _Expr> 1952 typename enable_if 1953 < 1954 __is_val_expr<_Expr>::value, 1955 void 1956 >::type 1957 _LIBCPP_INLINE_VISIBILITY 1958 operator|=(const _Expr& __v) const; 1959 1960 template <class _Expr> 1961 typename enable_if 1962 < 1963 __is_val_expr<_Expr>::value, 1964 void 1965 >::type 1966 _LIBCPP_INLINE_VISIBILITY 1967 operator<<=(const _Expr& __v) const; 1968 1969 template <class _Expr> 1970 typename enable_if 1971 < 1972 __is_val_expr<_Expr>::value, 1973 void 1974 >::type 1975 _LIBCPP_INLINE_VISIBILITY 1976 operator>>=(const _Expr& __v) const; 1977 1978 _LIBCPP_INLINE_VISIBILITY 1979 const mask_array& operator=(const mask_array& __ma) const; 1980 1981 _LIBCPP_INLINE_VISIBILITY 1982 void operator=(const value_type& __x) const; 1983 1984 // mask_array(const mask_array&) = default; 1985 // mask_array(mask_array&&) = default; 1986 // mask_array& operator=(const mask_array&) = default; 1987 // mask_array& operator=(mask_array&&) = default; 1988 1989 private: 1990 _LIBCPP_INLINE_VISIBILITY 1991 mask_array(const valarray<bool>& __vb, const valarray<value_type>& __v) 1992 : __vp_(const_cast<value_type*>(__v.__begin_)), 1993 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) 1994 { 1995 size_t __j = 0; 1996 for (size_t __i = 0; __i < __vb.size(); ++__i) 1997 if (__vb[__i]) 1998 __1d_[__j++] = __i; 1999 } 2000 2001 template <class> friend class valarray; 2002 }; 2003 2004 template <class _Tp> 2005 template <class _Expr> 2006 inline 2007 typename enable_if 2008 < 2009 __is_val_expr<_Expr>::value, 2010 void 2011 >::type 2012 mask_array<_Tp>::operator=(const _Expr& __v) const 2013 { 2014 size_t __n = __1d_.size(); 2015 for (size_t __i = 0; __i < __n; ++__i) 2016 __vp_[__1d_[__i]] = __v[__i]; 2017 } 2018 2019 template <class _Tp> 2020 template <class _Expr> 2021 inline 2022 typename enable_if 2023 < 2024 __is_val_expr<_Expr>::value, 2025 void 2026 >::type 2027 mask_array<_Tp>::operator*=(const _Expr& __v) const 2028 { 2029 size_t __n = __1d_.size(); 2030 for (size_t __i = 0; __i < __n; ++__i) 2031 __vp_[__1d_[__i]] *= __v[__i]; 2032 } 2033 2034 template <class _Tp> 2035 template <class _Expr> 2036 inline 2037 typename enable_if 2038 < 2039 __is_val_expr<_Expr>::value, 2040 void 2041 >::type 2042 mask_array<_Tp>::operator/=(const _Expr& __v) const 2043 { 2044 size_t __n = __1d_.size(); 2045 for (size_t __i = 0; __i < __n; ++__i) 2046 __vp_[__1d_[__i]] /= __v[__i]; 2047 } 2048 2049 template <class _Tp> 2050 template <class _Expr> 2051 inline 2052 typename enable_if 2053 < 2054 __is_val_expr<_Expr>::value, 2055 void 2056 >::type 2057 mask_array<_Tp>::operator%=(const _Expr& __v) const 2058 { 2059 size_t __n = __1d_.size(); 2060 for (size_t __i = 0; __i < __n; ++__i) 2061 __vp_[__1d_[__i]] %= __v[__i]; 2062 } 2063 2064 template <class _Tp> 2065 template <class _Expr> 2066 inline 2067 typename enable_if 2068 < 2069 __is_val_expr<_Expr>::value, 2070 void 2071 >::type 2072 mask_array<_Tp>::operator+=(const _Expr& __v) const 2073 { 2074 size_t __n = __1d_.size(); 2075 for (size_t __i = 0; __i < __n; ++__i) 2076 __vp_[__1d_[__i]] += __v[__i]; 2077 } 2078 2079 template <class _Tp> 2080 template <class _Expr> 2081 inline 2082 typename enable_if 2083 < 2084 __is_val_expr<_Expr>::value, 2085 void 2086 >::type 2087 mask_array<_Tp>::operator-=(const _Expr& __v) const 2088 { 2089 size_t __n = __1d_.size(); 2090 for (size_t __i = 0; __i < __n; ++__i) 2091 __vp_[__1d_[__i]] -= __v[__i]; 2092 } 2093 2094 template <class _Tp> 2095 template <class _Expr> 2096 inline 2097 typename enable_if 2098 < 2099 __is_val_expr<_Expr>::value, 2100 void 2101 >::type 2102 mask_array<_Tp>::operator^=(const _Expr& __v) const 2103 { 2104 size_t __n = __1d_.size(); 2105 for (size_t __i = 0; __i < __n; ++__i) 2106 __vp_[__1d_[__i]] ^= __v[__i]; 2107 } 2108 2109 template <class _Tp> 2110 template <class _Expr> 2111 inline 2112 typename enable_if 2113 < 2114 __is_val_expr<_Expr>::value, 2115 void 2116 >::type 2117 mask_array<_Tp>::operator&=(const _Expr& __v) const 2118 { 2119 size_t __n = __1d_.size(); 2120 for (size_t __i = 0; __i < __n; ++__i) 2121 __vp_[__1d_[__i]] &= __v[__i]; 2122 } 2123 2124 template <class _Tp> 2125 template <class _Expr> 2126 inline 2127 typename enable_if 2128 < 2129 __is_val_expr<_Expr>::value, 2130 void 2131 >::type 2132 mask_array<_Tp>::operator|=(const _Expr& __v) const 2133 { 2134 size_t __n = __1d_.size(); 2135 for (size_t __i = 0; __i < __n; ++__i) 2136 __vp_[__1d_[__i]] |= __v[__i]; 2137 } 2138 2139 template <class _Tp> 2140 template <class _Expr> 2141 inline 2142 typename enable_if 2143 < 2144 __is_val_expr<_Expr>::value, 2145 void 2146 >::type 2147 mask_array<_Tp>::operator<<=(const _Expr& __v) const 2148 { 2149 size_t __n = __1d_.size(); 2150 for (size_t __i = 0; __i < __n; ++__i) 2151 __vp_[__1d_[__i]] <<= __v[__i]; 2152 } 2153 2154 template <class _Tp> 2155 template <class _Expr> 2156 inline 2157 typename enable_if 2158 < 2159 __is_val_expr<_Expr>::value, 2160 void 2161 >::type 2162 mask_array<_Tp>::operator>>=(const _Expr& __v) const 2163 { 2164 size_t __n = __1d_.size(); 2165 for (size_t __i = 0; __i < __n; ++__i) 2166 __vp_[__1d_[__i]] >>= __v[__i]; 2167 } 2168 2169 template <class _Tp> 2170 inline 2171 const mask_array<_Tp>& 2172 mask_array<_Tp>::operator=(const mask_array& __ma) const 2173 { 2174 size_t __n = __1d_.size(); 2175 for (size_t __i = 0; __i < __n; ++__i) 2176 __vp_[__1d_[__i]] = __ma.__vp_[__1d_[__i]]; 2177 return *this; 2178 } 2179 2180 template <class _Tp> 2181 inline 2182 void 2183 mask_array<_Tp>::operator=(const value_type& __x) const 2184 { 2185 size_t __n = __1d_.size(); 2186 for (size_t __i = 0; __i < __n; ++__i) 2187 __vp_[__1d_[__i]] = __x; 2188 } 2189 2190 template <class _ValExpr> 2191 class __mask_expr 2192 { 2193 typedef typename remove_reference<_ValExpr>::type _RmExpr; 2194 public: 2195 typedef typename _RmExpr::value_type value_type; 2196 typedef value_type result_type; 2197 2198 private: 2199 _ValExpr __expr_; 2200 valarray<size_t> __1d_; 2201 2202 _LIBCPP_INLINE_VISIBILITY 2203 __mask_expr(const valarray<bool>& __vb, const _RmExpr& __e) 2204 : __expr_(__e), 2205 __1d_(static_cast<size_t>(count(__vb.__begin_, __vb.__end_, true))) 2206 { 2207 size_t __j = 0; 2208 for (size_t __i = 0; __i < __vb.size(); ++__i) 2209 if (__vb[__i]) 2210 __1d_[__j++] = __i; 2211 } 2212 2213 public: 2214 _LIBCPP_INLINE_VISIBILITY 2215 result_type operator[](size_t __i) const 2216 {return __expr_[__1d_[__i]];} 2217 2218 _LIBCPP_INLINE_VISIBILITY 2219 size_t size() const {return __1d_.size();} 2220 2221 template <class> friend class valarray; 2222 }; 2223 2224 // indirect_array 2225 2226 template <class _Tp> 2227 class _LIBCPP_TEMPLATE_VIS indirect_array 2228 { 2229 public: 2230 typedef _Tp value_type; 2231 2232 private: 2233 value_type* __vp_; 2234 valarray<size_t> __1d_; 2235 2236 public: 2237 template <class _Expr> 2238 typename enable_if 2239 < 2240 __is_val_expr<_Expr>::value, 2241 void 2242 >::type 2243 _LIBCPP_INLINE_VISIBILITY 2244 operator=(const _Expr& __v) const; 2245 2246 template <class _Expr> 2247 typename enable_if 2248 < 2249 __is_val_expr<_Expr>::value, 2250 void 2251 >::type 2252 _LIBCPP_INLINE_VISIBILITY 2253 operator*=(const _Expr& __v) const; 2254 2255 template <class _Expr> 2256 typename enable_if 2257 < 2258 __is_val_expr<_Expr>::value, 2259 void 2260 >::type 2261 _LIBCPP_INLINE_VISIBILITY 2262 operator/=(const _Expr& __v) const; 2263 2264 template <class _Expr> 2265 typename enable_if 2266 < 2267 __is_val_expr<_Expr>::value, 2268 void 2269 >::type 2270 _LIBCPP_INLINE_VISIBILITY 2271 operator%=(const _Expr& __v) const; 2272 2273 template <class _Expr> 2274 typename enable_if 2275 < 2276 __is_val_expr<_Expr>::value, 2277 void 2278 >::type 2279 _LIBCPP_INLINE_VISIBILITY 2280 operator+=(const _Expr& __v) const; 2281 2282 template <class _Expr> 2283 typename enable_if 2284 < 2285 __is_val_expr<_Expr>::value, 2286 void 2287 >::type 2288 _LIBCPP_INLINE_VISIBILITY 2289 operator-=(const _Expr& __v) const; 2290 2291 template <class _Expr> 2292 typename enable_if 2293 < 2294 __is_val_expr<_Expr>::value, 2295 void 2296 >::type 2297 _LIBCPP_INLINE_VISIBILITY 2298 operator^=(const _Expr& __v) const; 2299 2300 template <class _Expr> 2301 typename enable_if 2302 < 2303 __is_val_expr<_Expr>::value, 2304 void 2305 >::type 2306 _LIBCPP_INLINE_VISIBILITY 2307 operator&=(const _Expr& __v) const; 2308 2309 template <class _Expr> 2310 typename enable_if 2311 < 2312 __is_val_expr<_Expr>::value, 2313 void 2314 >::type 2315 _LIBCPP_INLINE_VISIBILITY 2316 operator|=(const _Expr& __v) const; 2317 2318 template <class _Expr> 2319 typename enable_if 2320 < 2321 __is_val_expr<_Expr>::value, 2322 void 2323 >::type 2324 _LIBCPP_INLINE_VISIBILITY 2325 operator<<=(const _Expr& __v) const; 2326 2327 template <class _Expr> 2328 typename enable_if 2329 < 2330 __is_val_expr<_Expr>::value, 2331 void 2332 >::type 2333 _LIBCPP_INLINE_VISIBILITY 2334 operator>>=(const _Expr& __v) const; 2335 2336 _LIBCPP_INLINE_VISIBILITY 2337 const indirect_array& operator=(const indirect_array& __ia) const; 2338 2339 _LIBCPP_INLINE_VISIBILITY 2340 void operator=(const value_type& __x) const; 2341 2342 // indirect_array(const indirect_array&) = default; 2343 // indirect_array(indirect_array&&) = default; 2344 // indirect_array& operator=(const indirect_array&) = default; 2345 // indirect_array& operator=(indirect_array&&) = default; 2346 2347 private: 2348 _LIBCPP_INLINE_VISIBILITY 2349 indirect_array(const valarray<size_t>& __ia, const valarray<value_type>& __v) 2350 : __vp_(const_cast<value_type*>(__v.__begin_)), 2351 __1d_(__ia) 2352 {} 2353 2354 #ifndef _LIBCPP_CXX03_LANG 2355 2356 _LIBCPP_INLINE_VISIBILITY 2357 indirect_array(valarray<size_t>&& __ia, const valarray<value_type>& __v) 2358 : __vp_(const_cast<value_type*>(__v.__begin_)), 2359 __1d_(move(__ia)) 2360 {} 2361 2362 #endif // _LIBCPP_CXX03_LANG 2363 2364 template <class> friend class valarray; 2365 }; 2366 2367 template <class _Tp> 2368 template <class _Expr> 2369 inline 2370 typename enable_if 2371 < 2372 __is_val_expr<_Expr>::value, 2373 void 2374 >::type 2375 indirect_array<_Tp>::operator=(const _Expr& __v) const 2376 { 2377 size_t __n = __1d_.size(); 2378 for (size_t __i = 0; __i < __n; ++__i) 2379 __vp_[__1d_[__i]] = __v[__i]; 2380 } 2381 2382 template <class _Tp> 2383 template <class _Expr> 2384 inline 2385 typename enable_if 2386 < 2387 __is_val_expr<_Expr>::value, 2388 void 2389 >::type 2390 indirect_array<_Tp>::operator*=(const _Expr& __v) const 2391 { 2392 size_t __n = __1d_.size(); 2393 for (size_t __i = 0; __i < __n; ++__i) 2394 __vp_[__1d_[__i]] *= __v[__i]; 2395 } 2396 2397 template <class _Tp> 2398 template <class _Expr> 2399 inline 2400 typename enable_if 2401 < 2402 __is_val_expr<_Expr>::value, 2403 void 2404 >::type 2405 indirect_array<_Tp>::operator/=(const _Expr& __v) const 2406 { 2407 size_t __n = __1d_.size(); 2408 for (size_t __i = 0; __i < __n; ++__i) 2409 __vp_[__1d_[__i]] /= __v[__i]; 2410 } 2411 2412 template <class _Tp> 2413 template <class _Expr> 2414 inline 2415 typename enable_if 2416 < 2417 __is_val_expr<_Expr>::value, 2418 void 2419 >::type 2420 indirect_array<_Tp>::operator%=(const _Expr& __v) const 2421 { 2422 size_t __n = __1d_.size(); 2423 for (size_t __i = 0; __i < __n; ++__i) 2424 __vp_[__1d_[__i]] %= __v[__i]; 2425 } 2426 2427 template <class _Tp> 2428 template <class _Expr> 2429 inline 2430 typename enable_if 2431 < 2432 __is_val_expr<_Expr>::value, 2433 void 2434 >::type 2435 indirect_array<_Tp>::operator+=(const _Expr& __v) const 2436 { 2437 size_t __n = __1d_.size(); 2438 for (size_t __i = 0; __i < __n; ++__i) 2439 __vp_[__1d_[__i]] += __v[__i]; 2440 } 2441 2442 template <class _Tp> 2443 template <class _Expr> 2444 inline 2445 typename enable_if 2446 < 2447 __is_val_expr<_Expr>::value, 2448 void 2449 >::type 2450 indirect_array<_Tp>::operator-=(const _Expr& __v) const 2451 { 2452 size_t __n = __1d_.size(); 2453 for (size_t __i = 0; __i < __n; ++__i) 2454 __vp_[__1d_[__i]] -= __v[__i]; 2455 } 2456 2457 template <class _Tp> 2458 template <class _Expr> 2459 inline 2460 typename enable_if 2461 < 2462 __is_val_expr<_Expr>::value, 2463 void 2464 >::type 2465 indirect_array<_Tp>::operator^=(const _Expr& __v) const 2466 { 2467 size_t __n = __1d_.size(); 2468 for (size_t __i = 0; __i < __n; ++__i) 2469 __vp_[__1d_[__i]] ^= __v[__i]; 2470 } 2471 2472 template <class _Tp> 2473 template <class _Expr> 2474 inline 2475 typename enable_if 2476 < 2477 __is_val_expr<_Expr>::value, 2478 void 2479 >::type 2480 indirect_array<_Tp>::operator&=(const _Expr& __v) const 2481 { 2482 size_t __n = __1d_.size(); 2483 for (size_t __i = 0; __i < __n; ++__i) 2484 __vp_[__1d_[__i]] &= __v[__i]; 2485 } 2486 2487 template <class _Tp> 2488 template <class _Expr> 2489 inline 2490 typename enable_if 2491 < 2492 __is_val_expr<_Expr>::value, 2493 void 2494 >::type 2495 indirect_array<_Tp>::operator|=(const _Expr& __v) const 2496 { 2497 size_t __n = __1d_.size(); 2498 for (size_t __i = 0; __i < __n; ++__i) 2499 __vp_[__1d_[__i]] |= __v[__i]; 2500 } 2501 2502 template <class _Tp> 2503 template <class _Expr> 2504 inline 2505 typename enable_if 2506 < 2507 __is_val_expr<_Expr>::value, 2508 void 2509 >::type 2510 indirect_array<_Tp>::operator<<=(const _Expr& __v) const 2511 { 2512 size_t __n = __1d_.size(); 2513 for (size_t __i = 0; __i < __n; ++__i) 2514 __vp_[__1d_[__i]] <<= __v[__i]; 2515 } 2516 2517 template <class _Tp> 2518 template <class _Expr> 2519 inline 2520 typename enable_if 2521 < 2522 __is_val_expr<_Expr>::value, 2523 void 2524 >::type 2525 indirect_array<_Tp>::operator>>=(const _Expr& __v) const 2526 { 2527 size_t __n = __1d_.size(); 2528 for (size_t __i = 0; __i < __n; ++__i) 2529 __vp_[__1d_[__i]] >>= __v[__i]; 2530 } 2531 2532 template <class _Tp> 2533 inline 2534 const indirect_array<_Tp>& 2535 indirect_array<_Tp>::operator=(const indirect_array& __ia) const 2536 { 2537 typedef const size_t* _Ip; 2538 const value_type* __s = __ia.__vp_; 2539 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_, __j = __ia.__1d_.__begin_; 2540 __i != __e; ++__i, ++__j) 2541 __vp_[*__i] = __s[*__j]; 2542 return *this; 2543 } 2544 2545 template <class _Tp> 2546 inline 2547 void 2548 indirect_array<_Tp>::operator=(const value_type& __x) const 2549 { 2550 typedef const size_t* _Ip; 2551 for (_Ip __i = __1d_.__begin_, __e = __1d_.__end_; __i != __e; ++__i) 2552 __vp_[*__i] = __x; 2553 } 2554 2555 template <class _ValExpr> 2556 class __indirect_expr 2557 { 2558 typedef typename remove_reference<_ValExpr>::type _RmExpr; 2559 public: 2560 typedef typename _RmExpr::value_type value_type; 2561 typedef value_type result_type; 2562 2563 private: 2564 _ValExpr __expr_; 2565 valarray<size_t> __1d_; 2566 2567 _LIBCPP_INLINE_VISIBILITY 2568 __indirect_expr(const valarray<size_t>& __ia, const _RmExpr& __e) 2569 : __expr_(__e), 2570 __1d_(__ia) 2571 {} 2572 2573 #ifndef _LIBCPP_CXX03_LANG 2574 2575 _LIBCPP_INLINE_VISIBILITY 2576 __indirect_expr(valarray<size_t>&& __ia, const _RmExpr& __e) 2577 : __expr_(__e), 2578 __1d_(move(__ia)) 2579 {} 2580 2581 #endif // _LIBCPP_CXX03_LANG 2582 2583 public: 2584 _LIBCPP_INLINE_VISIBILITY 2585 result_type operator[](size_t __i) const 2586 {return __expr_[__1d_[__i]];} 2587 2588 _LIBCPP_INLINE_VISIBILITY 2589 size_t size() const {return __1d_.size();} 2590 2591 template <class> friend class _LIBCPP_TEMPLATE_VIS valarray; 2592 }; 2593 2594 template<class _ValExpr> 2595 class __val_expr 2596 { 2597 typedef typename remove_reference<_ValExpr>::type _RmExpr; 2598 2599 _ValExpr __expr_; 2600 public: 2601 typedef typename _RmExpr::value_type value_type; 2602 typedef typename _RmExpr::result_type result_type; 2603 2604 _LIBCPP_INLINE_VISIBILITY 2605 explicit __val_expr(const _RmExpr& __e) : __expr_(__e) {} 2606 2607 _LIBCPP_INLINE_VISIBILITY 2608 result_type operator[](size_t __i) const 2609 {return __expr_[__i];} 2610 2611 _LIBCPP_INLINE_VISIBILITY 2612 __val_expr<__slice_expr<_ValExpr> > operator[](slice __s) const 2613 {return __val_expr<__slice_expr<_ValExpr> >(__expr_, __s);} 2614 2615 _LIBCPP_INLINE_VISIBILITY 2616 __val_expr<__indirect_expr<_ValExpr> > operator[](const gslice& __gs) const 2617 {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __gs.__1d_);} 2618 2619 _LIBCPP_INLINE_VISIBILITY 2620 __val_expr<__mask_expr<_ValExpr> > operator[](const valarray<bool>& __vb) const 2621 {return __val_expr<__mask_expr<_ValExpr> >(__expr_, __vb);} 2622 2623 _LIBCPP_INLINE_VISIBILITY 2624 __val_expr<__indirect_expr<_ValExpr> > operator[](const valarray<size_t>& __vs) const 2625 {return __val_expr<__indirect_expr<_ValExpr> >(__expr_, __vs);} 2626 2627 _LIBCPP_INLINE_VISIBILITY 2628 __val_expr<_UnaryOp<__unary_plus<value_type>, _ValExpr> > 2629 operator+() const 2630 { 2631 typedef _UnaryOp<__unary_plus<value_type>, _ValExpr> _NewExpr; 2632 return __val_expr<_NewExpr>(_NewExpr(__unary_plus<value_type>(), __expr_)); 2633 } 2634 2635 _LIBCPP_INLINE_VISIBILITY 2636 __val_expr<_UnaryOp<negate<value_type>, _ValExpr> > 2637 operator-() const 2638 { 2639 typedef _UnaryOp<negate<value_type>, _ValExpr> _NewExpr; 2640 return __val_expr<_NewExpr>(_NewExpr(negate<value_type>(), __expr_)); 2641 } 2642 2643 _LIBCPP_INLINE_VISIBILITY 2644 __val_expr<_UnaryOp<__bit_not<value_type>, _ValExpr> > 2645 operator~() const 2646 { 2647 typedef _UnaryOp<__bit_not<value_type>, _ValExpr> _NewExpr; 2648 return __val_expr<_NewExpr>(_NewExpr(__bit_not<value_type>(), __expr_)); 2649 } 2650 2651 _LIBCPP_INLINE_VISIBILITY 2652 __val_expr<_UnaryOp<logical_not<value_type>, _ValExpr> > 2653 operator!() const 2654 { 2655 typedef _UnaryOp<logical_not<value_type>, _ValExpr> _NewExpr; 2656 return __val_expr<_NewExpr>(_NewExpr(logical_not<value_type>(), __expr_)); 2657 } 2658 2659 operator valarray<result_type>() const; 2660 2661 _LIBCPP_INLINE_VISIBILITY 2662 size_t size() const {return __expr_.size();} 2663 2664 _LIBCPP_INLINE_VISIBILITY 2665 result_type sum() const 2666 { 2667 size_t __n = __expr_.size(); 2668 result_type __r = __n ? __expr_[0] : result_type(); 2669 for (size_t __i = 1; __i < __n; ++__i) 2670 __r += __expr_[__i]; 2671 return __r; 2672 } 2673 2674 _LIBCPP_INLINE_VISIBILITY 2675 result_type min() const 2676 { 2677 size_t __n = size(); 2678 result_type __r = __n ? (*this)[0] : result_type(); 2679 for (size_t __i = 1; __i < __n; ++__i) 2680 { 2681 result_type __x = __expr_[__i]; 2682 if (__x < __r) 2683 __r = __x; 2684 } 2685 return __r; 2686 } 2687 2688 _LIBCPP_INLINE_VISIBILITY 2689 result_type max() const 2690 { 2691 size_t __n = size(); 2692 result_type __r = __n ? (*this)[0] : result_type(); 2693 for (size_t __i = 1; __i < __n; ++__i) 2694 { 2695 result_type __x = __expr_[__i]; 2696 if (__r < __x) 2697 __r = __x; 2698 } 2699 return __r; 2700 } 2701 2702 _LIBCPP_INLINE_VISIBILITY 2703 __val_expr<__shift_expr<_ValExpr> > shift (int __i) const 2704 {return __val_expr<__shift_expr<_ValExpr> >(__shift_expr<_ValExpr>(__i, __expr_));} 2705 2706 _LIBCPP_INLINE_VISIBILITY 2707 __val_expr<__cshift_expr<_ValExpr> > cshift(int __i) const 2708 {return __val_expr<__cshift_expr<_ValExpr> >(__cshift_expr<_ValExpr>(__i, __expr_));} 2709 2710 _LIBCPP_INLINE_VISIBILITY 2711 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(value_type)>, _ValExpr> > 2712 apply(value_type __f(value_type)) const 2713 { 2714 typedef __apply_expr<value_type, value_type(*)(value_type)> _Op; 2715 typedef _UnaryOp<_Op, _ValExpr> _NewExpr; 2716 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); 2717 } 2718 2719 _LIBCPP_INLINE_VISIBILITY 2720 __val_expr<_UnaryOp<__apply_expr<value_type, value_type(*)(const value_type&)>, _ValExpr> > 2721 apply(value_type __f(const value_type&)) const 2722 { 2723 typedef __apply_expr<value_type, value_type(*)(const value_type&)> _Op; 2724 typedef _UnaryOp<_Op, _ValExpr> _NewExpr; 2725 return __val_expr<_NewExpr>(_NewExpr(_Op(__f), __expr_)); 2726 } 2727 }; 2728 2729 template<class _ValExpr> 2730 __val_expr<_ValExpr>::operator valarray<__val_expr::result_type>() const 2731 { 2732 valarray<result_type> __r; 2733 size_t __n = __expr_.size(); 2734 if (__n) 2735 { 2736 __r.__begin_ = 2737 __r.__end_ = 2738 static_cast<result_type*>(_VSTD::__allocate(__n * sizeof(result_type))); 2739 for (size_t __i = 0; __i != __n; ++__r.__end_, ++__i) 2740 ::new (__r.__end_) result_type(__expr_[__i]); 2741 } 2742 return __r; 2743 } 2744 2745 // valarray 2746 2747 template <class _Tp> 2748 inline 2749 valarray<_Tp>::valarray(size_t __n) 2750 : __begin_(0), 2751 __end_(0) 2752 { 2753 resize(__n); 2754 } 2755 2756 template <class _Tp> 2757 inline 2758 valarray<_Tp>::valarray(const value_type& __x, size_t __n) 2759 : __begin_(0), 2760 __end_(0) 2761 { 2762 resize(__n, __x); 2763 } 2764 2765 template <class _Tp> 2766 valarray<_Tp>::valarray(const value_type* __p, size_t __n) 2767 : __begin_(0), 2768 __end_(0) 2769 { 2770 if (__n) 2771 { 2772 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2773 #ifndef _LIBCPP_NO_EXCEPTIONS 2774 try 2775 { 2776 #endif // _LIBCPP_NO_EXCEPTIONS 2777 for (; __n; ++__end_, ++__p, --__n) 2778 ::new (__end_) value_type(*__p); 2779 #ifndef _LIBCPP_NO_EXCEPTIONS 2780 } 2781 catch (...) 2782 { 2783 resize(0); 2784 throw; 2785 } 2786 #endif // _LIBCPP_NO_EXCEPTIONS 2787 } 2788 } 2789 2790 template <class _Tp> 2791 valarray<_Tp>::valarray(const valarray& __v) 2792 : __begin_(0), 2793 __end_(0) 2794 { 2795 if (__v.size()) 2796 { 2797 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__v.size() * sizeof(value_type))); 2798 #ifndef _LIBCPP_NO_EXCEPTIONS 2799 try 2800 { 2801 #endif // _LIBCPP_NO_EXCEPTIONS 2802 for (value_type* __p = __v.__begin_; __p != __v.__end_; ++__end_, ++__p) 2803 ::new (__end_) value_type(*__p); 2804 #ifndef _LIBCPP_NO_EXCEPTIONS 2805 } 2806 catch (...) 2807 { 2808 resize(0); 2809 throw; 2810 } 2811 #endif // _LIBCPP_NO_EXCEPTIONS 2812 } 2813 } 2814 2815 #ifndef _LIBCPP_CXX03_LANG 2816 2817 template <class _Tp> 2818 inline 2819 valarray<_Tp>::valarray(valarray&& __v) _NOEXCEPT 2820 : __begin_(__v.__begin_), 2821 __end_(__v.__end_) 2822 { 2823 __v.__begin_ = __v.__end_ = nullptr; 2824 } 2825 2826 template <class _Tp> 2827 valarray<_Tp>::valarray(initializer_list<value_type> __il) 2828 : __begin_(0), 2829 __end_(0) 2830 { 2831 size_t __n = __il.size(); 2832 if (__n) 2833 { 2834 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2835 #ifndef _LIBCPP_NO_EXCEPTIONS 2836 try 2837 { 2838 #endif // _LIBCPP_NO_EXCEPTIONS 2839 for (const value_type* __p = __il.begin(); __n; ++__end_, ++__p, --__n) 2840 ::new (__end_) value_type(*__p); 2841 #ifndef _LIBCPP_NO_EXCEPTIONS 2842 } 2843 catch (...) 2844 { 2845 resize(0); 2846 throw; 2847 } 2848 #endif // _LIBCPP_NO_EXCEPTIONS 2849 } 2850 } 2851 2852 #endif // _LIBCPP_CXX03_LANG 2853 2854 template <class _Tp> 2855 valarray<_Tp>::valarray(const slice_array<value_type>& __sa) 2856 : __begin_(0), 2857 __end_(0) 2858 { 2859 size_t __n = __sa.__size_; 2860 if (__n) 2861 { 2862 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2863 #ifndef _LIBCPP_NO_EXCEPTIONS 2864 try 2865 { 2866 #endif // _LIBCPP_NO_EXCEPTIONS 2867 for (const value_type* __p = __sa.__vp_; __n; ++__end_, __p += __sa.__stride_, --__n) 2868 ::new (__end_) value_type(*__p); 2869 #ifndef _LIBCPP_NO_EXCEPTIONS 2870 } 2871 catch (...) 2872 { 2873 resize(0); 2874 throw; 2875 } 2876 #endif // _LIBCPP_NO_EXCEPTIONS 2877 } 2878 } 2879 2880 template <class _Tp> 2881 valarray<_Tp>::valarray(const gslice_array<value_type>& __ga) 2882 : __begin_(0), 2883 __end_(0) 2884 { 2885 size_t __n = __ga.__1d_.size(); 2886 if (__n) 2887 { 2888 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2889 #ifndef _LIBCPP_NO_EXCEPTIONS 2890 try 2891 { 2892 #endif // _LIBCPP_NO_EXCEPTIONS 2893 typedef const size_t* _Ip; 2894 const value_type* __s = __ga.__vp_; 2895 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; 2896 __i != __e; ++__i, ++__end_) 2897 ::new (__end_) value_type(__s[*__i]); 2898 #ifndef _LIBCPP_NO_EXCEPTIONS 2899 } 2900 catch (...) 2901 { 2902 resize(0); 2903 throw; 2904 } 2905 #endif // _LIBCPP_NO_EXCEPTIONS 2906 } 2907 } 2908 2909 template <class _Tp> 2910 valarray<_Tp>::valarray(const mask_array<value_type>& __ma) 2911 : __begin_(0), 2912 __end_(0) 2913 { 2914 size_t __n = __ma.__1d_.size(); 2915 if (__n) 2916 { 2917 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2918 #ifndef _LIBCPP_NO_EXCEPTIONS 2919 try 2920 { 2921 #endif // _LIBCPP_NO_EXCEPTIONS 2922 typedef const size_t* _Ip; 2923 const value_type* __s = __ma.__vp_; 2924 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; 2925 __i != __e; ++__i, ++__end_) 2926 ::new (__end_) value_type(__s[*__i]); 2927 #ifndef _LIBCPP_NO_EXCEPTIONS 2928 } 2929 catch (...) 2930 { 2931 resize(0); 2932 throw; 2933 } 2934 #endif // _LIBCPP_NO_EXCEPTIONS 2935 } 2936 } 2937 2938 template <class _Tp> 2939 valarray<_Tp>::valarray(const indirect_array<value_type>& __ia) 2940 : __begin_(0), 2941 __end_(0) 2942 { 2943 size_t __n = __ia.__1d_.size(); 2944 if (__n) 2945 { 2946 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 2947 #ifndef _LIBCPP_NO_EXCEPTIONS 2948 try 2949 { 2950 #endif // _LIBCPP_NO_EXCEPTIONS 2951 typedef const size_t* _Ip; 2952 const value_type* __s = __ia.__vp_; 2953 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; 2954 __i != __e; ++__i, ++__end_) 2955 ::new (__end_) value_type(__s[*__i]); 2956 #ifndef _LIBCPP_NO_EXCEPTIONS 2957 } 2958 catch (...) 2959 { 2960 resize(0); 2961 throw; 2962 } 2963 #endif // _LIBCPP_NO_EXCEPTIONS 2964 } 2965 } 2966 2967 template <class _Tp> 2968 inline 2969 valarray<_Tp>::~valarray() 2970 { 2971 resize(0); 2972 } 2973 2974 template <class _Tp> 2975 valarray<_Tp>& 2976 valarray<_Tp>::operator=(const valarray& __v) 2977 { 2978 if (this != &__v) 2979 { 2980 if (size() != __v.size()) 2981 resize(__v.size()); 2982 _VSTD::copy(__v.__begin_, __v.__end_, __begin_); 2983 } 2984 return *this; 2985 } 2986 2987 #ifndef _LIBCPP_CXX03_LANG 2988 2989 template <class _Tp> 2990 inline 2991 valarray<_Tp>& 2992 valarray<_Tp>::operator=(valarray&& __v) _NOEXCEPT 2993 { 2994 resize(0); 2995 __begin_ = __v.__begin_; 2996 __end_ = __v.__end_; 2997 __v.__begin_ = nullptr; 2998 __v.__end_ = nullptr; 2999 return *this; 3000 } 3001 3002 template <class _Tp> 3003 inline 3004 valarray<_Tp>& 3005 valarray<_Tp>::operator=(initializer_list<value_type> __il) 3006 { 3007 if (size() != __il.size()) 3008 resize(__il.size()); 3009 _VSTD::copy(__il.begin(), __il.end(), __begin_); 3010 return *this; 3011 } 3012 3013 #endif // _LIBCPP_CXX03_LANG 3014 3015 template <class _Tp> 3016 inline 3017 valarray<_Tp>& 3018 valarray<_Tp>::operator=(const value_type& __x) 3019 { 3020 _VSTD::fill(__begin_, __end_, __x); 3021 return *this; 3022 } 3023 3024 template <class _Tp> 3025 inline 3026 valarray<_Tp>& 3027 valarray<_Tp>::operator=(const slice_array<value_type>& __sa) 3028 { 3029 value_type* __t = __begin_; 3030 const value_type* __s = __sa.__vp_; 3031 for (size_t __n = __sa.__size_; __n; --__n, __s += __sa.__stride_, ++__t) 3032 *__t = *__s; 3033 return *this; 3034 } 3035 3036 template <class _Tp> 3037 inline 3038 valarray<_Tp>& 3039 valarray<_Tp>::operator=(const gslice_array<value_type>& __ga) 3040 { 3041 typedef const size_t* _Ip; 3042 value_type* __t = __begin_; 3043 const value_type* __s = __ga.__vp_; 3044 for (_Ip __i = __ga.__1d_.__begin_, __e = __ga.__1d_.__end_; 3045 __i != __e; ++__i, ++__t) 3046 *__t = __s[*__i]; 3047 return *this; 3048 } 3049 3050 template <class _Tp> 3051 inline 3052 valarray<_Tp>& 3053 valarray<_Tp>::operator=(const mask_array<value_type>& __ma) 3054 { 3055 typedef const size_t* _Ip; 3056 value_type* __t = __begin_; 3057 const value_type* __s = __ma.__vp_; 3058 for (_Ip __i = __ma.__1d_.__begin_, __e = __ma.__1d_.__end_; 3059 __i != __e; ++__i, ++__t) 3060 *__t = __s[*__i]; 3061 return *this; 3062 } 3063 3064 template <class _Tp> 3065 inline 3066 valarray<_Tp>& 3067 valarray<_Tp>::operator=(const indirect_array<value_type>& __ia) 3068 { 3069 typedef const size_t* _Ip; 3070 value_type* __t = __begin_; 3071 const value_type* __s = __ia.__vp_; 3072 for (_Ip __i = __ia.__1d_.__begin_, __e = __ia.__1d_.__end_; 3073 __i != __e; ++__i, ++__t) 3074 *__t = __s[*__i]; 3075 return *this; 3076 } 3077 3078 template <class _Tp> 3079 template <class _ValExpr> 3080 inline 3081 valarray<_Tp>& 3082 valarray<_Tp>::operator=(const __val_expr<_ValExpr>& __v) 3083 { 3084 size_t __n = __v.size(); 3085 if (size() != __n) 3086 resize(__n); 3087 value_type* __t = __begin_; 3088 for (size_t __i = 0; __i != __n; ++__t, ++__i) 3089 *__t = result_type(__v[__i]); 3090 return *this; 3091 } 3092 3093 template <class _Tp> 3094 inline 3095 __val_expr<__slice_expr<const valarray<_Tp>&> > 3096 valarray<_Tp>::operator[](slice __s) const 3097 { 3098 return __val_expr<__slice_expr<const valarray&> >(__slice_expr<const valarray&>(__s, *this)); 3099 } 3100 3101 template <class _Tp> 3102 inline 3103 slice_array<_Tp> 3104 valarray<_Tp>::operator[](slice __s) 3105 { 3106 return slice_array<value_type>(__s, *this); 3107 } 3108 3109 template <class _Tp> 3110 inline 3111 __val_expr<__indirect_expr<const valarray<_Tp>&> > 3112 valarray<_Tp>::operator[](const gslice& __gs) const 3113 { 3114 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__gs.__1d_, *this)); 3115 } 3116 3117 template <class _Tp> 3118 inline 3119 gslice_array<_Tp> 3120 valarray<_Tp>::operator[](const gslice& __gs) 3121 { 3122 return gslice_array<value_type>(__gs, *this); 3123 } 3124 3125 #ifndef _LIBCPP_CXX03_LANG 3126 3127 template <class _Tp> 3128 inline 3129 __val_expr<__indirect_expr<const valarray<_Tp>&> > 3130 valarray<_Tp>::operator[](gslice&& __gs) const 3131 { 3132 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__gs.__1d_), *this)); 3133 } 3134 3135 template <class _Tp> 3136 inline 3137 gslice_array<_Tp> 3138 valarray<_Tp>::operator[](gslice&& __gs) 3139 { 3140 return gslice_array<value_type>(move(__gs), *this); 3141 } 3142 3143 #endif // _LIBCPP_CXX03_LANG 3144 3145 template <class _Tp> 3146 inline 3147 __val_expr<__mask_expr<const valarray<_Tp>&> > 3148 valarray<_Tp>::operator[](const valarray<bool>& __vb) const 3149 { 3150 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(__vb, *this)); 3151 } 3152 3153 template <class _Tp> 3154 inline 3155 mask_array<_Tp> 3156 valarray<_Tp>::operator[](const valarray<bool>& __vb) 3157 { 3158 return mask_array<value_type>(__vb, *this); 3159 } 3160 3161 #ifndef _LIBCPP_CXX03_LANG 3162 3163 template <class _Tp> 3164 inline 3165 __val_expr<__mask_expr<const valarray<_Tp>&> > 3166 valarray<_Tp>::operator[](valarray<bool>&& __vb) const 3167 { 3168 return __val_expr<__mask_expr<const valarray&> >(__mask_expr<const valarray&>(move(__vb), *this)); 3169 } 3170 3171 template <class _Tp> 3172 inline 3173 mask_array<_Tp> 3174 valarray<_Tp>::operator[](valarray<bool>&& __vb) 3175 { 3176 return mask_array<value_type>(move(__vb), *this); 3177 } 3178 3179 #endif // _LIBCPP_CXX03_LANG 3180 3181 template <class _Tp> 3182 inline 3183 __val_expr<__indirect_expr<const valarray<_Tp>&> > 3184 valarray<_Tp>::operator[](const valarray<size_t>& __vs) const 3185 { 3186 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(__vs, *this)); 3187 } 3188 3189 template <class _Tp> 3190 inline 3191 indirect_array<_Tp> 3192 valarray<_Tp>::operator[](const valarray<size_t>& __vs) 3193 { 3194 return indirect_array<value_type>(__vs, *this); 3195 } 3196 3197 #ifndef _LIBCPP_CXX03_LANG 3198 3199 template <class _Tp> 3200 inline 3201 __val_expr<__indirect_expr<const valarray<_Tp>&> > 3202 valarray<_Tp>::operator[](valarray<size_t>&& __vs) const 3203 { 3204 return __val_expr<__indirect_expr<const valarray&> >(__indirect_expr<const valarray&>(move(__vs), *this)); 3205 } 3206 3207 template <class _Tp> 3208 inline 3209 indirect_array<_Tp> 3210 valarray<_Tp>::operator[](valarray<size_t>&& __vs) 3211 { 3212 return indirect_array<value_type>(move(__vs), *this); 3213 } 3214 3215 #endif // _LIBCPP_CXX03_LANG 3216 3217 template <class _Tp> 3218 valarray<_Tp> 3219 valarray<_Tp>::operator+() const 3220 { 3221 valarray<value_type> __r; 3222 size_t __n = size(); 3223 if (__n) 3224 { 3225 __r.__begin_ = 3226 __r.__end_ = 3227 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3228 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3229 ::new (__r.__end_) value_type(+*__p); 3230 } 3231 return __r; 3232 } 3233 3234 template <class _Tp> 3235 valarray<_Tp> 3236 valarray<_Tp>::operator-() const 3237 { 3238 valarray<value_type> __r; 3239 size_t __n = size(); 3240 if (__n) 3241 { 3242 __r.__begin_ = 3243 __r.__end_ = 3244 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3245 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3246 ::new (__r.__end_) value_type(-*__p); 3247 } 3248 return __r; 3249 } 3250 3251 template <class _Tp> 3252 valarray<_Tp> 3253 valarray<_Tp>::operator~() const 3254 { 3255 valarray<value_type> __r; 3256 size_t __n = size(); 3257 if (__n) 3258 { 3259 __r.__begin_ = 3260 __r.__end_ = 3261 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3262 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3263 ::new (__r.__end_) value_type(~*__p); 3264 } 3265 return __r; 3266 } 3267 3268 template <class _Tp> 3269 valarray<bool> 3270 valarray<_Tp>::operator!() const 3271 { 3272 valarray<bool> __r; 3273 size_t __n = size(); 3274 if (__n) 3275 { 3276 __r.__begin_ = 3277 __r.__end_ = 3278 static_cast<bool*>(_VSTD::__allocate(__n * sizeof(bool))); 3279 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3280 ::new (__r.__end_) bool(!*__p); 3281 } 3282 return __r; 3283 } 3284 3285 template <class _Tp> 3286 inline 3287 valarray<_Tp>& 3288 valarray<_Tp>::operator*=(const value_type& __x) 3289 { 3290 for (value_type* __p = __begin_; __p != __end_; ++__p) 3291 *__p *= __x; 3292 return *this; 3293 } 3294 3295 template <class _Tp> 3296 inline 3297 valarray<_Tp>& 3298 valarray<_Tp>::operator/=(const value_type& __x) 3299 { 3300 for (value_type* __p = __begin_; __p != __end_; ++__p) 3301 *__p /= __x; 3302 return *this; 3303 } 3304 3305 template <class _Tp> 3306 inline 3307 valarray<_Tp>& 3308 valarray<_Tp>::operator%=(const value_type& __x) 3309 { 3310 for (value_type* __p = __begin_; __p != __end_; ++__p) 3311 *__p %= __x; 3312 return *this; 3313 } 3314 3315 template <class _Tp> 3316 inline 3317 valarray<_Tp>& 3318 valarray<_Tp>::operator+=(const value_type& __x) 3319 { 3320 for (value_type* __p = __begin_; __p != __end_; ++__p) 3321 *__p += __x; 3322 return *this; 3323 } 3324 3325 template <class _Tp> 3326 inline 3327 valarray<_Tp>& 3328 valarray<_Tp>::operator-=(const value_type& __x) 3329 { 3330 for (value_type* __p = __begin_; __p != __end_; ++__p) 3331 *__p -= __x; 3332 return *this; 3333 } 3334 3335 template <class _Tp> 3336 inline 3337 valarray<_Tp>& 3338 valarray<_Tp>::operator^=(const value_type& __x) 3339 { 3340 for (value_type* __p = __begin_; __p != __end_; ++__p) 3341 *__p ^= __x; 3342 return *this; 3343 } 3344 3345 template <class _Tp> 3346 inline 3347 valarray<_Tp>& 3348 valarray<_Tp>::operator&=(const value_type& __x) 3349 { 3350 for (value_type* __p = __begin_; __p != __end_; ++__p) 3351 *__p &= __x; 3352 return *this; 3353 } 3354 3355 template <class _Tp> 3356 inline 3357 valarray<_Tp>& 3358 valarray<_Tp>::operator|=(const value_type& __x) 3359 { 3360 for (value_type* __p = __begin_; __p != __end_; ++__p) 3361 *__p |= __x; 3362 return *this; 3363 } 3364 3365 template <class _Tp> 3366 inline 3367 valarray<_Tp>& 3368 valarray<_Tp>::operator<<=(const value_type& __x) 3369 { 3370 for (value_type* __p = __begin_; __p != __end_; ++__p) 3371 *__p <<= __x; 3372 return *this; 3373 } 3374 3375 template <class _Tp> 3376 inline 3377 valarray<_Tp>& 3378 valarray<_Tp>::operator>>=(const value_type& __x) 3379 { 3380 for (value_type* __p = __begin_; __p != __end_; ++__p) 3381 *__p >>= __x; 3382 return *this; 3383 } 3384 3385 template <class _Tp> 3386 template <class _Expr> 3387 inline 3388 typename enable_if 3389 < 3390 __is_val_expr<_Expr>::value, 3391 valarray<_Tp>& 3392 >::type 3393 valarray<_Tp>::operator*=(const _Expr& __v) 3394 { 3395 size_t __i = 0; 3396 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3397 *__t *= __v[__i]; 3398 return *this; 3399 } 3400 3401 template <class _Tp> 3402 template <class _Expr> 3403 inline 3404 typename enable_if 3405 < 3406 __is_val_expr<_Expr>::value, 3407 valarray<_Tp>& 3408 >::type 3409 valarray<_Tp>::operator/=(const _Expr& __v) 3410 { 3411 size_t __i = 0; 3412 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3413 *__t /= __v[__i]; 3414 return *this; 3415 } 3416 3417 template <class _Tp> 3418 template <class _Expr> 3419 inline 3420 typename enable_if 3421 < 3422 __is_val_expr<_Expr>::value, 3423 valarray<_Tp>& 3424 >::type 3425 valarray<_Tp>::operator%=(const _Expr& __v) 3426 { 3427 size_t __i = 0; 3428 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3429 *__t %= __v[__i]; 3430 return *this; 3431 } 3432 3433 template <class _Tp> 3434 template <class _Expr> 3435 inline 3436 typename enable_if 3437 < 3438 __is_val_expr<_Expr>::value, 3439 valarray<_Tp>& 3440 >::type 3441 valarray<_Tp>::operator+=(const _Expr& __v) 3442 { 3443 size_t __i = 0; 3444 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3445 *__t += __v[__i]; 3446 return *this; 3447 } 3448 3449 template <class _Tp> 3450 template <class _Expr> 3451 inline 3452 typename enable_if 3453 < 3454 __is_val_expr<_Expr>::value, 3455 valarray<_Tp>& 3456 >::type 3457 valarray<_Tp>::operator-=(const _Expr& __v) 3458 { 3459 size_t __i = 0; 3460 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3461 *__t -= __v[__i]; 3462 return *this; 3463 } 3464 3465 template <class _Tp> 3466 template <class _Expr> 3467 inline 3468 typename enable_if 3469 < 3470 __is_val_expr<_Expr>::value, 3471 valarray<_Tp>& 3472 >::type 3473 valarray<_Tp>::operator^=(const _Expr& __v) 3474 { 3475 size_t __i = 0; 3476 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3477 *__t ^= __v[__i]; 3478 return *this; 3479 } 3480 3481 template <class _Tp> 3482 template <class _Expr> 3483 inline 3484 typename enable_if 3485 < 3486 __is_val_expr<_Expr>::value, 3487 valarray<_Tp>& 3488 >::type 3489 valarray<_Tp>::operator|=(const _Expr& __v) 3490 { 3491 size_t __i = 0; 3492 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3493 *__t |= __v[__i]; 3494 return *this; 3495 } 3496 3497 template <class _Tp> 3498 template <class _Expr> 3499 inline 3500 typename enable_if 3501 < 3502 __is_val_expr<_Expr>::value, 3503 valarray<_Tp>& 3504 >::type 3505 valarray<_Tp>::operator&=(const _Expr& __v) 3506 { 3507 size_t __i = 0; 3508 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3509 *__t &= __v[__i]; 3510 return *this; 3511 } 3512 3513 template <class _Tp> 3514 template <class _Expr> 3515 inline 3516 typename enable_if 3517 < 3518 __is_val_expr<_Expr>::value, 3519 valarray<_Tp>& 3520 >::type 3521 valarray<_Tp>::operator<<=(const _Expr& __v) 3522 { 3523 size_t __i = 0; 3524 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3525 *__t <<= __v[__i]; 3526 return *this; 3527 } 3528 3529 template <class _Tp> 3530 template <class _Expr> 3531 inline 3532 typename enable_if 3533 < 3534 __is_val_expr<_Expr>::value, 3535 valarray<_Tp>& 3536 >::type 3537 valarray<_Tp>::operator>>=(const _Expr& __v) 3538 { 3539 size_t __i = 0; 3540 for (value_type* __t = __begin_; __t != __end_ ; ++__t, ++__i) 3541 *__t >>= __v[__i]; 3542 return *this; 3543 } 3544 3545 template <class _Tp> 3546 inline 3547 void 3548 valarray<_Tp>::swap(valarray& __v) _NOEXCEPT 3549 { 3550 _VSTD::swap(__begin_, __v.__begin_); 3551 _VSTD::swap(__end_, __v.__end_); 3552 } 3553 3554 template <class _Tp> 3555 inline 3556 _Tp 3557 valarray<_Tp>::sum() const 3558 { 3559 if (__begin_ == __end_) 3560 return value_type(); 3561 const value_type* __p = __begin_; 3562 _Tp __r = *__p; 3563 for (++__p; __p != __end_; ++__p) 3564 __r += *__p; 3565 return __r; 3566 } 3567 3568 template <class _Tp> 3569 inline 3570 _Tp 3571 valarray<_Tp>::min() const 3572 { 3573 if (__begin_ == __end_) 3574 return value_type(); 3575 return *_VSTD::min_element(__begin_, __end_); 3576 } 3577 3578 template <class _Tp> 3579 inline 3580 _Tp 3581 valarray<_Tp>::max() const 3582 { 3583 if (__begin_ == __end_) 3584 return value_type(); 3585 return *_VSTD::max_element(__begin_, __end_); 3586 } 3587 3588 template <class _Tp> 3589 valarray<_Tp> 3590 valarray<_Tp>::shift(int __i) const 3591 { 3592 valarray<value_type> __r; 3593 size_t __n = size(); 3594 if (__n) 3595 { 3596 __r.__begin_ = 3597 __r.__end_ = 3598 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3599 const value_type* __sb; 3600 value_type* __tb; 3601 value_type* __te; 3602 if (__i >= 0) 3603 { 3604 __i = _VSTD::min(__i, static_cast<int>(__n)); 3605 __sb = __begin_ + __i; 3606 __tb = __r.__begin_; 3607 __te = __r.__begin_ + (__n - __i); 3608 } 3609 else 3610 { 3611 __i = _VSTD::min(-__i, static_cast<int>(__n)); 3612 __sb = __begin_; 3613 __tb = __r.__begin_ + __i; 3614 __te = __r.__begin_ + __n; 3615 } 3616 for (; __r.__end_ != __tb; ++__r.__end_) 3617 ::new (__r.__end_) value_type(); 3618 for (; __r.__end_ != __te; ++__r.__end_, ++__sb) 3619 ::new (__r.__end_) value_type(*__sb); 3620 for (__te = __r.__begin_ + __n; __r.__end_ != __te; ++__r.__end_) 3621 ::new (__r.__end_) value_type(); 3622 } 3623 return __r; 3624 } 3625 3626 template <class _Tp> 3627 valarray<_Tp> 3628 valarray<_Tp>::cshift(int __i) const 3629 { 3630 valarray<value_type> __r; 3631 size_t __n = size(); 3632 if (__n) 3633 { 3634 __r.__begin_ = 3635 __r.__end_ = 3636 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3637 __i %= static_cast<int>(__n); 3638 const value_type* __m = __i >= 0 ? __begin_ + __i : __end_ + __i; 3639 for (const value_type* __s = __m; __s != __end_; ++__r.__end_, ++__s) 3640 ::new (__r.__end_) value_type(*__s); 3641 for (const value_type* __s = __begin_; __s != __m; ++__r.__end_, ++__s) 3642 ::new (__r.__end_) value_type(*__s); 3643 } 3644 return __r; 3645 } 3646 3647 template <class _Tp> 3648 valarray<_Tp> 3649 valarray<_Tp>::apply(value_type __f(value_type)) const 3650 { 3651 valarray<value_type> __r; 3652 size_t __n = size(); 3653 if (__n) 3654 { 3655 __r.__begin_ = 3656 __r.__end_ = 3657 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3658 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3659 ::new (__r.__end_) value_type(__f(*__p)); 3660 } 3661 return __r; 3662 } 3663 3664 template <class _Tp> 3665 valarray<_Tp> 3666 valarray<_Tp>::apply(value_type __f(const value_type&)) const 3667 { 3668 valarray<value_type> __r; 3669 size_t __n = size(); 3670 if (__n) 3671 { 3672 __r.__begin_ = 3673 __r.__end_ = 3674 static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3675 for (const value_type* __p = __begin_; __n; ++__r.__end_, ++__p, --__n) 3676 ::new (__r.__end_) value_type(__f(*__p)); 3677 } 3678 return __r; 3679 } 3680 3681 template <class _Tp> 3682 void 3683 valarray<_Tp>::resize(size_t __n, value_type __x) 3684 { 3685 if (__begin_ != nullptr) 3686 { 3687 while (__end_ != __begin_) 3688 (--__end_)->~value_type(); 3689 _VSTD::__libcpp_deallocate(__begin_); 3690 __begin_ = __end_ = nullptr; 3691 } 3692 if (__n) 3693 { 3694 __begin_ = __end_ = static_cast<value_type*>(_VSTD::__allocate(__n * sizeof(value_type))); 3695 #ifndef _LIBCPP_NO_EXCEPTIONS 3696 try 3697 { 3698 #endif // _LIBCPP_NO_EXCEPTIONS 3699 for (; __n; --__n, ++__end_) 3700 ::new (__end_) value_type(__x); 3701 #ifndef _LIBCPP_NO_EXCEPTIONS 3702 } 3703 catch (...) 3704 { 3705 resize(0); 3706 throw; 3707 } 3708 #endif // _LIBCPP_NO_EXCEPTIONS 3709 } 3710 } 3711 3712 template<class _Tp> 3713 inline _LIBCPP_INLINE_VISIBILITY 3714 void 3715 swap(valarray<_Tp>& __x, valarray<_Tp>& __y) _NOEXCEPT 3716 { 3717 __x.swap(__y); 3718 } 3719 3720 template<class _Expr1, class _Expr2> 3721 inline _LIBCPP_INLINE_VISIBILITY 3722 typename enable_if 3723 < 3724 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3725 __val_expr<_BinaryOp<multiplies<typename _Expr1::value_type>, _Expr1, _Expr2> > 3726 >::type 3727 operator*(const _Expr1& __x, const _Expr2& __y) 3728 { 3729 typedef typename _Expr1::value_type value_type; 3730 typedef _BinaryOp<multiplies<value_type>, _Expr1, _Expr2> _Op; 3731 return __val_expr<_Op>(_Op(multiplies<value_type>(), __x, __y)); 3732 } 3733 3734 template<class _Expr> 3735 inline _LIBCPP_INLINE_VISIBILITY 3736 typename enable_if 3737 < 3738 __is_val_expr<_Expr>::value, 3739 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, 3740 _Expr, __scalar_expr<typename _Expr::value_type> > > 3741 >::type 3742 operator*(const _Expr& __x, const typename _Expr::value_type& __y) 3743 { 3744 typedef typename _Expr::value_type value_type; 3745 typedef _BinaryOp<multiplies<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3746 return __val_expr<_Op>(_Op(multiplies<value_type>(), 3747 __x, __scalar_expr<value_type>(__y, __x.size()))); 3748 } 3749 3750 template<class _Expr> 3751 inline _LIBCPP_INLINE_VISIBILITY 3752 typename enable_if 3753 < 3754 __is_val_expr<_Expr>::value, 3755 __val_expr<_BinaryOp<multiplies<typename _Expr::value_type>, 3756 __scalar_expr<typename _Expr::value_type>, _Expr> > 3757 >::type 3758 operator*(const typename _Expr::value_type& __x, const _Expr& __y) 3759 { 3760 typedef typename _Expr::value_type value_type; 3761 typedef _BinaryOp<multiplies<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3762 return __val_expr<_Op>(_Op(multiplies<value_type>(), 3763 __scalar_expr<value_type>(__x, __y.size()), __y)); 3764 } 3765 3766 template<class _Expr1, class _Expr2> 3767 inline _LIBCPP_INLINE_VISIBILITY 3768 typename enable_if 3769 < 3770 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3771 __val_expr<_BinaryOp<divides<typename _Expr1::value_type>, _Expr1, _Expr2> > 3772 >::type 3773 operator/(const _Expr1& __x, const _Expr2& __y) 3774 { 3775 typedef typename _Expr1::value_type value_type; 3776 typedef _BinaryOp<divides<value_type>, _Expr1, _Expr2> _Op; 3777 return __val_expr<_Op>(_Op(divides<value_type>(), __x, __y)); 3778 } 3779 3780 template<class _Expr> 3781 inline _LIBCPP_INLINE_VISIBILITY 3782 typename enable_if 3783 < 3784 __is_val_expr<_Expr>::value, 3785 __val_expr<_BinaryOp<divides<typename _Expr::value_type>, 3786 _Expr, __scalar_expr<typename _Expr::value_type> > > 3787 >::type 3788 operator/(const _Expr& __x, const typename _Expr::value_type& __y) 3789 { 3790 typedef typename _Expr::value_type value_type; 3791 typedef _BinaryOp<divides<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3792 return __val_expr<_Op>(_Op(divides<value_type>(), 3793 __x, __scalar_expr<value_type>(__y, __x.size()))); 3794 } 3795 3796 template<class _Expr> 3797 inline _LIBCPP_INLINE_VISIBILITY 3798 typename enable_if 3799 < 3800 __is_val_expr<_Expr>::value, 3801 __val_expr<_BinaryOp<divides<typename _Expr::value_type>, 3802 __scalar_expr<typename _Expr::value_type>, _Expr> > 3803 >::type 3804 operator/(const typename _Expr::value_type& __x, const _Expr& __y) 3805 { 3806 typedef typename _Expr::value_type value_type; 3807 typedef _BinaryOp<divides<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3808 return __val_expr<_Op>(_Op(divides<value_type>(), 3809 __scalar_expr<value_type>(__x, __y.size()), __y)); 3810 } 3811 3812 template<class _Expr1, class _Expr2> 3813 inline _LIBCPP_INLINE_VISIBILITY 3814 typename enable_if 3815 < 3816 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3817 __val_expr<_BinaryOp<modulus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3818 >::type 3819 operator%(const _Expr1& __x, const _Expr2& __y) 3820 { 3821 typedef typename _Expr1::value_type value_type; 3822 typedef _BinaryOp<modulus<value_type>, _Expr1, _Expr2> _Op; 3823 return __val_expr<_Op>(_Op(modulus<value_type>(), __x, __y)); 3824 } 3825 3826 template<class _Expr> 3827 inline _LIBCPP_INLINE_VISIBILITY 3828 typename enable_if 3829 < 3830 __is_val_expr<_Expr>::value, 3831 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, 3832 _Expr, __scalar_expr<typename _Expr::value_type> > > 3833 >::type 3834 operator%(const _Expr& __x, const typename _Expr::value_type& __y) 3835 { 3836 typedef typename _Expr::value_type value_type; 3837 typedef _BinaryOp<modulus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3838 return __val_expr<_Op>(_Op(modulus<value_type>(), 3839 __x, __scalar_expr<value_type>(__y, __x.size()))); 3840 } 3841 3842 template<class _Expr> 3843 inline _LIBCPP_INLINE_VISIBILITY 3844 typename enable_if 3845 < 3846 __is_val_expr<_Expr>::value, 3847 __val_expr<_BinaryOp<modulus<typename _Expr::value_type>, 3848 __scalar_expr<typename _Expr::value_type>, _Expr> > 3849 >::type 3850 operator%(const typename _Expr::value_type& __x, const _Expr& __y) 3851 { 3852 typedef typename _Expr::value_type value_type; 3853 typedef _BinaryOp<modulus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3854 return __val_expr<_Op>(_Op(modulus<value_type>(), 3855 __scalar_expr<value_type>(__x, __y.size()), __y)); 3856 } 3857 3858 template<class _Expr1, class _Expr2> 3859 inline _LIBCPP_INLINE_VISIBILITY 3860 typename enable_if 3861 < 3862 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3863 __val_expr<_BinaryOp<plus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3864 >::type 3865 operator+(const _Expr1& __x, const _Expr2& __y) 3866 { 3867 typedef typename _Expr1::value_type value_type; 3868 typedef _BinaryOp<plus<value_type>, _Expr1, _Expr2> _Op; 3869 return __val_expr<_Op>(_Op(plus<value_type>(), __x, __y)); 3870 } 3871 3872 template<class _Expr> 3873 inline _LIBCPP_INLINE_VISIBILITY 3874 typename enable_if 3875 < 3876 __is_val_expr<_Expr>::value, 3877 __val_expr<_BinaryOp<plus<typename _Expr::value_type>, 3878 _Expr, __scalar_expr<typename _Expr::value_type> > > 3879 >::type 3880 operator+(const _Expr& __x, const typename _Expr::value_type& __y) 3881 { 3882 typedef typename _Expr::value_type value_type; 3883 typedef _BinaryOp<plus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3884 return __val_expr<_Op>(_Op(plus<value_type>(), 3885 __x, __scalar_expr<value_type>(__y, __x.size()))); 3886 } 3887 3888 template<class _Expr> 3889 inline _LIBCPP_INLINE_VISIBILITY 3890 typename enable_if 3891 < 3892 __is_val_expr<_Expr>::value, 3893 __val_expr<_BinaryOp<plus<typename _Expr::value_type>, 3894 __scalar_expr<typename _Expr::value_type>, _Expr> > 3895 >::type 3896 operator+(const typename _Expr::value_type& __x, const _Expr& __y) 3897 { 3898 typedef typename _Expr::value_type value_type; 3899 typedef _BinaryOp<plus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3900 return __val_expr<_Op>(_Op(plus<value_type>(), 3901 __scalar_expr<value_type>(__x, __y.size()), __y)); 3902 } 3903 3904 template<class _Expr1, class _Expr2> 3905 inline _LIBCPP_INLINE_VISIBILITY 3906 typename enable_if 3907 < 3908 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3909 __val_expr<_BinaryOp<minus<typename _Expr1::value_type>, _Expr1, _Expr2> > 3910 >::type 3911 operator-(const _Expr1& __x, const _Expr2& __y) 3912 { 3913 typedef typename _Expr1::value_type value_type; 3914 typedef _BinaryOp<minus<value_type>, _Expr1, _Expr2> _Op; 3915 return __val_expr<_Op>(_Op(minus<value_type>(), __x, __y)); 3916 } 3917 3918 template<class _Expr> 3919 inline _LIBCPP_INLINE_VISIBILITY 3920 typename enable_if 3921 < 3922 __is_val_expr<_Expr>::value, 3923 __val_expr<_BinaryOp<minus<typename _Expr::value_type>, 3924 _Expr, __scalar_expr<typename _Expr::value_type> > > 3925 >::type 3926 operator-(const _Expr& __x, const typename _Expr::value_type& __y) 3927 { 3928 typedef typename _Expr::value_type value_type; 3929 typedef _BinaryOp<minus<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3930 return __val_expr<_Op>(_Op(minus<value_type>(), 3931 __x, __scalar_expr<value_type>(__y, __x.size()))); 3932 } 3933 3934 template<class _Expr> 3935 inline _LIBCPP_INLINE_VISIBILITY 3936 typename enable_if 3937 < 3938 __is_val_expr<_Expr>::value, 3939 __val_expr<_BinaryOp<minus<typename _Expr::value_type>, 3940 __scalar_expr<typename _Expr::value_type>, _Expr> > 3941 >::type 3942 operator-(const typename _Expr::value_type& __x, const _Expr& __y) 3943 { 3944 typedef typename _Expr::value_type value_type; 3945 typedef _BinaryOp<minus<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3946 return __val_expr<_Op>(_Op(minus<value_type>(), 3947 __scalar_expr<value_type>(__x, __y.size()), __y)); 3948 } 3949 3950 template<class _Expr1, class _Expr2> 3951 inline _LIBCPP_INLINE_VISIBILITY 3952 typename enable_if 3953 < 3954 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 3955 __val_expr<_BinaryOp<bit_xor<typename _Expr1::value_type>, _Expr1, _Expr2> > 3956 >::type 3957 operator^(const _Expr1& __x, const _Expr2& __y) 3958 { 3959 typedef typename _Expr1::value_type value_type; 3960 typedef _BinaryOp<bit_xor<value_type>, _Expr1, _Expr2> _Op; 3961 return __val_expr<_Op>(_Op(bit_xor<value_type>(), __x, __y)); 3962 } 3963 3964 template<class _Expr> 3965 inline _LIBCPP_INLINE_VISIBILITY 3966 typename enable_if 3967 < 3968 __is_val_expr<_Expr>::value, 3969 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, 3970 _Expr, __scalar_expr<typename _Expr::value_type> > > 3971 >::type 3972 operator^(const _Expr& __x, const typename _Expr::value_type& __y) 3973 { 3974 typedef typename _Expr::value_type value_type; 3975 typedef _BinaryOp<bit_xor<value_type>, _Expr, __scalar_expr<value_type> > _Op; 3976 return __val_expr<_Op>(_Op(bit_xor<value_type>(), 3977 __x, __scalar_expr<value_type>(__y, __x.size()))); 3978 } 3979 3980 template<class _Expr> 3981 inline _LIBCPP_INLINE_VISIBILITY 3982 typename enable_if 3983 < 3984 __is_val_expr<_Expr>::value, 3985 __val_expr<_BinaryOp<bit_xor<typename _Expr::value_type>, 3986 __scalar_expr<typename _Expr::value_type>, _Expr> > 3987 >::type 3988 operator^(const typename _Expr::value_type& __x, const _Expr& __y) 3989 { 3990 typedef typename _Expr::value_type value_type; 3991 typedef _BinaryOp<bit_xor<value_type>, __scalar_expr<value_type>, _Expr> _Op; 3992 return __val_expr<_Op>(_Op(bit_xor<value_type>(), 3993 __scalar_expr<value_type>(__x, __y.size()), __y)); 3994 } 3995 3996 template<class _Expr1, class _Expr2> 3997 inline _LIBCPP_INLINE_VISIBILITY 3998 typename enable_if 3999 < 4000 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4001 __val_expr<_BinaryOp<bit_and<typename _Expr1::value_type>, _Expr1, _Expr2> > 4002 >::type 4003 operator&(const _Expr1& __x, const _Expr2& __y) 4004 { 4005 typedef typename _Expr1::value_type value_type; 4006 typedef _BinaryOp<bit_and<value_type>, _Expr1, _Expr2> _Op; 4007 return __val_expr<_Op>(_Op(bit_and<value_type>(), __x, __y)); 4008 } 4009 4010 template<class _Expr> 4011 inline _LIBCPP_INLINE_VISIBILITY 4012 typename enable_if 4013 < 4014 __is_val_expr<_Expr>::value, 4015 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, 4016 _Expr, __scalar_expr<typename _Expr::value_type> > > 4017 >::type 4018 operator&(const _Expr& __x, const typename _Expr::value_type& __y) 4019 { 4020 typedef typename _Expr::value_type value_type; 4021 typedef _BinaryOp<bit_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4022 return __val_expr<_Op>(_Op(bit_and<value_type>(), 4023 __x, __scalar_expr<value_type>(__y, __x.size()))); 4024 } 4025 4026 template<class _Expr> 4027 inline _LIBCPP_INLINE_VISIBILITY 4028 typename enable_if 4029 < 4030 __is_val_expr<_Expr>::value, 4031 __val_expr<_BinaryOp<bit_and<typename _Expr::value_type>, 4032 __scalar_expr<typename _Expr::value_type>, _Expr> > 4033 >::type 4034 operator&(const typename _Expr::value_type& __x, const _Expr& __y) 4035 { 4036 typedef typename _Expr::value_type value_type; 4037 typedef _BinaryOp<bit_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4038 return __val_expr<_Op>(_Op(bit_and<value_type>(), 4039 __scalar_expr<value_type>(__x, __y.size()), __y)); 4040 } 4041 4042 template<class _Expr1, class _Expr2> 4043 inline _LIBCPP_INLINE_VISIBILITY 4044 typename enable_if 4045 < 4046 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4047 __val_expr<_BinaryOp<bit_or<typename _Expr1::value_type>, _Expr1, _Expr2> > 4048 >::type 4049 operator|(const _Expr1& __x, const _Expr2& __y) 4050 { 4051 typedef typename _Expr1::value_type value_type; 4052 typedef _BinaryOp<bit_or<value_type>, _Expr1, _Expr2> _Op; 4053 return __val_expr<_Op>(_Op(bit_or<value_type>(), __x, __y)); 4054 } 4055 4056 template<class _Expr> 4057 inline _LIBCPP_INLINE_VISIBILITY 4058 typename enable_if 4059 < 4060 __is_val_expr<_Expr>::value, 4061 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, 4062 _Expr, __scalar_expr<typename _Expr::value_type> > > 4063 >::type 4064 operator|(const _Expr& __x, const typename _Expr::value_type& __y) 4065 { 4066 typedef typename _Expr::value_type value_type; 4067 typedef _BinaryOp<bit_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4068 return __val_expr<_Op>(_Op(bit_or<value_type>(), 4069 __x, __scalar_expr<value_type>(__y, __x.size()))); 4070 } 4071 4072 template<class _Expr> 4073 inline _LIBCPP_INLINE_VISIBILITY 4074 typename enable_if 4075 < 4076 __is_val_expr<_Expr>::value, 4077 __val_expr<_BinaryOp<bit_or<typename _Expr::value_type>, 4078 __scalar_expr<typename _Expr::value_type>, _Expr> > 4079 >::type 4080 operator|(const typename _Expr::value_type& __x, const _Expr& __y) 4081 { 4082 typedef typename _Expr::value_type value_type; 4083 typedef _BinaryOp<bit_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4084 return __val_expr<_Op>(_Op(bit_or<value_type>(), 4085 __scalar_expr<value_type>(__x, __y.size()), __y)); 4086 } 4087 4088 template<class _Expr1, class _Expr2> 4089 inline _LIBCPP_INLINE_VISIBILITY 4090 typename enable_if 4091 < 4092 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4093 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr1::value_type>, _Expr1, _Expr2> > 4094 >::type 4095 operator<<(const _Expr1& __x, const _Expr2& __y) 4096 { 4097 typedef typename _Expr1::value_type value_type; 4098 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr1, _Expr2> _Op; 4099 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), __x, __y)); 4100 } 4101 4102 template<class _Expr> 4103 inline _LIBCPP_INLINE_VISIBILITY 4104 typename enable_if 4105 < 4106 __is_val_expr<_Expr>::value, 4107 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, 4108 _Expr, __scalar_expr<typename _Expr::value_type> > > 4109 >::type 4110 operator<<(const _Expr& __x, const typename _Expr::value_type& __y) 4111 { 4112 typedef typename _Expr::value_type value_type; 4113 typedef _BinaryOp<__bit_shift_left<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4114 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), 4115 __x, __scalar_expr<value_type>(__y, __x.size()))); 4116 } 4117 4118 template<class _Expr> 4119 inline _LIBCPP_INLINE_VISIBILITY 4120 typename enable_if 4121 < 4122 __is_val_expr<_Expr>::value, 4123 __val_expr<_BinaryOp<__bit_shift_left<typename _Expr::value_type>, 4124 __scalar_expr<typename _Expr::value_type>, _Expr> > 4125 >::type 4126 operator<<(const typename _Expr::value_type& __x, const _Expr& __y) 4127 { 4128 typedef typename _Expr::value_type value_type; 4129 typedef _BinaryOp<__bit_shift_left<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4130 return __val_expr<_Op>(_Op(__bit_shift_left<value_type>(), 4131 __scalar_expr<value_type>(__x, __y.size()), __y)); 4132 } 4133 4134 template<class _Expr1, class _Expr2> 4135 inline _LIBCPP_INLINE_VISIBILITY 4136 typename enable_if 4137 < 4138 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4139 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr1::value_type>, _Expr1, _Expr2> > 4140 >::type 4141 operator>>(const _Expr1& __x, const _Expr2& __y) 4142 { 4143 typedef typename _Expr1::value_type value_type; 4144 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr1, _Expr2> _Op; 4145 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), __x, __y)); 4146 } 4147 4148 template<class _Expr> 4149 inline _LIBCPP_INLINE_VISIBILITY 4150 typename enable_if 4151 < 4152 __is_val_expr<_Expr>::value, 4153 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, 4154 _Expr, __scalar_expr<typename _Expr::value_type> > > 4155 >::type 4156 operator>>(const _Expr& __x, const typename _Expr::value_type& __y) 4157 { 4158 typedef typename _Expr::value_type value_type; 4159 typedef _BinaryOp<__bit_shift_right<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4160 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), 4161 __x, __scalar_expr<value_type>(__y, __x.size()))); 4162 } 4163 4164 template<class _Expr> 4165 inline _LIBCPP_INLINE_VISIBILITY 4166 typename enable_if 4167 < 4168 __is_val_expr<_Expr>::value, 4169 __val_expr<_BinaryOp<__bit_shift_right<typename _Expr::value_type>, 4170 __scalar_expr<typename _Expr::value_type>, _Expr> > 4171 >::type 4172 operator>>(const typename _Expr::value_type& __x, const _Expr& __y) 4173 { 4174 typedef typename _Expr::value_type value_type; 4175 typedef _BinaryOp<__bit_shift_right<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4176 return __val_expr<_Op>(_Op(__bit_shift_right<value_type>(), 4177 __scalar_expr<value_type>(__x, __y.size()), __y)); 4178 } 4179 4180 template<class _Expr1, class _Expr2> 4181 inline _LIBCPP_INLINE_VISIBILITY 4182 typename enable_if 4183 < 4184 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4185 __val_expr<_BinaryOp<logical_and<typename _Expr1::value_type>, _Expr1, _Expr2> > 4186 >::type 4187 operator&&(const _Expr1& __x, const _Expr2& __y) 4188 { 4189 typedef typename _Expr1::value_type value_type; 4190 typedef _BinaryOp<logical_and<value_type>, _Expr1, _Expr2> _Op; 4191 return __val_expr<_Op>(_Op(logical_and<value_type>(), __x, __y)); 4192 } 4193 4194 template<class _Expr> 4195 inline _LIBCPP_INLINE_VISIBILITY 4196 typename enable_if 4197 < 4198 __is_val_expr<_Expr>::value, 4199 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, 4200 _Expr, __scalar_expr<typename _Expr::value_type> > > 4201 >::type 4202 operator&&(const _Expr& __x, const typename _Expr::value_type& __y) 4203 { 4204 typedef typename _Expr::value_type value_type; 4205 typedef _BinaryOp<logical_and<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4206 return __val_expr<_Op>(_Op(logical_and<value_type>(), 4207 __x, __scalar_expr<value_type>(__y, __x.size()))); 4208 } 4209 4210 template<class _Expr> 4211 inline _LIBCPP_INLINE_VISIBILITY 4212 typename enable_if 4213 < 4214 __is_val_expr<_Expr>::value, 4215 __val_expr<_BinaryOp<logical_and<typename _Expr::value_type>, 4216 __scalar_expr<typename _Expr::value_type>, _Expr> > 4217 >::type 4218 operator&&(const typename _Expr::value_type& __x, const _Expr& __y) 4219 { 4220 typedef typename _Expr::value_type value_type; 4221 typedef _BinaryOp<logical_and<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4222 return __val_expr<_Op>(_Op(logical_and<value_type>(), 4223 __scalar_expr<value_type>(__x, __y.size()), __y)); 4224 } 4225 4226 template<class _Expr1, class _Expr2> 4227 inline _LIBCPP_INLINE_VISIBILITY 4228 typename enable_if 4229 < 4230 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4231 __val_expr<_BinaryOp<logical_or<typename _Expr1::value_type>, _Expr1, _Expr2> > 4232 >::type 4233 operator||(const _Expr1& __x, const _Expr2& __y) 4234 { 4235 typedef typename _Expr1::value_type value_type; 4236 typedef _BinaryOp<logical_or<value_type>, _Expr1, _Expr2> _Op; 4237 return __val_expr<_Op>(_Op(logical_or<value_type>(), __x, __y)); 4238 } 4239 4240 template<class _Expr> 4241 inline _LIBCPP_INLINE_VISIBILITY 4242 typename enable_if 4243 < 4244 __is_val_expr<_Expr>::value, 4245 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, 4246 _Expr, __scalar_expr<typename _Expr::value_type> > > 4247 >::type 4248 operator||(const _Expr& __x, const typename _Expr::value_type& __y) 4249 { 4250 typedef typename _Expr::value_type value_type; 4251 typedef _BinaryOp<logical_or<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4252 return __val_expr<_Op>(_Op(logical_or<value_type>(), 4253 __x, __scalar_expr<value_type>(__y, __x.size()))); 4254 } 4255 4256 template<class _Expr> 4257 inline _LIBCPP_INLINE_VISIBILITY 4258 typename enable_if 4259 < 4260 __is_val_expr<_Expr>::value, 4261 __val_expr<_BinaryOp<logical_or<typename _Expr::value_type>, 4262 __scalar_expr<typename _Expr::value_type>, _Expr> > 4263 >::type 4264 operator||(const typename _Expr::value_type& __x, const _Expr& __y) 4265 { 4266 typedef typename _Expr::value_type value_type; 4267 typedef _BinaryOp<logical_or<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4268 return __val_expr<_Op>(_Op(logical_or<value_type>(), 4269 __scalar_expr<value_type>(__x, __y.size()), __y)); 4270 } 4271 4272 template<class _Expr1, class _Expr2> 4273 inline _LIBCPP_INLINE_VISIBILITY 4274 typename enable_if 4275 < 4276 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4277 __val_expr<_BinaryOp<equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > 4278 >::type 4279 operator==(const _Expr1& __x, const _Expr2& __y) 4280 { 4281 typedef typename _Expr1::value_type value_type; 4282 typedef _BinaryOp<equal_to<value_type>, _Expr1, _Expr2> _Op; 4283 return __val_expr<_Op>(_Op(equal_to<value_type>(), __x, __y)); 4284 } 4285 4286 template<class _Expr> 4287 inline _LIBCPP_INLINE_VISIBILITY 4288 typename enable_if 4289 < 4290 __is_val_expr<_Expr>::value, 4291 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, 4292 _Expr, __scalar_expr<typename _Expr::value_type> > > 4293 >::type 4294 operator==(const _Expr& __x, const typename _Expr::value_type& __y) 4295 { 4296 typedef typename _Expr::value_type value_type; 4297 typedef _BinaryOp<equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4298 return __val_expr<_Op>(_Op(equal_to<value_type>(), 4299 __x, __scalar_expr<value_type>(__y, __x.size()))); 4300 } 4301 4302 template<class _Expr> 4303 inline _LIBCPP_INLINE_VISIBILITY 4304 typename enable_if 4305 < 4306 __is_val_expr<_Expr>::value, 4307 __val_expr<_BinaryOp<equal_to<typename _Expr::value_type>, 4308 __scalar_expr<typename _Expr::value_type>, _Expr> > 4309 >::type 4310 operator==(const typename _Expr::value_type& __x, const _Expr& __y) 4311 { 4312 typedef typename _Expr::value_type value_type; 4313 typedef _BinaryOp<equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4314 return __val_expr<_Op>(_Op(equal_to<value_type>(), 4315 __scalar_expr<value_type>(__x, __y.size()), __y)); 4316 } 4317 4318 template<class _Expr1, class _Expr2> 4319 inline _LIBCPP_INLINE_VISIBILITY 4320 typename enable_if 4321 < 4322 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4323 __val_expr<_BinaryOp<not_equal_to<typename _Expr1::value_type>, _Expr1, _Expr2> > 4324 >::type 4325 operator!=(const _Expr1& __x, const _Expr2& __y) 4326 { 4327 typedef typename _Expr1::value_type value_type; 4328 typedef _BinaryOp<not_equal_to<value_type>, _Expr1, _Expr2> _Op; 4329 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), __x, __y)); 4330 } 4331 4332 template<class _Expr> 4333 inline _LIBCPP_INLINE_VISIBILITY 4334 typename enable_if 4335 < 4336 __is_val_expr<_Expr>::value, 4337 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, 4338 _Expr, __scalar_expr<typename _Expr::value_type> > > 4339 >::type 4340 operator!=(const _Expr& __x, const typename _Expr::value_type& __y) 4341 { 4342 typedef typename _Expr::value_type value_type; 4343 typedef _BinaryOp<not_equal_to<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4344 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), 4345 __x, __scalar_expr<value_type>(__y, __x.size()))); 4346 } 4347 4348 template<class _Expr> 4349 inline _LIBCPP_INLINE_VISIBILITY 4350 typename enable_if 4351 < 4352 __is_val_expr<_Expr>::value, 4353 __val_expr<_BinaryOp<not_equal_to<typename _Expr::value_type>, 4354 __scalar_expr<typename _Expr::value_type>, _Expr> > 4355 >::type 4356 operator!=(const typename _Expr::value_type& __x, const _Expr& __y) 4357 { 4358 typedef typename _Expr::value_type value_type; 4359 typedef _BinaryOp<not_equal_to<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4360 return __val_expr<_Op>(_Op(not_equal_to<value_type>(), 4361 __scalar_expr<value_type>(__x, __y.size()), __y)); 4362 } 4363 4364 template<class _Expr1, class _Expr2> 4365 inline _LIBCPP_INLINE_VISIBILITY 4366 typename enable_if 4367 < 4368 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4369 __val_expr<_BinaryOp<less<typename _Expr1::value_type>, _Expr1, _Expr2> > 4370 >::type 4371 operator<(const _Expr1& __x, const _Expr2& __y) 4372 { 4373 typedef typename _Expr1::value_type value_type; 4374 typedef _BinaryOp<less<value_type>, _Expr1, _Expr2> _Op; 4375 return __val_expr<_Op>(_Op(less<value_type>(), __x, __y)); 4376 } 4377 4378 template<class _Expr> 4379 inline _LIBCPP_INLINE_VISIBILITY 4380 typename enable_if 4381 < 4382 __is_val_expr<_Expr>::value, 4383 __val_expr<_BinaryOp<less<typename _Expr::value_type>, 4384 _Expr, __scalar_expr<typename _Expr::value_type> > > 4385 >::type 4386 operator<(const _Expr& __x, const typename _Expr::value_type& __y) 4387 { 4388 typedef typename _Expr::value_type value_type; 4389 typedef _BinaryOp<less<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4390 return __val_expr<_Op>(_Op(less<value_type>(), 4391 __x, __scalar_expr<value_type>(__y, __x.size()))); 4392 } 4393 4394 template<class _Expr> 4395 inline _LIBCPP_INLINE_VISIBILITY 4396 typename enable_if 4397 < 4398 __is_val_expr<_Expr>::value, 4399 __val_expr<_BinaryOp<less<typename _Expr::value_type>, 4400 __scalar_expr<typename _Expr::value_type>, _Expr> > 4401 >::type 4402 operator<(const typename _Expr::value_type& __x, const _Expr& __y) 4403 { 4404 typedef typename _Expr::value_type value_type; 4405 typedef _BinaryOp<less<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4406 return __val_expr<_Op>(_Op(less<value_type>(), 4407 __scalar_expr<value_type>(__x, __y.size()), __y)); 4408 } 4409 4410 template<class _Expr1, class _Expr2> 4411 inline _LIBCPP_INLINE_VISIBILITY 4412 typename enable_if 4413 < 4414 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4415 __val_expr<_BinaryOp<greater<typename _Expr1::value_type>, _Expr1, _Expr2> > 4416 >::type 4417 operator>(const _Expr1& __x, const _Expr2& __y) 4418 { 4419 typedef typename _Expr1::value_type value_type; 4420 typedef _BinaryOp<greater<value_type>, _Expr1, _Expr2> _Op; 4421 return __val_expr<_Op>(_Op(greater<value_type>(), __x, __y)); 4422 } 4423 4424 template<class _Expr> 4425 inline _LIBCPP_INLINE_VISIBILITY 4426 typename enable_if 4427 < 4428 __is_val_expr<_Expr>::value, 4429 __val_expr<_BinaryOp<greater<typename _Expr::value_type>, 4430 _Expr, __scalar_expr<typename _Expr::value_type> > > 4431 >::type 4432 operator>(const _Expr& __x, const typename _Expr::value_type& __y) 4433 { 4434 typedef typename _Expr::value_type value_type; 4435 typedef _BinaryOp<greater<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4436 return __val_expr<_Op>(_Op(greater<value_type>(), 4437 __x, __scalar_expr<value_type>(__y, __x.size()))); 4438 } 4439 4440 template<class _Expr> 4441 inline _LIBCPP_INLINE_VISIBILITY 4442 typename enable_if 4443 < 4444 __is_val_expr<_Expr>::value, 4445 __val_expr<_BinaryOp<greater<typename _Expr::value_type>, 4446 __scalar_expr<typename _Expr::value_type>, _Expr> > 4447 >::type 4448 operator>(const typename _Expr::value_type& __x, const _Expr& __y) 4449 { 4450 typedef typename _Expr::value_type value_type; 4451 typedef _BinaryOp<greater<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4452 return __val_expr<_Op>(_Op(greater<value_type>(), 4453 __scalar_expr<value_type>(__x, __y.size()), __y)); 4454 } 4455 4456 template<class _Expr1, class _Expr2> 4457 inline _LIBCPP_INLINE_VISIBILITY 4458 typename enable_if 4459 < 4460 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4461 __val_expr<_BinaryOp<less_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > 4462 >::type 4463 operator<=(const _Expr1& __x, const _Expr2& __y) 4464 { 4465 typedef typename _Expr1::value_type value_type; 4466 typedef _BinaryOp<less_equal<value_type>, _Expr1, _Expr2> _Op; 4467 return __val_expr<_Op>(_Op(less_equal<value_type>(), __x, __y)); 4468 } 4469 4470 template<class _Expr> 4471 inline _LIBCPP_INLINE_VISIBILITY 4472 typename enable_if 4473 < 4474 __is_val_expr<_Expr>::value, 4475 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, 4476 _Expr, __scalar_expr<typename _Expr::value_type> > > 4477 >::type 4478 operator<=(const _Expr& __x, const typename _Expr::value_type& __y) 4479 { 4480 typedef typename _Expr::value_type value_type; 4481 typedef _BinaryOp<less_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4482 return __val_expr<_Op>(_Op(less_equal<value_type>(), 4483 __x, __scalar_expr<value_type>(__y, __x.size()))); 4484 } 4485 4486 template<class _Expr> 4487 inline _LIBCPP_INLINE_VISIBILITY 4488 typename enable_if 4489 < 4490 __is_val_expr<_Expr>::value, 4491 __val_expr<_BinaryOp<less_equal<typename _Expr::value_type>, 4492 __scalar_expr<typename _Expr::value_type>, _Expr> > 4493 >::type 4494 operator<=(const typename _Expr::value_type& __x, const _Expr& __y) 4495 { 4496 typedef typename _Expr::value_type value_type; 4497 typedef _BinaryOp<less_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4498 return __val_expr<_Op>(_Op(less_equal<value_type>(), 4499 __scalar_expr<value_type>(__x, __y.size()), __y)); 4500 } 4501 4502 template<class _Expr1, class _Expr2> 4503 inline _LIBCPP_INLINE_VISIBILITY 4504 typename enable_if 4505 < 4506 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4507 __val_expr<_BinaryOp<greater_equal<typename _Expr1::value_type>, _Expr1, _Expr2> > 4508 >::type 4509 operator>=(const _Expr1& __x, const _Expr2& __y) 4510 { 4511 typedef typename _Expr1::value_type value_type; 4512 typedef _BinaryOp<greater_equal<value_type>, _Expr1, _Expr2> _Op; 4513 return __val_expr<_Op>(_Op(greater_equal<value_type>(), __x, __y)); 4514 } 4515 4516 template<class _Expr> 4517 inline _LIBCPP_INLINE_VISIBILITY 4518 typename enable_if 4519 < 4520 __is_val_expr<_Expr>::value, 4521 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, 4522 _Expr, __scalar_expr<typename _Expr::value_type> > > 4523 >::type 4524 operator>=(const _Expr& __x, const typename _Expr::value_type& __y) 4525 { 4526 typedef typename _Expr::value_type value_type; 4527 typedef _BinaryOp<greater_equal<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4528 return __val_expr<_Op>(_Op(greater_equal<value_type>(), 4529 __x, __scalar_expr<value_type>(__y, __x.size()))); 4530 } 4531 4532 template<class _Expr> 4533 inline _LIBCPP_INLINE_VISIBILITY 4534 typename enable_if 4535 < 4536 __is_val_expr<_Expr>::value, 4537 __val_expr<_BinaryOp<greater_equal<typename _Expr::value_type>, 4538 __scalar_expr<typename _Expr::value_type>, _Expr> > 4539 >::type 4540 operator>=(const typename _Expr::value_type& __x, const _Expr& __y) 4541 { 4542 typedef typename _Expr::value_type value_type; 4543 typedef _BinaryOp<greater_equal<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4544 return __val_expr<_Op>(_Op(greater_equal<value_type>(), 4545 __scalar_expr<value_type>(__x, __y.size()), __y)); 4546 } 4547 4548 template<class _Expr> 4549 inline _LIBCPP_INLINE_VISIBILITY 4550 typename enable_if 4551 < 4552 __is_val_expr<_Expr>::value, 4553 __val_expr<_UnaryOp<__abs_expr<typename _Expr::value_type>, _Expr> > 4554 >::type 4555 abs(const _Expr& __x) 4556 { 4557 typedef typename _Expr::value_type value_type; 4558 typedef _UnaryOp<__abs_expr<value_type>, _Expr> _Op; 4559 return __val_expr<_Op>(_Op(__abs_expr<value_type>(), __x)); 4560 } 4561 4562 template<class _Expr> 4563 inline _LIBCPP_INLINE_VISIBILITY 4564 typename enable_if 4565 < 4566 __is_val_expr<_Expr>::value, 4567 __val_expr<_UnaryOp<__acos_expr<typename _Expr::value_type>, _Expr> > 4568 >::type 4569 acos(const _Expr& __x) 4570 { 4571 typedef typename _Expr::value_type value_type; 4572 typedef _UnaryOp<__acos_expr<value_type>, _Expr> _Op; 4573 return __val_expr<_Op>(_Op(__acos_expr<value_type>(), __x)); 4574 } 4575 4576 template<class _Expr> 4577 inline _LIBCPP_INLINE_VISIBILITY 4578 typename enable_if 4579 < 4580 __is_val_expr<_Expr>::value, 4581 __val_expr<_UnaryOp<__asin_expr<typename _Expr::value_type>, _Expr> > 4582 >::type 4583 asin(const _Expr& __x) 4584 { 4585 typedef typename _Expr::value_type value_type; 4586 typedef _UnaryOp<__asin_expr<value_type>, _Expr> _Op; 4587 return __val_expr<_Op>(_Op(__asin_expr<value_type>(), __x)); 4588 } 4589 4590 template<class _Expr> 4591 inline _LIBCPP_INLINE_VISIBILITY 4592 typename enable_if 4593 < 4594 __is_val_expr<_Expr>::value, 4595 __val_expr<_UnaryOp<__atan_expr<typename _Expr::value_type>, _Expr> > 4596 >::type 4597 atan(const _Expr& __x) 4598 { 4599 typedef typename _Expr::value_type value_type; 4600 typedef _UnaryOp<__atan_expr<value_type>, _Expr> _Op; 4601 return __val_expr<_Op>(_Op(__atan_expr<value_type>(), __x)); 4602 } 4603 4604 template<class _Expr1, class _Expr2> 4605 inline _LIBCPP_INLINE_VISIBILITY 4606 typename enable_if 4607 < 4608 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4609 __val_expr<_BinaryOp<__atan2_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > 4610 >::type 4611 atan2(const _Expr1& __x, const _Expr2& __y) 4612 { 4613 typedef typename _Expr1::value_type value_type; 4614 typedef _BinaryOp<__atan2_expr<value_type>, _Expr1, _Expr2> _Op; 4615 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), __x, __y)); 4616 } 4617 4618 template<class _Expr> 4619 inline _LIBCPP_INLINE_VISIBILITY 4620 typename enable_if 4621 < 4622 __is_val_expr<_Expr>::value, 4623 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, 4624 _Expr, __scalar_expr<typename _Expr::value_type> > > 4625 >::type 4626 atan2(const _Expr& __x, const typename _Expr::value_type& __y) 4627 { 4628 typedef typename _Expr::value_type value_type; 4629 typedef _BinaryOp<__atan2_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4630 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), 4631 __x, __scalar_expr<value_type>(__y, __x.size()))); 4632 } 4633 4634 template<class _Expr> 4635 inline _LIBCPP_INLINE_VISIBILITY 4636 typename enable_if 4637 < 4638 __is_val_expr<_Expr>::value, 4639 __val_expr<_BinaryOp<__atan2_expr<typename _Expr::value_type>, 4640 __scalar_expr<typename _Expr::value_type>, _Expr> > 4641 >::type 4642 atan2(const typename _Expr::value_type& __x, const _Expr& __y) 4643 { 4644 typedef typename _Expr::value_type value_type; 4645 typedef _BinaryOp<__atan2_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4646 return __val_expr<_Op>(_Op(__atan2_expr<value_type>(), 4647 __scalar_expr<value_type>(__x, __y.size()), __y)); 4648 } 4649 4650 template<class _Expr> 4651 inline _LIBCPP_INLINE_VISIBILITY 4652 typename enable_if 4653 < 4654 __is_val_expr<_Expr>::value, 4655 __val_expr<_UnaryOp<__cos_expr<typename _Expr::value_type>, _Expr> > 4656 >::type 4657 cos(const _Expr& __x) 4658 { 4659 typedef typename _Expr::value_type value_type; 4660 typedef _UnaryOp<__cos_expr<value_type>, _Expr> _Op; 4661 return __val_expr<_Op>(_Op(__cos_expr<value_type>(), __x)); 4662 } 4663 4664 template<class _Expr> 4665 inline _LIBCPP_INLINE_VISIBILITY 4666 typename enable_if 4667 < 4668 __is_val_expr<_Expr>::value, 4669 __val_expr<_UnaryOp<__cosh_expr<typename _Expr::value_type>, _Expr> > 4670 >::type 4671 cosh(const _Expr& __x) 4672 { 4673 typedef typename _Expr::value_type value_type; 4674 typedef _UnaryOp<__cosh_expr<value_type>, _Expr> _Op; 4675 return __val_expr<_Op>(_Op(__cosh_expr<value_type>(), __x)); 4676 } 4677 4678 template<class _Expr> 4679 inline _LIBCPP_INLINE_VISIBILITY 4680 typename enable_if 4681 < 4682 __is_val_expr<_Expr>::value, 4683 __val_expr<_UnaryOp<__exp_expr<typename _Expr::value_type>, _Expr> > 4684 >::type 4685 exp(const _Expr& __x) 4686 { 4687 typedef typename _Expr::value_type value_type; 4688 typedef _UnaryOp<__exp_expr<value_type>, _Expr> _Op; 4689 return __val_expr<_Op>(_Op(__exp_expr<value_type>(), __x)); 4690 } 4691 4692 template<class _Expr> 4693 inline _LIBCPP_INLINE_VISIBILITY 4694 typename enable_if 4695 < 4696 __is_val_expr<_Expr>::value, 4697 __val_expr<_UnaryOp<__log_expr<typename _Expr::value_type>, _Expr> > 4698 >::type 4699 log(const _Expr& __x) 4700 { 4701 typedef typename _Expr::value_type value_type; 4702 typedef _UnaryOp<__log_expr<value_type>, _Expr> _Op; 4703 return __val_expr<_Op>(_Op(__log_expr<value_type>(), __x)); 4704 } 4705 4706 template<class _Expr> 4707 inline _LIBCPP_INLINE_VISIBILITY 4708 typename enable_if 4709 < 4710 __is_val_expr<_Expr>::value, 4711 __val_expr<_UnaryOp<__log10_expr<typename _Expr::value_type>, _Expr> > 4712 >::type 4713 log10(const _Expr& __x) 4714 { 4715 typedef typename _Expr::value_type value_type; 4716 typedef _UnaryOp<__log10_expr<value_type>, _Expr> _Op; 4717 return __val_expr<_Op>(_Op(__log10_expr<value_type>(), __x)); 4718 } 4719 4720 template<class _Expr1, class _Expr2> 4721 inline _LIBCPP_INLINE_VISIBILITY 4722 typename enable_if 4723 < 4724 __is_val_expr<_Expr1>::value && __is_val_expr<_Expr2>::value, 4725 __val_expr<_BinaryOp<__pow_expr<typename _Expr1::value_type>, _Expr1, _Expr2> > 4726 >::type 4727 pow(const _Expr1& __x, const _Expr2& __y) 4728 { 4729 typedef typename _Expr1::value_type value_type; 4730 typedef _BinaryOp<__pow_expr<value_type>, _Expr1, _Expr2> _Op; 4731 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), __x, __y)); 4732 } 4733 4734 template<class _Expr> 4735 inline _LIBCPP_INLINE_VISIBILITY 4736 typename enable_if 4737 < 4738 __is_val_expr<_Expr>::value, 4739 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, 4740 _Expr, __scalar_expr<typename _Expr::value_type> > > 4741 >::type 4742 pow(const _Expr& __x, const typename _Expr::value_type& __y) 4743 { 4744 typedef typename _Expr::value_type value_type; 4745 typedef _BinaryOp<__pow_expr<value_type>, _Expr, __scalar_expr<value_type> > _Op; 4746 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), 4747 __x, __scalar_expr<value_type>(__y, __x.size()))); 4748 } 4749 4750 template<class _Expr> 4751 inline _LIBCPP_INLINE_VISIBILITY 4752 typename enable_if 4753 < 4754 __is_val_expr<_Expr>::value, 4755 __val_expr<_BinaryOp<__pow_expr<typename _Expr::value_type>, 4756 __scalar_expr<typename _Expr::value_type>, _Expr> > 4757 >::type 4758 pow(const typename _Expr::value_type& __x, const _Expr& __y) 4759 { 4760 typedef typename _Expr::value_type value_type; 4761 typedef _BinaryOp<__pow_expr<value_type>, __scalar_expr<value_type>, _Expr> _Op; 4762 return __val_expr<_Op>(_Op(__pow_expr<value_type>(), 4763 __scalar_expr<value_type>(__x, __y.size()), __y)); 4764 } 4765 4766 template<class _Expr> 4767 inline _LIBCPP_INLINE_VISIBILITY 4768 typename enable_if 4769 < 4770 __is_val_expr<_Expr>::value, 4771 __val_expr<_UnaryOp<__sin_expr<typename _Expr::value_type>, _Expr> > 4772 >::type 4773 sin(const _Expr& __x) 4774 { 4775 typedef typename _Expr::value_type value_type; 4776 typedef _UnaryOp<__sin_expr<value_type>, _Expr> _Op; 4777 return __val_expr<_Op>(_Op(__sin_expr<value_type>(), __x)); 4778 } 4779 4780 template<class _Expr> 4781 inline _LIBCPP_INLINE_VISIBILITY 4782 typename enable_if 4783 < 4784 __is_val_expr<_Expr>::value, 4785 __val_expr<_UnaryOp<__sinh_expr<typename _Expr::value_type>, _Expr> > 4786 >::type 4787 sinh(const _Expr& __x) 4788 { 4789 typedef typename _Expr::value_type value_type; 4790 typedef _UnaryOp<__sinh_expr<value_type>, _Expr> _Op; 4791 return __val_expr<_Op>(_Op(__sinh_expr<value_type>(), __x)); 4792 } 4793 4794 template<class _Expr> 4795 inline _LIBCPP_INLINE_VISIBILITY 4796 typename enable_if 4797 < 4798 __is_val_expr<_Expr>::value, 4799 __val_expr<_UnaryOp<__sqrt_expr<typename _Expr::value_type>, _Expr> > 4800 >::type 4801 sqrt(const _Expr& __x) 4802 { 4803 typedef typename _Expr::value_type value_type; 4804 typedef _UnaryOp<__sqrt_expr<value_type>, _Expr> _Op; 4805 return __val_expr<_Op>(_Op(__sqrt_expr<value_type>(), __x)); 4806 } 4807 4808 template<class _Expr> 4809 inline _LIBCPP_INLINE_VISIBILITY 4810 typename enable_if 4811 < 4812 __is_val_expr<_Expr>::value, 4813 __val_expr<_UnaryOp<__tan_expr<typename _Expr::value_type>, _Expr> > 4814 >::type 4815 tan(const _Expr& __x) 4816 { 4817 typedef typename _Expr::value_type value_type; 4818 typedef _UnaryOp<__tan_expr<value_type>, _Expr> _Op; 4819 return __val_expr<_Op>(_Op(__tan_expr<value_type>(), __x)); 4820 } 4821 4822 template<class _Expr> 4823 inline _LIBCPP_INLINE_VISIBILITY 4824 typename enable_if 4825 < 4826 __is_val_expr<_Expr>::value, 4827 __val_expr<_UnaryOp<__tanh_expr<typename _Expr::value_type>, _Expr> > 4828 >::type 4829 tanh(const _Expr& __x) 4830 { 4831 typedef typename _Expr::value_type value_type; 4832 typedef _UnaryOp<__tanh_expr<value_type>, _Expr> _Op; 4833 return __val_expr<_Op>(_Op(__tanh_expr<value_type>(), __x)); 4834 } 4835 4836 template <class _Tp> 4837 inline _LIBCPP_INLINE_VISIBILITY 4838 _Tp* 4839 begin(valarray<_Tp>& __v) 4840 { 4841 return __v.__begin_; 4842 } 4843 4844 template <class _Tp> 4845 inline _LIBCPP_INLINE_VISIBILITY 4846 const _Tp* 4847 begin(const valarray<_Tp>& __v) 4848 { 4849 return __v.__begin_; 4850 } 4851 4852 template <class _Tp> 4853 inline _LIBCPP_INLINE_VISIBILITY 4854 _Tp* 4855 end(valarray<_Tp>& __v) 4856 { 4857 return __v.__end_; 4858 } 4859 4860 template <class _Tp> 4861 inline _LIBCPP_INLINE_VISIBILITY 4862 const _Tp* 4863 end(const valarray<_Tp>& __v) 4864 { 4865 return __v.__end_; 4866 } 4867 4868 _LIBCPP_END_NAMESPACE_STD 4869 4870 _LIBCPP_POP_MACROS 4871 4872 #endif // _LIBCPP_VALARRAY 4873