38 class TVectorS :
public VectorBase<size, T> {
41 static TVectorS<size, T>&
from(T*
data) {
return *
reinterpret_cast<TVectorS<size, T>*
>(&VectorBase<size, T>::from(
data)); }
44 static const TVectorS<size, T>&
from(
const T*
data) {
return *
reinterpret_cast<const TVectorS<size, T>*
>(&VectorBase<size, T>::from(
data)); }
47 template<std::
size_t otherSize>
constexpr static TVectorS<size, T>
pad(
const TVectorS<otherSize, T>& a, T value = T()) {
48 return (TVectorS<size, T>)VectorBase<size, T>::pad<otherSize>(a, value);
51 TVectorS() : VectorBase<size, T>() {}
53 TVectorS(
const TVectorS<size, T>&) =
default;
55 template<
class ...U,
class V =
typename std::enable_if<
sizeof...(U)+1 == size, T>::type>
constexpr TVectorS(T first, U... next) : VectorBase<size, T>(first, next...) {}
58 T*
data() {
return VectorBase<size, T>::data(); }
61 constexpr const T*
data()
const {
return VectorBase<size, T>::data(); }
63 T& operator[](std::size_t pos) {
return VectorBase<size, T>::operator[](pos); }
64 constexpr T operator[](std::size_t pos)
const {
return VectorBase<size, T>::operator[](pos); }
66 bool operator==(
const VectorBase<size, T>& other)
const {
return VectorBase<size, T>::operator==(other); }
68 bool operator!=(
const VectorBase<size, T>& other)
const {
return VectorBase<size, T>::operator!=(other); }
70 TVectorS<size, T>& operator+=(
const TVectorS<size, T>& other) {
71 TVectorS<size, T>::operator+=(other);
75 TVectorS<size, T> operator+(
const TVectorS<size, T>& other)
const {
return (TVectorS<size, T>)VectorBase<size, T>::operator+((VectorBase<size, T>)other); }
77 TVectorS<size, T>& operator-=(
const TVectorS<size, T>& other) {
78 TVectorS<size, T>::operator-=(other);
82 TVectorS<size, T> operator-(
const TVectorS<size, T>& other)
const {
return (TVectorS<size, T>)VectorBase<size, T>::operator-((VectorBase<size, T>)other); }
84 TVectorS<size, T>& operator*=(T scalar) {
85 TVectorS<size, T>::operator*=(scalar);
89 TVectorS<size, T> operator*(T scalar)
const {
return TVectorS<size, T>(VectorBase<size, T>::operator*(scalar)); }
91 TVectorS<size, T>& operator/=(T scalar) {
92 VectorBase<size, T>::operator/=(scalar);
96 TVectorS<size, T> operator/(T scalar)
const {
return TVectorS<size, T>(VectorBase<size, T>::operator/(scalar)); }
98 TVectorS<size, T>& operator*=(
const VectorBase<size, T>& other) {
99 VectorBase<size, T>::operator*=(other);
103 TVectorS<size, T> operator*(
const VectorBase<size, T>& other)
const {
return (TVectorS<size, T>)VectorBase<size, T>::operator*((VectorBase<size, T>)other); }
105 TVectorS<size, T>& operator/=(
const VectorBase<size, T>& other) {
106 VectorBase<size, T>::operator/=(other);
110 TVectorS<size, T> operator/(
const VectorBase<size, T>& other)
const {
111 return TVectorS<size, T>(VectorBase<size, T>::operator/(other));
115 T
dot()
const {
return VectorBase<size, T>::dot(); }
118 T
dot(
const TVectorS<size, T>& other)
const {
return Magnum::Math::dot(*
this, other); }
121 T
length()
const {
return VectorBase<size, T>::length(); }
124 template<
class U = T>
typename std::enable_if<std::is_floating_point<U>::value, T>::type
128 template<
class U = T>
typename std::enable_if<std::is_floating_point<U>::value, VectorBase<size, T>>::type
129 normalized()
const {
return VectorBase<size, T>::normalized(); }
132 template<
class U = T>
typename std::enable_if<std::is_floating_point<U>::value, VectorBase<size, T>>::type
136 template<
class U = T>
typename std::enable_if<std::is_floating_point<U>::value, VectorBase<size, T>>::type
137 projected(
const VectorBase<size, T>& line)
const {
return VectorBase<size, T>::projected(line); }
140 template<
class U = T>
typename std::enable_if<std::is_floating_point<U>::value, VectorBase<size, T>>::type
144 constexpr TVectorS<size, T>
flipped()
const {
return VectorBase<size, T>::flipped(); }
147 T
sum()
const {
return VectorBase<size, T>::sum(); }
150 T
product()
const {
return VectorBase<size, T>::product(); }
153 T
min()
const {
return VectorBase<size, T>::min(); }
156 T
max()
const {
return VectorBase<size, T>::max(); }
159 std::pair<T, T>
minmax()
const {
return VectorBase<size, T>::minmax(); }
162 for(
int i = 0; i < other.Size; ++i) this->_data[i] = other[i];
165 operator VectorBase<size, T>*() {
return static_cast<VectorBase<size, T>*
>(
this); }
167 operator VectorBase<size, T>&() {
return *
static_cast<VectorBase<size, T>*
>(
this); }
170 T __getitem__(std::size_t i) {
return this->operator[](i); }
171 void __setitem__(std::size_t i,
const T &val) { this->operator[](i) = val; }