@@ -7,20 +7,26 @@ namespace librapid {
7
7
template <typename Scalar, i64 Dims, typename StorageType>
8
8
class VecImpl {
9
9
public:
10
- using Mask = Vc::Mask<Scalar, struct Vc ::simd_abi::fixed_size<Dims>>;
11
-
12
10
VecImpl () = default ;
13
11
14
12
explicit VecImpl (const StorageType &arr) : m_data {arr} {}
15
13
16
14
template <typename T, typename ABI>
17
15
explicit VecImpl (const Vc::Vector<T, ABI> &arr) : m_data {arr} {}
18
16
19
- template <typename ... Args>
17
+ template <typename ... Args, typename std:: enable_if_t < sizeof ...(Args) == Dims, int > = 0 >
20
18
VecImpl (Args... args) : m_data {static_cast <Scalar>(args)...} {
21
19
static_assert (sizeof ...(Args) <= Dims, " Invalid number of arguments" );
22
20
}
23
21
22
+ template <typename ... Args, i64 size = sizeof ...(Args),
23
+ typename std::enable_if_t <size != Dims, int > = 0 >
24
+ VecImpl (Args... args) {
25
+ static_assert (sizeof ...(Args) <= Dims, " Invalid number of arguments" );
26
+ const Scalar expanded[] = {static_cast <Scalar>(args)...};
27
+ for (i64 i = 0 ; i < size; i++) { m_data[i] = expanded[i]; }
28
+ }
29
+
24
30
VecImpl (const VecImpl &other) = default ;
25
31
VecImpl (VecImpl &&other) noexcept = default ;
26
32
VecImpl &operator =(const VecImpl &other) = default ;
@@ -76,32 +82,86 @@ namespace librapid {
76
82
}
77
83
78
84
LR_FORCE_INLINE
79
- VecImpl<Scalar, Dims, Mask> operator >(const VecImpl &other) {
80
- return VecImpl<Scalar, Dims, Mask>(m_data > other.m_data );
81
- }
82
-
83
- LR_FORCE_INLINE
84
- VecImpl<Scalar, Dims, Mask> operator <(const VecImpl &other) {
85
- return VecImpl<Scalar, Dims, Mask>(m_data < other.m_data );
86
- }
87
-
88
- LR_FORCE_INLINE
89
- VecImpl<Scalar, Dims, Mask> operator >=(const VecImpl &other) {
90
- return VecImpl<Scalar, Dims, Mask>(m_data >= other.m_data );
85
+ VecImpl operator >(const VecImpl &other) {
86
+ VecImpl res (*this );
87
+ for (i64 i = 0 ; i < Dims; ++i) {
88
+ if (res[i] > other[i]) {
89
+ res[i] = 1 ;
90
+ } else {
91
+ res[i] = 0 ;
92
+ }
93
+ }
94
+ return res;
91
95
}
92
96
93
97
LR_FORCE_INLINE
94
- VecImpl<Scalar, Dims, Mask> operator <=(const VecImpl &other) {
95
- return VecImpl<Scalar, Dims, Mask>(m_data <= other.m_data );
96
- }
98
+ VecImpl cmp (const VecImpl &other, char mode[2 ]) {
99
+ // Mode:
100
+ // 0: ==
101
+ // 1: !=
102
+ // 2: <
103
+ // 3: <=
104
+ // 4: >
105
+ // 5: >=
97
106
98
- LR_FORCE_INLINE
99
- VecImpl<Scalar, Dims, Mask> operator ==(const VecImpl &other) {
100
- return VecImpl<Scalar, Dims, Mask>(m_data == other.m_data );
107
+ VecImpl res (*this );
108
+ i16 modeInt = (mode[1 ] << 8 ) | mode[0 ];
109
+ for (i64 i = 0 ; i < Dims; ++i) {
110
+ switch (modeInt) {
111
+ case (' e' << 8 ) | ' q' :
112
+ if (res[i] == other[i]) {
113
+ res[i] = 1 ;
114
+ } else {
115
+ res[i] = 0 ;
116
+ }
117
+ break ;
118
+ case (' n' << 8 ) | ' e' :
119
+ if (res[i] != other[i]) {
120
+ res[i] = 1 ;
121
+ } else {
122
+ res[i] = 0 ;
123
+ }
124
+ break ;
125
+ case (' l' << 8 ) | ' t' :
126
+ if (res[i] < other[i]) {
127
+ res[i] = 1 ;
128
+ } else {
129
+ res[i] = 0 ;
130
+ }
131
+ break ;
132
+ case (' l' << 8 ) | ' e' :
133
+ if (res[i] <= other[i]) {
134
+ res[i] = 1 ;
135
+ } else {
136
+ res[i] = 0 ;
137
+ }
138
+ break ;
139
+ case (' g' << 8 ) | ' t' :
140
+ if (res[i] > other[i]) {
141
+ res[i] = 1 ;
142
+ } else {
143
+ res[i] = 0 ;
144
+ }
145
+ break ;
146
+ case (' g' << 8 ) | ' e' :
147
+ if (res[i] >= other[i]) {
148
+ res[i] = 1 ;
149
+ } else {
150
+ res[i] = 0 ;
151
+ }
152
+ break ;
153
+ default : LR_ASSERT (false , " Invalid mode {}" , mode);
154
+ }
155
+ }
156
+ return res;
101
157
}
102
158
103
- LR_FORCE_INLINE
104
- VecImpl<Scalar, Dims, Mask> operator !=(const VecImpl &other) { return !(*this == other); }
159
+ LR_FORCE_INLINE VecImpl operator <(const VecImpl &other) const { return cmp (other, " lt" ); }
160
+ LR_FORCE_INLINE VecImpl operator <=(const VecImpl &other) const { return cmp (other, " le" ); }
161
+ LR_FORCE_INLINE VecImpl operator >(const VecImpl &other) const { return cmp (other, " gt" ); }
162
+ LR_FORCE_INLINE VecImpl operator >=(const VecImpl &other) const { return cmp (other, " ge" ); }
163
+ LR_FORCE_INLINE VecImpl operator ==(const VecImpl &other) const { return cmp (other, " eq" ); }
164
+ LR_FORCE_INLINE VecImpl operator !=(const VecImpl &other) const { return cmp (other, " ne" ); }
105
165
106
166
LR_NODISCARD (" " ) LR_INLINE Scalar mag2 () const { return (m_data * m_data).sum (); }
107
167
LR_NODISCARD (" " ) LR_INLINE Scalar mag () const { return ::librapid::sqrt (mag2 ()); }
@@ -132,12 +192,34 @@ namespace librapid {
132
192
133
193
LR_FORCE_INLINE Vec<Scalar, 2 > xy () const { return {x (), y ()}; }
134
194
LR_FORCE_INLINE Vec<Scalar, 2 > yx () const { return {y (), x ()}; }
195
+ LR_FORCE_INLINE Vec<Scalar, 2 > xz () const { return {x (), z ()}; }
196
+ LR_FORCE_INLINE Vec<Scalar, 2 > zx () const { return {z (), x ()}; }
197
+ LR_FORCE_INLINE Vec<Scalar, 2 > yz () const { return {y (), z ()}; }
198
+ LR_FORCE_INLINE Vec<Scalar, 2 > zy () const { return {z (), y ()}; }
135
199
LR_FORCE_INLINE Vec<Scalar, 3 > xyz () const { return {x (), y (), z ()}; }
136
200
LR_FORCE_INLINE Vec<Scalar, 3 > xzy () const { return {x (), z (), y ()}; }
137
201
LR_FORCE_INLINE Vec<Scalar, 3 > yxz () const { return {y (), x (), z ()}; }
138
202
LR_FORCE_INLINE Vec<Scalar, 3 > yzx () const { return {y (), z (), x ()}; }
139
203
LR_FORCE_INLINE Vec<Scalar, 3 > zxy () const { return {z (), x (), y ()}; }
140
204
LR_FORCE_INLINE Vec<Scalar, 3 > zyx () const { return {z (), y (), x ()}; }
205
+ LR_FORCE_INLINE Vec<Scalar, 3 > xyw () const { return {x (), y (), w ()}; }
206
+ LR_FORCE_INLINE Vec<Scalar, 3 > xwy () const { return {x (), w (), y ()}; }
207
+ LR_FORCE_INLINE Vec<Scalar, 3 > yxw () const { return {y (), x (), w ()}; }
208
+ LR_FORCE_INLINE Vec<Scalar, 3 > ywx () const { return {y (), w (), x ()}; }
209
+ LR_FORCE_INLINE Vec<Scalar, 3 > wxy () const { return {w (), x (), y ()}; }
210
+ LR_FORCE_INLINE Vec<Scalar, 3 > wyx () const { return {w (), y (), x ()}; }
211
+ LR_FORCE_INLINE Vec<Scalar, 3 > xzw () const { return {x (), z (), w ()}; }
212
+ LR_FORCE_INLINE Vec<Scalar, 3 > xwz () const { return {x (), w (), z ()}; }
213
+ LR_FORCE_INLINE Vec<Scalar, 3 > zxw () const { return {z (), x (), w ()}; }
214
+ LR_FORCE_INLINE Vec<Scalar, 3 > zwx () const { return {z (), w (), x ()}; }
215
+ LR_FORCE_INLINE Vec<Scalar, 3 > wxz () const { return {w (), x (), z ()}; }
216
+ LR_FORCE_INLINE Vec<Scalar, 3 > wzx () const { return {w (), z (), x ()}; }
217
+ LR_FORCE_INLINE Vec<Scalar, 3 > yzw () const { return {y (), z (), w ()}; }
218
+ LR_FORCE_INLINE Vec<Scalar, 3 > ywz () const { return {y (), w (), z ()}; }
219
+ LR_FORCE_INLINE Vec<Scalar, 3 > zyw () const { return {z (), y (), w ()}; }
220
+ LR_FORCE_INLINE Vec<Scalar, 3 > zwy () const { return {z (), w (), y ()}; }
221
+ LR_FORCE_INLINE Vec<Scalar, 3 > wyz () const { return {w (), y (), z ()}; }
222
+ LR_FORCE_INLINE Vec<Scalar, 3 > wzy () const { return {w (), z (), y ()}; }
141
223
LR_FORCE_INLINE Vec<Scalar, 4 > xyzw () const { return {x (), y (), z (), w ()}; }
142
224
LR_FORCE_INLINE Vec<Scalar, 4 > xywz () const { return {x (), y (), w (), z ()}; }
143
225
LR_FORCE_INLINE Vec<Scalar, 4 > xzyw () const { return {x (), z (), y (), w ()}; }
0 commit comments