25template<
typename T,
int Sz>
struct VecBase {};
27template<
typename T,
int Sz>
struct VecOp {
32 return *
reinterpret_cast<const T *
>(
this);
36 return *
reinterpret_cast<T *
>(
this);
40 template<typename U = T, typename std::enable_if_t<!std::is_same_v<bool, U>> * = nullptr>
71 template<typename U = T, \
72 typename std::enable_if_t<std::is_integral_v<U>> * = nullptr, \
73 typename std::enable_if_t<!std::is_same_v<bool, U>> * = nullptr>
130#define SWIZZLE_XY(T) \
131 SwizzleBase<T, 2> xx, xy, yx, yy; \
132 SwizzleBase<T, 3> xxx, xxy, xyx, xyy, yxx, yxy, yyx, yyy; \
133 SwizzleBase<T, 4> xxxx, xxxy, xxyx, xxyy, xyxx, xyxy, xyyx, xyyy, yxxx, yxxy, yxyx, yxyy, yyxx, \
136#define SWIZZLE_RG(T) \
137 SwizzleBase<T, 2> rr, rg, gr, gg; \
138 SwizzleBase<T, 3> rrr, rrg, rgr, rgg, grr, grg, ggr, ggg; \
139 SwizzleBase<T, 4> rrrr, rrrg, rrgr, rrgg, rgrr, rgrg, rggr, rggg, grrr, grrg, grgr, grgg, ggrr, \
142#define SWIZZLE_XYZ(T) \
144 SwizzleBase<T, 2> xz, yz, zx, zy, zz; \
145 SwizzleBase<T, 3> xxz, xyz, xzx, xzy, xzz, yxz, yyz, yzx, yzy, yzz, zxx, zxy, zxz, zyx, zyy, \
146 zyz, zzx, zzy, zzz; \
147 SwizzleBase<T, 4> xxxz, xxyz, xxzx, xxzy, xxzz, xyxz, xyyz, xyzx, xyzy, xyzz, xzxx, xzxy, xzxz, \
148 xzyx, xzyy, xzyz, xzzx, xzzy, xzzz, yxxz, yxyz, yxzx, yxzy, yxzz, yyxz, yyyz, yyzx, yyzy, \
149 yyzz, yzxx, yzxy, yzxz, yzyx, yzyy, yzyz, yzzx, yzzy, yzzz, zxxx, zxxy, zxxz, zxyx, zxyy, \
150 zxyz, zxzx, zxzy, zxzz, zyxx, zyxy, zyxz, zyyx, zyyy, zyyz, zyzx, zyzy, zyzz, zzxx, zzxy, \
151 zzxz, zzyx, zzyy, zzyz, zzzx, zzzy, zzzz;
153#define SWIZZLE_RGB(T) \
155 SwizzleBase<T, 2> rb, gb, br, bg, bb; \
156 SwizzleBase<T, 3> rrb, rgb, rbr, rbg, rbb, grb, ggb, gbr, gbg, gbb, brr, brg, brb, bgr, bgg, \
157 bgb, bbr, bbg, bbb; \
158 SwizzleBase<T, 4> rrrb, rrgb, rrbr, rrbg, rrbb, rgrb, rggb, rgbr, rgbg, rgbb, rbrr, rbrg, rbrb, \
159 rbgr, rbgg, rbgb, rbbr, rbbg, rbbb, grrb, grgb, grbr, grbg, grbb, ggrb, gggb, ggbr, ggbg, \
160 ggbb, gbrr, gbrg, gbrb, gbgr, gbgg, gbgb, gbbr, gbbg, gbbb, brrr, brrg, brrb, brgr, brgg, \
161 brgb, brbr, brbg, brbb, bgrr, bgrg, bgrb, bggr, bggg, bggb, bgbr, bgbg, bgbb, bbrr, bbrg, \
162 bbrb, bbgr, bbgg, bbgb, bbbr, bbbg, bbbb;
164#define SWIZZLE_XYZW(T) \
166 SwizzleBase<T, 2> xw, yw, zw, wx, wy, wz, ww; \
167 SwizzleBase<T, 3> xxw, xyw, xzw, xwx, xwy, xwz, xww, yxw, yyw, yzw, ywx, ywy, ywz, yww, zxw, \
168 zyw, zzw, zwx, zwy, zwz, zww, wxx, wxy, wxz, wxw, wyx, wyy, wyz, wyw, wzx, wzy, wzz, wzw, \
169 wwx, wwy, wwz, www; \
170 SwizzleBase<T, 4> xxxw, xxyw, xxzw, xxwx, xxwy, xxwz, xxww, xyxw, xyyw, xyzw, xywx, xywy, xywz, \
171 xyww, xzxw, xzyw, xzzw, xzwx, xzwy, xzwz, xzww, xwxx, xwxy, xwxz, xwxw, xwyx, xwyy, xwyz, \
172 xwyw, xwzx, xwzy, xwzz, xwzw, xwwx, xwwy, xwwz, xwww, yxxw, yxyw, yxzw, yxwx, yxwy, yxwz, \
173 yxww, yyxw, yyyw, yyzw, yywx, yywy, yywz, yyww, yzxw, yzyw, yzzw, yzwx, yzwy, yzwz, yzww, \
174 ywxx, ywxy, ywxz, ywxw, ywyx, ywyy, ywyz, ywyw, ywzx, ywzy, ywzz, ywzw, ywwx, ywwy, ywwz, \
175 ywww, zxxw, zxyw, zxzw, zxwx, zxwy, zxwz, zxww, zyxw, zyyw, zyzw, zywx, zywy, zywz, zyww, \
176 zzxw, zzyw, zzzw, zzwx, zzwy, zzwz, zzww, zwxx, zwxy, zwxz, zwxw, zwyx, zwyy, zwyz, zwyw, \
177 zwzx, zwzy, zwzz, zwzw, zwwx, zwwy, zwwz, zwww, wxxx, wxxy, wxxz, wxxw, wxyx, wxyy, wxyz, \
178 wxyw, wxzx, wxzy, wxzz, wxzw, wxwx, wxwy, wxwz, wxww, wyxx, wyxy, wyxz, wyxw, wyyx, wyyy, \
179 wyyz, wyyw, wyzx, wyzy, wyzz, wyzw, wywx, wywy, wywz, wyww, wzxx, wzxy, wzxz, wzxw, wzyx, \
180 wzyy, wzyz, wzyw, wzzx, wzzy, wzzz, wzzw, wzwx, wzwy, wzwz, wzww, wwxx, wwxy, wwxz, wwxw, \
181 wwyx, wwyy, wwyz, wwyw, wwzx, wwzy, wwzz, wwzw, wwwx, wwwy, wwwz, wwww;
183#define SWIZZLE_RGBA(T) \
185 SwizzleBase<T, 2> ra, ga, ba, ar, ag, ab, aa; \
186 SwizzleBase<T, 3> rra, rga, rba, rar, rag, rab, raa, gra, gga, gba, gar, gag, gab, gaa, bra, \
187 bga, bba, bar, bag, bab, baa, arr, arg, arb, ara, agr, agg, agb, aga, abr, abg, abb, aba, \
188 aar, aag, aab, aaa; \
189 SwizzleBase<T, 4> rrra, rrga, rrba, rrar, rrag, rrab, rraa, rgra, rgga, rgba, rgar, rgag, rgab, \
190 rgaa, rbra, rbga, rbba, rbar, rbag, rbab, rbaa, rarr, rarg, rarb, rara, ragr, ragg, ragb, \
191 raga, rabr, rabg, rabb, raba, raar, raag, raab, raaa, grra, grga, grba, grar, grag, grab, \
192 graa, ggra, ggga, ggba, ggar, ggag, ggab, ggaa, gbra, gbga, gbba, gbar, gbag, gbab, gbaa, \
193 garr, garg, garb, gara, gagr, gagg, gagb, gaga, gabr, gabg, gabb, gaba, gaar, gaag, gaab, \
194 gaaa, brra, brga, brba, brar, brag, brab, braa, bgra, bgga, bgba, bgar, bgag, bgab, bgaa, \
195 bbra, bbga, bbba, bbar, bbag, bbab, bbaa, barr, barg, barb, bara, bagr, bagg, bagb, baga, \
196 babr, babg, babb, baba, baar, baag, baab, baaa, arrr, arrg, arrb, arra, argr, argg, argb, \
197 arga, arbr, arbg, arbb, arba, arar, arag, arab, araa, agrr, agrg, agrb, agra, aggr, aggg, \
198 aggb, agga, agbr, agbg, agbb, agba, agar, agag, agab, agaa, abrr, abrg, abrb, abra, abgr, \
199 abgg, abgb, abga, abbr, abbg, abbb, abba, abar, abag, abab, abaa, aarr, aarg, aarb, aara, \
200 aagr, aagg, aagb, aaga, aabr, aabg, aabb, aaba, aaar, aaag, aaab, aaaa;
213 static constexpr T V =
T(0.123f);
237 static constexpr T V =
T(0.123f);
263 static constexpr T V =
T(0.123f);
341using uint =
unsigned int;
365using ushort =
unsigned short;
VecBase< ushort, 2 > ushort2
VecBase< short, 4 > short4
VecBase< short, 2 > short2
VecBase< ushort, 3 > ushort3
VecBase< short, 3 > short3
constexpr VecT operator=(const VecT &) RET
constexpr VecBase(T x_, T y_)
constexpr VecBase(T, VecOp< T, 2 >)
constexpr VecBase(T x_, T y_, T z_)
constexpr VecBase(VecOp< T, 2 >, T)
constexpr VecBase(VecOp< T, 3 >, T)
constexpr VecBase(T x_, T y_, T z_, T w_)
constexpr VecBase(VecOp< T, 2 >, T, T)
constexpr VecBase(T, T, VecOp< T, 2 >)
constexpr VecBase(T, VecOp< T, 2 >, T)
constexpr VecBase(T, VecOp< T, 3 >)
constexpr VecBase(VecOp< T, 2 >, VecOp< T, 2 >)
VecBase(VecOp< float, 2 >)
VecBase(VecOp< bool, 2 >, bool)
VecBase(bool, bool, bool)
VecBase(bool, VecOp< bool, 2 >)
VecBase(bool, bool, VecOp< bool, 2 >)
VecBase(bool, VecOp< bool, 2 >, bool)
VecBase(VecOp< bool, 2 >, VecOp< bool, 2 >)
VecBase(bool, VecOp< bool, 3 >)
VecBase(VecOp< bool, 3 >, bool)
VecBase(bool, bool, bool, bool)
VecBase(VecOp< bool, 2 >, bool, bool)
INT_OP friend VecT operator>>(VecT, VecT) RET
INT_OP friend VecT operator<<(VecT, VecT) RET
INT_OP friend VecT operator^(VecT, VecT) RET
INT_OP friend VecT operator&(VecT, T) RET
INT_OP friend VecT operator&=(VecT, T) RET
INT_OP friend VecT operator<<=(VecT, VecT) RET
INT_OP friend VecT operator|=(VecT, T) RET
INT_OP friend VecT operator&(VecT, VecT) RET
INT_OP friend VecT operator%=(VecT, VecT) RET
INT_OP friend VecT operator>>=(VecT, VecT) RET
INT_OP friend VecT operator>>=(T, VecT) RET
INT_OP friend VecT operator<<=(VecT, T) RET
INT_OP friend VecT operator^=(VecT, VecT) RET
INT_OP friend VecT operator<<(T, VecT) RET
INT_OP friend VecT operator^(T, VecT) RET
INT_OP friend VecT operator%(VecT, VecT) RET
INT_OP friend VecT operator>>(T, VecT) RET
INT_OP friend VecT operator<<(VecT, T) RET
INT_OP friend VecT operator|(T, VecT) RET
INT_OP friend VecT operator^(VecT, T) RET
STD_OP VecT operator+() const RET
INT_OP friend VecT operator&(T, VecT) RET
INT_OP friend VecT operator|(VecT, T) RET
INT_OP friend VecT operator|(VecT, VecT) RET
INT_OP friend VecT operator|=(VecT, VecT) RET
const T & operator[](int) const
INT_OP friend VecT operator^=(VecT, T) RET
INT_OP friend VecT operator>>(VecT, T) RET
INT_OP friend VecT operator%(VecT, T) RET
INT_OP friend VecT operator%(T, VecT) RET
INT_OP friend VecT operator&=(VecT, VecT) RET
INT_OP friend VecT operator~(VecT) RET
INT_OP friend VecT operator>>=(VecT, T) RET
INT_OP friend VecT operator<<=(T, VecT) RET
INT_OP friend VecT operator%=(VecT, T) RET