31 #ifndef _GLIBCXX_VALARRAY 32 #define _GLIBCXX_VALARRAY 1 34 #pragma GCC system_header 40 #if __cplusplus >= 201103L 44 namespace std _GLIBCXX_VISIBILITY(default)
46 _GLIBCXX_BEGIN_NAMESPACE_VERSION
48 template<
class _Clos,
typename _Tp>
51 template<
typename _Tp1,
typename _Tp2>
54 template<
class _Oper,
template<
class,
class>
class _Meta,
class _Dom>
58 template<
class,
class>
class _Meta1,
59 template<
class,
class>
class _Meta2,
60 class _Dom1,
class _Dom2>
63 template<
template<
class,
class>
class _Meta,
class _Dom>
66 template<
template<
class,
class>
class _Meta,
class _Dom>
69 template<
template<
class,
class>
class _Meta,
class _Dom>
72 template<
template<
class,
class>
class _Meta,
class _Dom>
75 template<
template<
class,
class>
class _Meta,
class _Dom>
86 _GLIBCXX_END_NAMESPACE_VERSION
92 namespace std _GLIBCXX_VISIBILITY(default)
94 _GLIBCXX_BEGIN_NAMESPACE_VERSION
121 typedef typename __fun<_Op, _Tp>::result_type __rt;
122 typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
125 typedef _Tp value_type;
138 valarray(
const _Tp* __restrict__,
size_t);
143 #if __cplusplus >= 201103L 160 #if __cplusplus >= 201103L 166 valarray(
const _Expr<_Dom, _Tp>& __e);
180 #if __cplusplus >= 201103L 240 #if __cplusplus >= 201103L 355 _Expr<_IClos<_ValArray, _Tp>, _Tp>
374 typename _UnaryOp<__unary_plus>::_Rt
operator+()
const;
377 typename _UnaryOp<__negate>::_Rt
operator-()
const;
380 typename _UnaryOp<__bitwise_not>::_Rt
operator~()
const;
383 typename _UnaryOp<__logical_not>::_Rt
operator!()
const;
468 #if __cplusplus >= 201103L 534 _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
apply(_Tp func(_Tp))
const;
546 _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
apply(_Tp func(
const _Tp&))
const;
557 void resize(
size_t __size, _Tp __c = _Tp());
561 _Tp* __restrict__ _M_data;
563 friend class _Array<_Tp>;
566 #if __cpp_deduction_guides >= 201606 567 template<
typename _Tp,
size_t _Nm>
571 template<
typename _Tp>
575 __glibcxx_requires_subscript(__i);
579 template<
typename _Tp>
583 __glibcxx_requires_subscript(__i);
589 _GLIBCXX_END_NAMESPACE_VERSION
599 namespace std _GLIBCXX_VISIBILITY(default)
601 _GLIBCXX_BEGIN_NAMESPACE_VERSION
608 template<
typename _Tp>
612 template<
typename _Tp>
615 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
616 { std::__valarray_default_construct(_M_data, _M_data + __n); }
618 template<
typename _Tp>
621 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
622 { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); }
624 template<
typename _Tp>
627 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
629 __glibcxx_assert(__p != 0 || __n == 0);
630 std::__valarray_copy_construct(__p, __p + __n, _M_data);
633 template<
typename _Tp>
636 : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
637 { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
640 #if __cplusplus >= 201103L 641 template<
typename _Tp>
644 : _M_size(__v._M_size), _M_data(__v._M_data)
651 template<
typename _Tp>
654 : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
656 std::__valarray_copy_construct
657 (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
660 template<
typename _Tp>
663 : _M_size(__ga._M_index.size()),
664 _M_data(__valarray_get_storage<_Tp>(_M_size))
666 std::__valarray_copy_construct
667 (__ga._M_array, _Array<size_t>(__ga._M_index),
668 _Array<_Tp>(_M_data), _M_size);
671 template<
typename _Tp>
674 : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
676 std::__valarray_copy_construct
677 (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
680 template<
typename _Tp>
683 : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
685 std::__valarray_copy_construct
686 (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
689 #if __cplusplus >= 201103L 690 template<
typename _Tp>
693 : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size()))
694 { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); }
697 template<
typename _Tp>
template<
class _Dom>
700 : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
701 { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
703 template<
typename _Tp>
707 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
708 std::__valarray_release_memory(_M_data);
711 template<
typename _Tp>
717 if (_M_size == __v._M_size)
718 std::__valarray_copy(__v._M_data, _M_size, _M_data);
723 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
724 std::__valarray_release_memory(_M_data);
726 _M_size = __v._M_size;
727 _M_data = __valarray_get_storage<_Tp>(_M_size);
728 std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
734 #if __cplusplus >= 201103L 735 template<
typename _Tp>
741 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
742 std::__valarray_release_memory(_M_data);
744 _M_size = __v._M_size;
745 _M_data = __v._M_data;
751 template<
typename _Tp>
757 if (_M_size == __l.size())
758 std::__valarray_copy(__l.begin(), __l.size(), _M_data);
763 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
764 std::__valarray_release_memory(_M_data);
766 _M_size = __l.size();
767 _M_data = __valarray_get_storage<_Tp>(_M_size);
768 std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size,
775 template<
typename _Tp>
779 std::__valarray_fill(_M_data, _M_size, __t);
783 template<
typename _Tp>
787 __glibcxx_assert(_M_size == __sa._M_sz);
788 std::__valarray_copy(__sa._M_array, __sa._M_sz,
789 __sa._M_stride, _Array<_Tp>(_M_data));
793 template<
typename _Tp>
797 __glibcxx_assert(_M_size == __ga._M_index.
size());
798 std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
799 _Array<_Tp>(_M_data), _M_size);
803 template<
typename _Tp>
807 __glibcxx_assert(_M_size == __ma._M_sz);
808 std::__valarray_copy(__ma._M_array, __ma._M_mask,
809 _Array<_Tp>(_M_data), _M_size);
813 template<
typename _Tp>
817 __glibcxx_assert(_M_size == __ia._M_sz);
818 std::__valarray_copy(__ia._M_array, __ia._M_index,
819 _Array<_Tp>(_M_data), _M_size);
823 template<
typename _Tp>
template<
class _Dom>
829 if (_M_size == __e.size())
830 std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
835 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
836 std::__valarray_release_memory(_M_data);
838 _M_size = __e.size();
839 _M_data = __valarray_get_storage<_Tp>(_M_size);
840 std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data));
845 template<
typename _Tp>
846 inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
849 typedef _SClos<_ValArray,_Tp> _Closure;
850 return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
853 template<
typename _Tp>
858 template<
typename _Tp>
859 inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
862 typedef _GClos<_ValArray,_Tp> _Closure;
863 return _Expr<_Closure, _Tp>
864 (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
867 template<
typename _Tp>
872 (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
875 template<
typename _Tp>
880 size_t __e = __m.
size();
881 for (
size_t __i=0; __i<__e; ++__i)
884 _Array<bool> (__m)));
887 template<
typename _Tp>
892 size_t __e = __m.
size();
893 for (
size_t __i=0; __i<__e; ++__i)
898 template<
typename _Tp>
899 inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
902 typedef _IClos<_ValArray,_Tp> _Closure;
903 return _Expr<_Closure, _Tp>(_Closure(*
this, __i));
906 template<
typename _Tp>
911 _Array<size_t>(__i));
914 #if __cplusplus >= 201103L 919 std::swap(_M_size, __v._M_size);
920 std::swap(_M_data, __v._M_data);
933 __glibcxx_assert(_M_size > 0);
934 return std::__valarray_sum(_M_data, _M_data + _M_size);
946 _Tp* __restrict__ __tmp_M_data =
947 std::__valarray_get_storage<_Tp>(_M_size);
950 std::__valarray_copy_construct(_M_data,
951 _M_data + _M_size, __tmp_M_data);
954 if (
size_t(__n) > _M_size)
957 std::__valarray_copy_construct(_M_data + __n,
958 _M_data + _M_size, __tmp_M_data);
959 std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
960 __tmp_M_data + _M_size);
964 if (-
size_t(__n) > _M_size)
967 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
969 std::__valarray_default_construct(__tmp_M_data,
973 __ret._M_size = _M_size;
974 __ret._M_data = __tmp_M_data;
987 _Tp* __restrict__ __tmp_M_data =
988 std::__valarray_get_storage<_Tp>(_M_size);
991 std::__valarray_copy_construct(_M_data,
992 _M_data + _M_size, __tmp_M_data);
995 if (
size_t(__n) > _M_size)
996 __n = int(__n % _M_size);
998 std::__valarray_copy_construct(_M_data, _M_data + __n,
999 __tmp_M_data + _M_size - __n);
1000 std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
1005 if (-
size_t(__n) > _M_size)
1006 __n = -int(-
size_t(__n) % _M_size);
1008 std::__valarray_copy_construct(_M_data + _M_size + __n,
1009 _M_data + _M_size, __tmp_M_data);
1010 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
1011 __tmp_M_data - __n);
1014 __ret._M_size = _M_size;
1015 __ret._M_data = __tmp_M_data;
1026 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
1029 std::__valarray_release_memory(_M_data);
1031 _M_data = __valarray_get_storage<_Tp>(__n);
1033 std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
1036 template<
typename _Tp>
1040 __glibcxx_assert(_M_size > 0);
1044 template<
typename _Tp>
1048 __glibcxx_assert(_M_size > 0);
1053 inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
1056 typedef _ValFunClos<_ValArray, _Tp> _Closure;
1057 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
1061 inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
1064 typedef _RefFunClos<_ValArray, _Tp> _Closure;
1065 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
1068 #define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \ 1069 template<typename _Tp> \ 1070 inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \ 1071 valarray<_Tp>::operator _Op() const \ 1073 typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \ 1074 typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1075 return _Expr<_Closure, _Rt>(_Closure(*this)); \ 1078 _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
1079 _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
1080 _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
1081 _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
1083 #undef _DEFINE_VALARRAY_UNARY_OPERATOR 1085 #define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 1086 template<class _Tp> \ 1087 inline valarray<_Tp>& \ 1088 valarray<_Tp>::operator _Op##=(const _Tp &__t) \ 1090 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \ 1094 template<class _Tp> \ 1095 inline valarray<_Tp>& \ 1096 valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \ 1098 __glibcxx_assert(_M_size == __v._M_size); \ 1099 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \ 1100 _Array<_Tp>(__v._M_data)); \ 1104 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus)
1105 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus)
1106 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies)
1107 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides)
1108 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus)
1109 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1110 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1111 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1112 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1113 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1115 #undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT 1117 #define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \ 1118 template<class _Tp> template<class _Dom> \ 1119 inline valarray<_Tp>& \ 1120 valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \ 1122 _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \ 1126 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus)
1127 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus)
1128 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies)
1129 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides)
1130 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus)
1131 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1132 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1133 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1134 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1135 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1137 #undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT 1140 #define _DEFINE_BINARY_OPERATOR(_Op, _Name) \ 1141 template<typename _Tp> \ 1142 inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \ 1143 typename __fun<_Name, _Tp>::result_type> \ 1144 operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \ 1146 __glibcxx_assert(__v.size() == __w.size()); \ 1147 typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \ 1148 typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1149 return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \ 1152 template<typename _Tp> \ 1153 inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \ 1154 typename __fun<_Name, _Tp>::result_type> \ 1155 operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \ 1157 typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \ 1158 typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1159 return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \ 1162 template<typename _Tp> \ 1163 inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \ 1164 typename __fun<_Name, _Tp>::result_type> \ 1165 operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \ 1167 typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \ 1168 typedef typename __fun<_Name, _Tp>::result_type _Rt; \ 1169 return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \ 1172 _DEFINE_BINARY_OPERATOR(+, __plus)
1173 _DEFINE_BINARY_OPERATOR(-, __minus)
1174 _DEFINE_BINARY_OPERATOR(*, __multiplies)
1175 _DEFINE_BINARY_OPERATOR(/, __divides)
1176 _DEFINE_BINARY_OPERATOR(%, __modulus)
1177 _DEFINE_BINARY_OPERATOR(^, __bitwise_xor)
1178 _DEFINE_BINARY_OPERATOR(&, __bitwise_and)
1179 _DEFINE_BINARY_OPERATOR(|, __bitwise_or)
1180 _DEFINE_BINARY_OPERATOR(<<, __shift_left)
1181 _DEFINE_BINARY_OPERATOR(>>, __shift_right)
1182 _DEFINE_BINARY_OPERATOR(&&, __logical_and)
1183 _DEFINE_BINARY_OPERATOR(||, __logical_or)
1184 _DEFINE_BINARY_OPERATOR(==, __equal_to)
1185 _DEFINE_BINARY_OPERATOR(!=, __not_equal_to)
1186 _DEFINE_BINARY_OPERATOR(<, __less)
1187 _DEFINE_BINARY_OPERATOR(>, __greater)
1188 _DEFINE_BINARY_OPERATOR(<=, __less_equal)
1189 _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
1191 #undef _DEFINE_BINARY_OPERATOR 1193 #if __cplusplus >= 201103L 1237 _GLIBCXX_END_NAMESPACE_VERSION
Class defining multi-dimensional subset of an array.
_Tp max() const
Return the maximum element using operator<().
_GLIBCXX14_CONSTEXPR _ForwardIterator min_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Return the minimum element in a range using comparison functor.
const _Tp * begin(const valarray< _Tp > &__va)
Return an iterator pointing to the first element of the const valarray.
Smart array designed to support numeric processing.
size_t size() const
Return the number of elements in array.
valarray< _Tp > & operator=(const valarray< _Tp > &__v)
Assign elements to an array.
Reference to multi-dimensional subset of an array.
_Expr< _ValFunClos< _ValArray, _Tp >, _Tp > apply(_Tp func(_Tp)) const
Apply a function to the array.
_UnaryOp< __logical_not >::_Rt operator!() const
Return a new valarray by applying unary ! to each element.
_Tp & operator[](size_t __i)
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
_UnaryOp< __bitwise_not >::_Rt operator~() const
Return a new valarray by applying unary ~ to each element.
ISO C++ entities toplevel namespace is std.
valarray< _Tp > & operator-=(const _Tp &)
Subtract t to each element of array.
valarray< _Tp > shift(int __n) const
Return a shifted array.
Reference to arbitrary subset of an array.
valarray< _Tp > & operator*=(const _Tp &)
Multiply each element of array by t.
valarray()
Construct an empty array.
_GLIBCXX14_CONSTEXPR _ForwardIterator max_element(_ForwardIterator __first, _ForwardIterator __last, _Compare __comp)
Return the maximum element in a range using comparison functor.
_GLIBCXX14_CONSTEXPR const _Tp & max(const _Tp &, const _Tp &)
This does what you think it does.
void resize(size_t __size, _Tp __c=_Tp())
Resize array.
valarray< _Tp > & operator &=(const _Tp &)
Set each element e of array to e & t.
Class defining one-dimensional subset of an array.
valarray< _Tp > & operator>>=(const _Tp &)
Right shift each element e of array by t bits.
_UnaryOp< __unary_plus >::_Rt operator+() const
Return a new valarray by applying unary + to each element.
const _Tp * end(const valarray< _Tp > &__va)
Return an iterator pointing to one past the last element of the const valarray.
Reference to one-dimensional subset of an array.
valarray< _Tp > & operator|=(const _Tp &)
Set each element e of array to e | t.
valarray< _Tp > & operator<<=(const _Tp &)
Left shift each element e of array by t bits.
valarray< _Tp > & operator+=(const _Tp &)
Add t to each element of array.
valarray< _Tp > cshift(int __n) const
Return a rotated array.
Reference to selected subset of an array.
_Tp min() const
Return the minimum element using operator<().
void swap(valarray< _Tp > &__v) noexcept
Swap.
valarray< _Tp > & operator^=(const _Tp &)
Set each element e of array to e ^ t.
_GLIBCXX14_CONSTEXPR const _Tp & min(const _Tp &, const _Tp &)
This does what you think it does.
valarray< _Tp > & operator%=(const _Tp &)
Set each element e of array to e % t.
_UnaryOp< __negate >::_Rt operator-() const
Return a new valarray by applying unary - to each element.
valarray< _Tp > & operator/=(const _Tp &)
Divide each element of array by t.
_Tp sum() const
Return the sum of all elements in the array.