Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
77 changes: 37 additions & 40 deletions stl/inc/valarray
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,7 @@ public:
}

valarray& operator=(const _Ty& _Val) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] = _Val;
}
Expand All @@ -192,7 +192,7 @@ public:
valarray& operator=(const indirect_array<_Ty>& _Indarr); // defined below

_NODISCARD valarray operator+() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = +_Myptr[_Idx];
Expand All @@ -201,7 +201,7 @@ public:
}

_NODISCARD valarray operator-() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = -_Myptr[_Idx];
Expand All @@ -210,7 +210,7 @@ public:
}

_NODISCARD valarray operator~() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = ~_Myptr[_Idx];
Expand All @@ -219,7 +219,7 @@ public:
}

_NODISCARD _Boolarray operator!() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<bool> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = !_Myptr[_Idx];
Expand All @@ -228,159 +228,159 @@ public:
}

valarray& operator*=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] *= _Right;
}
return *this;
}

valarray& operator/=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] /= _Right;
}
return *this;
}

valarray& operator%=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] %= _Right;
}
return *this;
}

valarray& operator+=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] += _Right;
}
return *this;
}

valarray& operator-=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] -= _Right;
}
return *this;
}

valarray& operator^=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] ^= _Right;
}
return *this;
}

valarray& operator&=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] &= _Right;
}
return *this;
}

valarray& operator|=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] |= _Right;
}
return *this;
}

valarray& operator<<=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] <<= _Right;
}
return *this;
}

valarray& operator>>=(const _Ty& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] >>= _Right;
}
return *this;
}

valarray& operator*=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] *= _Right[_Idx];
}
return *this;
}

valarray& operator/=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] /= _Right[_Idx];
}
return *this;
}

valarray& operator%=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] %= _Right[_Idx];
}
return *this;
}

valarray& operator+=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] += _Right[_Idx];
}
return *this;
}

valarray& operator-=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] -= _Right[_Idx];
}
return *this;
}

valarray& operator^=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] ^= _Right[_Idx];
}
return *this;
}

valarray& operator|=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] |= _Right[_Idx];
}
return *this;
}

valarray& operator&=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] &= _Right[_Idx];
}
return *this;
}

valarray& operator<<=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] <<= _Right[_Idx];
}
return *this;
}

valarray& operator>>=(const valarray& _Right) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] >>= _Right[_Idx];
}
Expand Down Expand Up @@ -424,7 +424,7 @@ public:
_NODISCARD indirect_array<_Ty> operator[](const _Sizarray& _Indarr); // defined below

_NODISCARD _Ty sum() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
_Ty _Sum = _Myptr[0];
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
_Sum += _Myptr[_Idx];
Expand All @@ -434,7 +434,7 @@ public:
}

_NODISCARD _Ty(min)() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
_Ty _Min = _Myptr[0];
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
if (_Myptr[_Idx] < _Min) {
Expand All @@ -446,7 +446,7 @@ public:
}

_NODISCARD _Ty(max)() const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
_Ty _Max = _Myptr[0];
for (size_t _Idx = 1; _Idx < _Size; ++_Idx) {
if (_Max < _Myptr[_Idx]) {
Expand All @@ -458,7 +458,7 @@ public:
}

_NODISCARD valarray shift(int _Count) const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
size_t _Min = 0;
size_t _Max = _Size;
Expand All @@ -480,7 +480,7 @@ public:
}

_NODISCARD valarray cshift(int _Count) const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
if (_Size != 0) {
if (_Count < 0) { // right shift
if (_Size < size_t{0} - _Count) {
Expand All @@ -502,7 +502,7 @@ public:
}

_NODISCARD valarray apply(_Ty _Func(_Ty)) const {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = _Func(_Myptr[_Idx]);
Expand All @@ -512,7 +512,7 @@ public:

_NODISCARD valarray apply(_Ty _Func(const _Ty&)) const {
// return valarray transformed by _Func, nonmutable argument
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
valarray<_Ty> _Ans(_Size);
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Ans[_Idx] = _Func(_Myptr[_Idx]);
Expand Down Expand Up @@ -555,10 +555,7 @@ private:

void _Tidy_deallocate() noexcept {
if (_Myptr) { // destroy elements
for (size_t _Idx = 0; _Idx < _Mysize; ++_Idx) {
_Destroy_in_place(_Myptr[_Idx]);
}

_Destroy_range(_Myptr, _Myptr + _Mysize);
#ifdef __cpp_aligned_new
constexpr bool _Extended_alignment = alignof(_Ty) > __STDCPP_DEFAULT_NEW_ALIGNMENT__;
if constexpr (_Extended_alignment) {
Expand All @@ -574,7 +571,7 @@ private:
}

void _Assign(size_t _Newsize, const _Ty* _Ptr) {
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
if (_Size == _Newsize) {
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] = _Ptr[_Idx];
Expand Down Expand Up @@ -1988,7 +1985,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const gslice_array<_Ty>& _Gslicearr) {
_Tidy_deallocate();
_Grow(_Gslicearr._Totlen());
_Sizarray _Indexarray(size_t{0}, _Gslicearr._Nslice());
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] = _Gslicearr._Data(_Gslicearr._Off(_Indexarray));
}
Expand All @@ -2011,7 +2008,7 @@ valarray<_Ty>& valarray<_Ty>::operator=(const mask_array<_Ty>& _Maskarr) {
_Grow(_Maskarr._Totlen());
size_t _Count = 0;

const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Count) {
if (_Maskarr._Mask(_Count)) {
_Myptr[_Idx++] = _Maskarr._Data(_Count);
Expand All @@ -2035,7 +2032,7 @@ template <class _Ty>
valarray<_Ty>& valarray<_Ty>::operator=(const indirect_array<_Ty>& _Indarr) {
_Tidy_deallocate();
_Grow(_Indarr._Totlen());
const size_t _Size = size();
const size_t _Size = _Mysize; // eliminating indirection helps vectorization
for (size_t _Idx = 0; _Idx < _Size; ++_Idx) {
_Myptr[_Idx] = _Indarr._Data(_Indarr._Indir(_Idx));
}
Expand Down