/
alt_math_vec.inc
48 lines (38 loc) · 1.73 KB
/
alt_math_vec.inc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
template<class T>
struct ALT_VTYPE {
typedef T value_type;
typedef ALT_VTYPE<T> alt_vector_type;
static constexpr size_t size = ALT_VSIZE;
union {
T data[ALT_VSIZE];
ALT_VDATA
};
constexpr size_t count(){ return size; };
constexpr size_t len(){ return size; };
T& operator[](size_t i) { return data[i]; }
const T& operator[](size_t i) const { return data[i]; }
const T* begin(){ return data; }
const T* end(){ return data + size; }
inline bool operator==(const ALT_VTYPE& o) const {
return memcmp(data, o.data, sizeof(data)) == 0;
}
inline bool operator!=(const ALT_VTYPE& o) const {
return memcmp(data, o.data, sizeof(data)) != 0;
}
inline ALT_VTYPE& operator+=(const ALT_VTYPE& v){
for(size_t i=0;i<size;++i) data[i]+=v[i]; return *this;
}
inline ALT_VTYPE& operator-=(const ALT_VTYPE& v){
for(size_t i=0;i<size;++i) data[i]-=v[i]; return *this;
}
inline ALT_VTYPE& operator+=(T s){ for(size_t i=0;i<size;++i) data[i]+=s; return *this; }
inline ALT_VTYPE& operator-=(T s){ for(size_t i=0;i<size;++i) data[i]+=s; return *this; }
inline ALT_VTYPE& operator*=(T s){ for(size_t i=0;i<size;++i) data[i]*=s; return *this; }
inline ALT_VTYPE& operator/=(T s){ for(size_t i=0;i<size;++i) data[i]/=s; return *this; }
inline friend ALT_VTYPE operator+(ALT_VTYPE v1, const ALT_VTYPE& v2){ v1 += v2; return v1; }
inline friend ALT_VTYPE operator-(ALT_VTYPE v1, const ALT_VTYPE& v2){ v1 -= v2; return v1; }
inline friend ALT_VTYPE operator+(ALT_VTYPE v, T s){ v += s; return v; }
inline friend ALT_VTYPE operator-(ALT_VTYPE v, T s){ v -= s; return v; }
inline friend ALT_VTYPE operator*(ALT_VTYPE v, T s){ v *= s; return v; }
inline friend ALT_VTYPE operator/(ALT_VTYPE v, T s){ v /= s; return v; }
};