33 #ifndef _GLIBCXX_VALARRAY
34 #define _GLIBCXX_VALARRAY 1
36 #pragma GCC system_header
45 _GLIBCXX_BEGIN_NAMESPACE(std)
47 template<class _Clos, typename _Tp>
50 template<typename _Tp1, typename _Tp2>
53 template<class _Oper, template<class, class> class _Meta, class _Dom>
57 template<class, class> class _Meta1,
58 template<class, class> class _Meta2,
59 class _Dom1, class _Dom2>
62 template<template<class, class> class _Meta, class _Dom>
65 template<template<class, class> class _Meta, class _Dom>
68 template<template<class, class> class _Meta, class _Dom>
71 template<template<class, class> class _Meta, class _Dom>
74 template<template<class, class> class _Meta, class _Dom>
85 _GLIBCXX_END_NAMESPACE
87 #include <bits/valarray_array.h>
90 _GLIBCXX_BEGIN_NAMESPACE(std)
117 typedef typename __fun<_Op, _Tp>::result_type __rt;
118 typedef _Expr<_UnClos<_Op, _ValArray, _Tp>, __rt> _Rt;
121 typedef _Tp value_type;
128 explicit valarray(
size_t);
131 valarray(
const _Tp&,
size_t);
134 valarray(
const _Tp* __restrict__,
size_t);
137 valarray(
const valarray&);
151 #ifdef __GXX_EXPERIMENTAL_CXX0X__
157 valarray(
const _Expr<_Dom, _Tp>& __e);
221 #ifdef __GXX_EXPERIMENTAL_CXX0X__
234 operator= (
const _Expr<_Dom, _Tp>&);
243 _Tp& operator[](
size_t);
247 const _Tp& operator[](
size_t)
const;
260 _Expr<_SClos<_ValArray, _Tp>, _Tp> operator[](slice)
const;
283 _Expr<_GClos<_ValArray, _Tp>, _Tp> operator[](
const gslice&)
const;
336 _Expr<_IClos<_ValArray, _Tp>, _Tp>
355 typename _UnaryOp<__unary_plus>::_Rt operator+()
const;
358 typename _UnaryOp<__negate>::_Rt operator-()
const;
361 typename _UnaryOp<__bitwise_not>::_Rt operator~()
const;
364 typename _UnaryOp<__logical_not>::_Rt operator!()
const;
510 _Expr<_ValFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(_Tp))
const;
522 _Expr<_RefFunClos<_ValArray, _Tp>, _Tp> apply(_Tp func(
const _Tp&))
const;
533 void resize(
size_t __size, _Tp __c = _Tp());
537 _Tp* __restrict__ _M_data;
539 friend class _Array<_Tp>;
542 template<
typename _Tp>
546 __glibcxx_requires_subscript(__i);
550 template<
typename _Tp>
554 __glibcxx_requires_subscript(__i);
560 _GLIBCXX_END_NAMESPACE
569 _GLIBCXX_BEGIN_NAMESPACE(std)
576 template<typename _Tp>
578 valarray<_Tp>::valarray() : _M_size(0), _M_data(0) {}
580 template<
typename _Tp>
583 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
584 { std::__valarray_default_construct(_M_data, _M_data + __n); }
586 template<
typename _Tp>
589 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
590 { std::__valarray_fill_construct(_M_data, _M_data + __n, __t); }
592 template<
typename _Tp>
595 : _M_size(__n), _M_data(__valarray_get_storage<_Tp>(__n))
597 _GLIBCXX_DEBUG_ASSERT(__p != 0 || __n == 0);
598 std::__valarray_copy_construct(__p, __p + __n, _M_data);
601 template<
typename _Tp>
604 : _M_size(__v._M_size), _M_data(__valarray_get_storage<_Tp>(__v._M_size))
605 { std::__valarray_copy_construct(__v._M_data, __v._M_data + _M_size,
608 template<
typename _Tp>
611 : _M_size(__sa._M_sz), _M_data(__valarray_get_storage<_Tp>(__sa._M_sz))
613 std::__valarray_copy_construct
614 (__sa._M_array, __sa._M_sz, __sa._M_stride, _Array<_Tp>(_M_data));
617 template<
typename _Tp>
620 : _M_size(__ga._M_index.size()),
621 _M_data(__valarray_get_storage<_Tp>(_M_size))
623 std::__valarray_copy_construct
624 (__ga._M_array, _Array<size_t>(__ga._M_index),
625 _Array<_Tp>(_M_data), _M_size);
628 template<
typename _Tp>
631 : _M_size(__ma._M_sz), _M_data(__valarray_get_storage<_Tp>(__ma._M_sz))
633 std::__valarray_copy_construct
634 (__ma._M_array, __ma._M_mask, _Array<_Tp>(_M_data), _M_size);
637 template<
typename _Tp>
640 : _M_size(__ia._M_sz), _M_data(__valarray_get_storage<_Tp>(__ia._M_sz))
642 std::__valarray_copy_construct
643 (__ia._M_array, __ia._M_index, _Array<_Tp>(_M_data), _M_size);
646 #ifdef __GXX_EXPERIMENTAL_CXX0X__
647 template<
typename _Tp>
650 : _M_size(__l.size()), _M_data(__valarray_get_storage<_Tp>(__l.size()))
651 { std::__valarray_copy_construct (__l.begin(), __l.end(), _M_data); }
654 template<
typename _Tp>
template<
class _Dom>
657 : _M_size(__e.size()), _M_data(__valarray_get_storage<_Tp>(_M_size))
658 { std::__valarray_copy_construct(__e, _M_size, _Array<_Tp>(_M_data)); }
660 template<
typename _Tp>
662 valarray<_Tp>::~valarray()
664 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
665 std::__valarray_release_memory(_M_data);
668 template<
typename _Tp>
669 inline valarray<_Tp>&
672 _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size);
673 std::__valarray_copy(__v._M_data, _M_size, _M_data);
677 #ifdef __GXX_EXPERIMENTAL_CXX0X__
678 template<
typename _Tp>
682 _GLIBCXX_DEBUG_ASSERT(_M_size == __l.size());
683 std::__valarray_copy(__l.begin(), __l.size(), _M_data);
688 template<
typename _Tp>
692 std::__valarray_fill(_M_data, _M_size, __t);
696 template<
typename _Tp>
700 _GLIBCXX_DEBUG_ASSERT(_M_size == __sa._M_sz);
701 std::__valarray_copy(__sa._M_array, __sa._M_sz,
702 __sa._M_stride, _Array<_Tp>(_M_data));
706 template<
typename _Tp>
710 _GLIBCXX_DEBUG_ASSERT(_M_size == __ga._M_index.
size());
711 std::__valarray_copy(__ga._M_array, _Array<size_t>(__ga._M_index),
712 _Array<_Tp>(_M_data), _M_size);
716 template<
typename _Tp>
720 _GLIBCXX_DEBUG_ASSERT(_M_size == __ma._M_sz);
721 std::__valarray_copy(__ma._M_array, __ma._M_mask,
722 _Array<_Tp>(_M_data), _M_size);
726 template<
typename _Tp>
730 _GLIBCXX_DEBUG_ASSERT(_M_size == __ia._M_sz);
731 std::__valarray_copy(__ia._M_array, __ia._M_index,
732 _Array<_Tp>(_M_data), _M_size);
736 template<
typename _Tp>
template<
class _Dom>
740 _GLIBCXX_DEBUG_ASSERT(_M_size == __e.size());
741 std::__valarray_copy(__e, _M_size, _Array<_Tp>(_M_data));
745 template<
typename _Tp>
746 inline _Expr<_SClos<_ValArray,_Tp>, _Tp>
749 typedef _SClos<_ValArray,_Tp> _Closure;
750 return _Expr<_Closure, _Tp>(_Closure (_Array<_Tp>(_M_data), __s));
753 template<
typename _Tp>
758 template<
typename _Tp>
759 inline _Expr<_GClos<_ValArray,_Tp>, _Tp>
762 typedef _GClos<_ValArray,_Tp> _Closure;
763 return _Expr<_Closure, _Tp>
764 (_Closure(_Array<_Tp>(_M_data), __gs._M_index->_M_index));
767 template<
typename _Tp>
772 (_Array<_Tp>(_M_data), __gs._M_index->_M_index);
775 template<
typename _Tp>
780 size_t __e = __m.
size();
781 for (
size_t __i=0; __i<__e; ++__i)
784 _Array<bool> (__m)));
787 template<
typename _Tp>
792 size_t __e = __m.
size();
793 for (
size_t __i=0; __i<__e; ++__i)
798 template<
typename _Tp>
799 inline _Expr<_IClos<_ValArray,_Tp>, _Tp>
802 typedef _IClos<_ValArray,_Tp> _Closure;
803 return _Expr<_Closure, _Tp>(_Closure(*
this, __i));
806 template<
typename _Tp>
811 _Array<size_t>(__i));
823 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
824 return std::__valarray_sum(_M_data, _M_data + _M_size);
836 _Tp* __restrict__ __tmp_M_data =
837 std::__valarray_get_storage<_Tp>(_M_size);
840 std::__valarray_copy_construct(_M_data,
841 _M_data + _M_size, __tmp_M_data);
844 if (
size_t(__n) > _M_size)
847 std::__valarray_copy_construct(_M_data + __n,
848 _M_data + _M_size, __tmp_M_data);
849 std::__valarray_default_construct(__tmp_M_data + _M_size - __n,
850 __tmp_M_data + _M_size);
854 if (-
size_t(__n) > _M_size)
857 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
859 std::__valarray_default_construct(__tmp_M_data,
863 __ret._M_size = _M_size;
864 __ret._M_data = __tmp_M_data;
877 _Tp* __restrict__ __tmp_M_data =
878 std::__valarray_get_storage<_Tp>(_M_size);
881 std::__valarray_copy_construct(_M_data,
882 _M_data + _M_size, __tmp_M_data);
885 if (
size_t(__n) > _M_size)
886 __n = int(__n % _M_size);
888 std::__valarray_copy_construct(_M_data, _M_data + __n,
889 __tmp_M_data + _M_size - __n);
890 std::__valarray_copy_construct(_M_data + __n, _M_data + _M_size,
895 if (-
size_t(__n) > _M_size)
896 __n = -int(-
size_t(__n) % _M_size);
898 std::__valarray_copy_construct(_M_data + _M_size + __n,
899 _M_data + _M_size, __tmp_M_data);
900 std::__valarray_copy_construct(_M_data, _M_data + _M_size + __n,
904 __ret._M_size = _M_size;
905 __ret._M_data = __tmp_M_data;
916 std::__valarray_destroy_elements(_M_data, _M_data + _M_size);
919 std::__valarray_release_memory(_M_data);
921 _M_data = __valarray_get_storage<_Tp>(__n);
923 std::__valarray_fill_construct(_M_data, _M_data + __n, __c);
926 template<
typename _Tp>
930 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
934 template<
typename _Tp>
938 _GLIBCXX_DEBUG_ASSERT(_M_size > 0);
943 inline _Expr<_ValFunClos<_ValArray, _Tp>, _Tp>
946 typedef _ValFunClos<_ValArray, _Tp> _Closure;
947 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
951 inline _Expr<_RefFunClos<_ValArray, _Tp>, _Tp>
954 typedef _RefFunClos<_ValArray, _Tp> _Closure;
955 return _Expr<_Closure, _Tp>(_Closure(*
this, func));
958 #define _DEFINE_VALARRAY_UNARY_OPERATOR(_Op, _Name) \
959 template<typename _Tp> \
960 inline typename valarray<_Tp>::template _UnaryOp<_Name>::_Rt \
961 valarray<_Tp>::operator _Op() const \
963 typedef _UnClos<_Name, _ValArray, _Tp> _Closure; \
964 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
965 return _Expr<_Closure, _Rt>(_Closure(*this)); \
968 _DEFINE_VALARRAY_UNARY_OPERATOR(+, __unary_plus)
969 _DEFINE_VALARRAY_UNARY_OPERATOR(-, __negate)
970 _DEFINE_VALARRAY_UNARY_OPERATOR(~, __bitwise_not)
971 _DEFINE_VALARRAY_UNARY_OPERATOR (!, __logical_not)
973 #undef _DEFINE_VALARRAY_UNARY_OPERATOR
975 #define _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(_Op, _Name) \
976 template<class _Tp> \
977 inline valarray<_Tp>& \
978 valarray<_Tp>::operator _Op##=(const _Tp &__t) \
980 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, __t); \
984 template<class _Tp> \
985 inline valarray<_Tp>& \
986 valarray<_Tp>::operator _Op##=(const valarray<_Tp> &__v) \
988 _GLIBCXX_DEBUG_ASSERT(_M_size == __v._M_size); \
989 _Array_augmented_##_Name(_Array<_Tp>(_M_data), _M_size, \
990 _Array<_Tp>(__v._M_data)); \
994 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(+, __plus)
995 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(-, __minus)
996 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(*, __multiplies)
997 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(/, __divides)
998 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(%, __modulus)
999 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1000 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1001 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1002 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1003 _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1005 #undef _DEFINE_VALARRAY_AUGMENTED_ASSIGNMENT
1007 #define _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(_Op, _Name) \
1008 template<class _Tp> template<class _Dom> \
1009 inline valarray<_Tp>& \
1010 valarray<_Tp>::operator _Op##=(const _Expr<_Dom, _Tp>& __e) \
1012 _Array_augmented_##_Name(_Array<_Tp>(_M_data), __e, _M_size); \
1016 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(+, __plus)
1017 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(-, __minus)
1018 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(*, __multiplies)
1019 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(/, __divides)
1020 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(%, __modulus)
1021 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(^, __bitwise_xor)
1022 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(&, __bitwise_and)
1023 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(|, __bitwise_or)
1024 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(<<, __shift_left)
1025 _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT(>>, __shift_right)
1027 #undef _DEFINE_VALARRAY_EXPR_AUGMENTED_ASSIGNMENT
1030 #define _DEFINE_BINARY_OPERATOR(_Op, _Name) \
1031 template<typename _Tp> \
1032 inline _Expr<_BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp>, \
1033 typename __fun<_Name, _Tp>::result_type> \
1034 operator _Op(const valarray<_Tp>& __v, const valarray<_Tp>& __w) \
1036 _GLIBCXX_DEBUG_ASSERT(__v.size() == __w.size()); \
1037 typedef _BinClos<_Name, _ValArray, _ValArray, _Tp, _Tp> _Closure; \
1038 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1039 return _Expr<_Closure, _Rt>(_Closure(__v, __w)); \
1042 template<typename _Tp> \
1043 inline _Expr<_BinClos<_Name, _ValArray,_Constant, _Tp, _Tp>, \
1044 typename __fun<_Name, _Tp>::result_type> \
1045 operator _Op(const valarray<_Tp>& __v, const _Tp& __t) \
1047 typedef _BinClos<_Name, _ValArray, _Constant, _Tp, _Tp> _Closure; \
1048 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1049 return _Expr<_Closure, _Rt>(_Closure(__v, __t)); \
1052 template<typename _Tp> \
1053 inline _Expr<_BinClos<_Name, _Constant, _ValArray, _Tp, _Tp>, \
1054 typename __fun<_Name, _Tp>::result_type> \
1055 operator _Op(const _Tp& __t, const valarray<_Tp>& __v) \
1057 typedef _BinClos<_Name, _Constant, _ValArray, _Tp, _Tp> _Closure; \
1058 typedef typename __fun<_Name, _Tp>::result_type _Rt; \
1059 return _Expr<_Closure, _Rt>(_Closure(__t, __v)); \
1062 _DEFINE_BINARY_OPERATOR(+, __plus)
1063 _DEFINE_BINARY_OPERATOR(-, __minus)
1064 _DEFINE_BINARY_OPERATOR(*, __multiplies)
1065 _DEFINE_BINARY_OPERATOR(/, __divides)
1066 _DEFINE_BINARY_OPERATOR(%, __modulus)
1067 _DEFINE_BINARY_OPERATOR(^, __bitwise_xor)
1068 _DEFINE_BINARY_OPERATOR(&, __bitwise_and)
1069 _DEFINE_BINARY_OPERATOR(|, __bitwise_or)
1070 _DEFINE_BINARY_OPERATOR(<<, __shift_left)
1071 _DEFINE_BINARY_OPERATOR(>>, __shift_right)
1072 _DEFINE_BINARY_OPERATOR(&&, __logical_and)
1073 _DEFINE_BINARY_OPERATOR(||, __logical_or)
1074 _DEFINE_BINARY_OPERATOR(==, __equal_to)
1075 _DEFINE_BINARY_OPERATOR(!=, __not_equal_to)
1076 _DEFINE_BINARY_OPERATOR(<, __less)
1077 _DEFINE_BINARY_OPERATOR(>, __greater)
1078 _DEFINE_BINARY_OPERATOR(<=, __less_equal)
1079 _DEFINE_BINARY_OPERATOR(>=, __greater_equal)
1081 #undef _DEFINE_BINARY_OPERATOR
1085 _GLIBCXX_END_NAMESPACE