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