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
158 valarray(
const indirect_array<_Tp>&);
160 #if __cplusplus >= 201103L
166 valarray(
const _Expr<_Dom, _Tp>& __e);
180 #if __cplusplus >= 201103L
188 valarray<_Tp>&
operator=(valarray<_Tp>&& __v) noexcept;
198 valarray<_Tp>&
operator=(
const _Tp& __t);
208 valarray<_Tp>&
operator=(
const slice_array<_Tp>& __sa);
218 valarray<_Tp>&
operator=(
const gslice_array<_Tp>& __ga);
228 valarray<_Tp>&
operator=(
const mask_array<_Tp>& __ma);
238 valarray<_Tp>&
operator=(
const indirect_array<_Tp>& __ia);
240 #if __cplusplus >= 201103L
252 template<
class _Dom> valarray<_Tp>&
279 _Expr<_SClos<_ValArray, _Tp>, _Tp>
operator[](slice __s)
const;
302 _Expr<_GClos<_ValArray, _Tp>, _Tp>
operator[](
const gslice& __s)
const;
314 gslice_array<_Tp>
operator[](
const gslice& __s);
328 valarray<_Tp>
operator[](
const valarray<bool>& __m)
const;
342 mask_array<_Tp>
operator[](
const valarray<bool>& __m);
355 _Expr<_IClos<_ValArray, _Tp>, _Tp>
356 operator[](
const valarray<size_t>& __i)
const;
370 indirect_array<_Tp>
operator[](
const valarray<size_t>& __i);
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;
417 valarray<_Tp>&
operator*=(
const valarray<_Tp>&);
420 valarray<_Tp>&
operator/=(
const valarray<_Tp>&);
423 valarray<_Tp>&
operator%=(
const valarray<_Tp>&);
426 valarray<_Tp>&
operator+=(
const valarray<_Tp>&);
429 valarray<_Tp>&
operator-=(
const valarray<_Tp>&);
432 valarray<_Tp>&
operator^=(
const valarray<_Tp>&);
435 valarray<_Tp>&
operator|=(
const valarray<_Tp>&);
438 valarray<_Tp>&
operator&=(
const valarray<_Tp>&);
441 valarray<_Tp>& operator<<=(const valarray<_Tp>&);
447 valarray<_Tp>&
operator*=(
const _Expr<_Dom, _Tp>&);
449 valarray<_Tp>&
operator/=(
const _Expr<_Dom, _Tp>&);
451 valarray<_Tp>&
operator%=(
const _Expr<_Dom, _Tp>&);
453 valarray<_Tp>&
operator+=(
const _Expr<_Dom, _Tp>&);
455 valarray<_Tp>&
operator-=(
const _Expr<_Dom, _Tp>&);
457 valarray<_Tp>&
operator^=(
const _Expr<_Dom, _Tp>&);
459 valarray<_Tp>&
operator|=(
const _Expr<_Dom, _Tp>&);
461 valarray<_Tp>&
operator&=(
const _Expr<_Dom, _Tp>&);
463 valarray<_Tp>& operator<<=(const _Expr<_Dom, _Tp>&);
465 valarray<_Tp>&
operator>>=(
const _Expr<_Dom, _Tp>&);
468 #if __cplusplus >= 201103L
470 void swap(valarray<_Tp>& __v) noexcept;
505 valarray<_Tp>
shift (
int __n)
const;
522 valarray<_Tp>
cshift(
int __n)
const;
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 template<
typename _Tp>
570 __glibcxx_requires_subscript(__i);
574 template<
typename _Tp>
578 __glibcxx_requires_subscript(__i);
584 _GLIBCXX_END_NAMESPACE_VERSION
594 namespace std _GLIBCXX_VISIBILITY(default)
596 _GLIBCXX_BEGIN_NAMESPACE_VERSION
603 template<
typename _Tp>
607 template<
typename _Tp>
610 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
611 { std::__valarray_default_construct(_M_data, _M_data + __n); }
613 template<
typename _Tp>
616 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
617 { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); }
619 template<
typename _Tp>
622 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
624 _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0);
625 std::__valarray_copy_construct(__p, __p + __n, _M_data);
628 template<
typename _Tp>
631 : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
632 { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
635 #if __cplusplus >= 201103L
636 template<
typename _Tp>
639 : _M_size(__v._M_size), _M_data(__v._M_data)
646 template<
typename _Tp>
649 : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
651 std::__valarray_copy_construct
652 (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
655 template<
typename _Tp>
658 : _M_size(__ga._M_index.
size()),
659 _M_data(__valarray_get_storage<_Tp>(_M_size))
661 std::__valarray_copy_construct
662 (__ga._M_array, _Array<size_t>(__ga._M_index),
663 _Array<_Tp>(_M_data), _M_size);
666 template<
typename _Tp>
669 : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
671 std::__valarray_copy_construct
672 (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
675 template<
typename _Tp>
678 : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
680 std::__valarray_copy_construct
681 (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
684 #if __cplusplus >= 201103L
685 template<
typename _Tp>
688 : _M_size(__l.
size()), _M_data(__valarray_get_storage<_Tp>(__l.
size()))
689 { std::__valarray_copy_construct(__l.begin(), __l.end(), _M_data); }
692 template<
typename _Tp>
template<
class _Dom>
695 : _M_size(__e.
size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
696 { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
698 template<
typename _Tp>
700 valarray<_Tp>::~valarray() _GLIBCXX_NOEXCEPT
702 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
703 std::__valarray_release_memory(_M_data);
706 template<
typename _Tp>
707 inline valarray<_Tp>&
712 if (_M_size == __v._M_size)
713 std::__valarray_copy(__v._M_data, _M_size, _M_data);
718 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
719 std::__valarray_release_memory(_M_data);
721 _M_size = __v._M_size;
722 _M_data = __valarray_get_storage<_Tp>(_M_size);
723 std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
729 #if __cplusplus >= 201103L
730 template<
typename _Tp>
736 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
737 std::__valarray_release_memory(_M_data);
739 _M_size = __v._M_size;
740 _M_data = __v._M_data;
746 template<
typename _Tp>
752 if (_M_size == __l.size())
753 std::__valarray_copy(__l.begin(), __l.size(), _M_data);
758 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
759 std::__valarray_release_memory(_M_data);
761 _M_size = __l.size();
762 _M_data = __valarray_get_storage<_Tp>(_M_size);
763 std::__valarray_copy_construct(__l.begin(), __l.begin() + _M_size,
770 template<
typename _Tp>
774 std::__valarray_fill(_M_data, _M_size, __t);
778 template<
typename _Tp>
782 _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz);
783 std::__valarray_copy(__sa._M_array, __sa._M_sz,
784 __sa._M_stride, _Array<_Tp>(_M_data));
788 template<
typename _Tp>
792 _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.
size());
793 std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
794 _Array<_Tp>(_M_data), _M_size);
798 template<
typename _Tp>
802 _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz);
803 std::__valarray_copy(__ma._M_array, __ma._M_mask,
804 _Array<_Tp>(_M_data), _M_size);
808 template<
typename _Tp>
812 _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz);
813 std::__valarray_copy(__ia._M_array, __ia._M_index,
814 _Array<_Tp>(_M_data), _M_size);
818 template<
typename _Tp>
template<
class _Dom>
822 _GLIBCXX_DEBUG_ASSERT(_M_size == __e.size());
823 std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
827 template<
typename _Tp>
828 inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
831 typedef _SClos<_ValArray,_Tp> _Closure;
832 return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
835 template<
typename _Tp>
840 template<
typename _Tp>
841 inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
844 typedef _GClos<_ValArray,_Tp> _Closure;
845 return _Expr<_Closure, _Tp>
846 (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
849 template<
typename _Tp>
854 (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
857 template<
typename _Tp>
862 size_t __e = __m.
size();
863 for (
size_t __i=0; __i<__e; ++__i)
866 _Array<bool> (__m)));
869 template<
typename _Tp>
874 size_t __e = __m.
size();
875 for (
size_t __i=0; __i<__e; ++__i)
880 template<
typename _Tp>
881 inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
884 typedef _IClos<_ValArray,_Tp> _Closure;
885 return _Expr<_Closure, _Tp>(_Closure(*
this, __i));
888 template<
typename _Tp>
893 _Array<size_t>(__i));
896 #if __cplusplus >= 201103L
901 std::swap(_M_size, __v._M_size);
902 std::swap(_M_data, __v._M_data);
915 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
916 return std::__valarray_sum(_M_data, _M_data + _M_size);
928 _Tp* __restrict__ __tmp_M_data =
929 std::__valarray_get_storage<_Tp>(_M_size);
932 std::__valarray_copy_construct(_M_data,
933 _M_data + _M_size, __tmp_M_data);
936 if (
size_t(__n) > _M_size)
939 std::__valarray_copy_construct(_M_data + __n,
940 _M_data + _M_size, __tmp_M_data);
941 std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
942 __tmp_M_data + _M_size);
946 if (-
size_t(__n) > _M_size)
949 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
951 std::__valarray_default_construct(__tmp_M_data,
955 __ret._M_size = _M_size;
956 __ret._M_data = __tmp_M_data;
969 _Tp* __restrict__ __tmp_M_data =
970 std::__valarray_get_storage<_Tp>(_M_size);
973 std::__valarray_copy_construct(_M_data,
974 _M_data + _M_size, __tmp_M_data);
977 if (
size_t(__n) > _M_size)
978 __n = int(__n % _M_size);
980 std::__valarray_copy_construct(_M_data, _M_data + __n,
981 __tmp_M_data + _M_size - __n);
982 std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
987 if (-
size_t(__n) > _M_size)
988 __n = -int(-
size_t(__n) % _M_size);
990 std::__valarray_copy_construct(_M_data + _M_size + __n,
991 _M_data + _M_size, __tmp_M_data);
992 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
996 __ret._M_size = _M_size;
997 __ret._M_data = __tmp_M_data;
1008 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
1011 std::__valarray_release_memory(_M_data);
1013 _M_data = __valarray_get_storage<_Tp>(__n);
1015 std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
1018 template<
typename _Tp>
1022 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
1026 template<
typename _Tp>
1030 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
1035 inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
1038 typedef _ValFunClos<_ValArray, _Tp> _Closure;
1039 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
1043 inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
1046 typedef _RefFunClos<_ValArray, _Tp> _Closure;
1047 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
1050 #define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \
1051 template<typename _Tp> \
1052 inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \
1053 valarray<_Tp>::operator _Op() const \
1055 typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \
1056 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1057 return _Expr<_Closure, _Rt>(_Closure(*this)); \
1060 _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
1061 _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
1062 _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
1063 _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
1065 #undef _DEFINE_VALARRAY_UNARY_OPERATOR
1067 #define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \
1068 template<class _Tp> \
1069 inline valarray<_Tp>& \
1070 valarray<_Tp>::operator _Op##=(const _Tp &__t) \
1072 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \
1076 template<class _Tp> \
1077 inline valarray<_Tp>& \
1078 valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \
1080 _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size); \
1081 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \
1082 _Array<_Tp>(__v._M_data)); \
1086 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus)
1087 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus)
1088 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies)
1089 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides)
1090 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus)
1091 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1092 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1093 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1094 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1095 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1097 #undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
1099 #define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \
1100 template<class _Tp> template<class _Dom> \
1101 inline valarray<_Tp>& \
1102 valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \
1104 _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \
1108 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus)
1109 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus)
1110 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies)
1111 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides)
1112 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus)
1113 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1114 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1115 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1116 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1117 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1119 #undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
1122 #define _DEFINE_BINARY_OPERATOR(_Op, _Name) \
1123 template<typename _Tp> \
1124 inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \
1125 typename __fun<_Name, _Tp>::result_type> \
1126 operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \
1128 _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size()); \
1129 typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \
1130 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1131 return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \
1134 template<typename _Tp> \
1135 inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \
1136 typename __fun<_Name, _Tp>::result_type> \
1137 operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \
1139 typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \
1140 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1141 return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \
1144 template<typename _Tp> \
1145 inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \
1146 typename __fun<_Name, _Tp>::result_type> \
1147 operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \
1149 typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \
1150 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1151 return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \
1154 _DEFINE_BINARY_OPERATOR(+, __plus)
1155 _DEFINE_BINARY_OPERATOR(-, __minus)
1156 _DEFINE_BINARY_OPERATOR(*, __multiplies)
1157 _DEFINE_BINARY_OPERATOR(/, __divides)
1158 _DEFINE_BINARY_OPERATOR(%, __modulus)
1159 _DEFINE_BINARY_OPERATOR(^, __bitwise_xor)
1160 _DEFINE_BINARY_OPERATOR(&, __bitwise_and)
1161 _DEFINE_BINARY_OPERATOR(|, __bitwise_or)
1162 _DEFINE_BINARY_OPERATOR(<<, __shift_left)
1163 _DEFINE_BINARY_OPERATOR(>>, __shift_right)
1164 _DEFINE_BINARY_OPERATOR(&&, __logical_and)
1165 _DEFINE_BINARY_OPERATOR(||, __logical_or)
1166 _DEFINE_BINARY_OPERATOR(==, __equal_to)
1167 _DEFINE_BINARY_OPERATOR(!=, __not_equal_to)
1168 _DEFINE_BINARY_OPERATOR(<, __less)
1169 _DEFINE_BINARY_OPERATOR(>, __greater)
1170 _DEFINE_BINARY_OPERATOR(<=, __less_equal)
1171 _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
1173 #undef _DEFINE_BINARY_OPERATOR
1175 #if __cplusplus >= 201103L
1219 _GLIBCXX_END_NAMESPACE_VERSION