#define furrovineexport
template<class T>
class TVector2;
template<class T>
class TVector3;
template <class T> struct TVector4 {
public:
static const TVector4<T> UnitX;
static const TVector4<T> UnitY;
static const TVector4<T> UnitZ;
static const TVector4<T> UnitW;
static const TVector4<T> One;
static const TVector4<T> Zero;
typedef T TElement;
template<unsigned one, unsigned two>
struct furrovineexport swizzler_two {
T v[4];
swizzler_two & operator= (const TVector2<T>& right) {
v[one] = right.x;
v[two] = right.y;
return *this;
}
operator TVector3<T> () const { return TVector4<T>(v[one], v[two]); }
};
template<unsigned one, unsigned two, unsigned three>
struct furrovineexport swizzler_three {
T v[4];
swizzler_three& operator= (const TVector3<T>& right) {
v[one] = right.x;
v[two] = right.y;
v[three] = right.z;
return *this;
}
operator TVector3<T> () const { return TVector4<T>(v[one], v[two], v[three]); }
};
template<unsigned one, unsigned two, unsigned three, unsigned four>
struct furrovineexport swizzler_four {
T v[4];
operator TVector4<T> () const { return TVector4<T>(v[one], v[two], v[three], v[four]); }
};
union {
struct {T x, y, z, w;};
struct {T cell[4];};
swizzler_two<0, 0> xx;
swizzler_two<0, 1> xy;
swizzler_two<0, 2> xz;
swizzler_two<0, 3> xw;
swizzler_two<1, 0> yx;
//etc
};
};
int main() {
TVector4<float> a;
}
I2RlZmluZSBmdXJyb3ZpbmVleHBvcnQgCgp0ZW1wbGF0ZTxjbGFzcyBUPgpjbGFzcyBUVmVjdG9yMjsKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgVFZlY3RvcjM7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IFRWZWN0b3I0IHsKICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVFZlY3RvcjQ8VD4gVW5pdFg7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVFZlY3RvcjQ8VD4gVW5pdFk7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVFZlY3RvcjQ8VD4gVW5pdFo7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVFZlY3RvcjQ8VD4gVW5pdFc7CiAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgVFZlY3RvcjQ8VD4gT25lOwogICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IFRWZWN0b3I0PFQ+IFplcm87CiAKICAgICAgICAgICAgICAgIHR5cGVkZWYgVCBURWxlbWVudDsKCgp0ZW1wbGF0ZTx1bnNpZ25lZCBvbmUsIHVuc2lnbmVkIHR3bz4Kc3RydWN0IGZ1cnJvdmluZWV4cG9ydCBzd2l6emxlcl90d28gewogICAgVCB2WzRdOyAKICAgIHN3aXp6bGVyX3R3byAmIG9wZXJhdG9yPSAoY29uc3QgVFZlY3RvcjI8VD4mIHJpZ2h0KSB7CiAgICAgICAgdltvbmVdID0gcmlnaHQueDsKICAgICAgICB2W3R3b10gPSByaWdodC55OwogICAgICAgIHJldHVybiAqdGhpczsKICAgIH0KICAgIG9wZXJhdG9yIFRWZWN0b3IzPFQ+ICgpIGNvbnN0IHsgcmV0dXJuIFRWZWN0b3I0PFQ+KHZbb25lXSwgdlt0d29dKTsgfQp9Owp0ZW1wbGF0ZTx1bnNpZ25lZCBvbmUsIHVuc2lnbmVkIHR3bywgdW5zaWduZWQgdGhyZWU+CnN0cnVjdCBmdXJyb3ZpbmVleHBvcnQgc3dpenpsZXJfdGhyZWUgewogICAgVCB2WzRdOyAKICAgIHN3aXp6bGVyX3RocmVlJiBvcGVyYXRvcj0gKGNvbnN0IFRWZWN0b3IzPFQ+JiByaWdodCkgewogICAgICAgIHZbb25lXSA9IHJpZ2h0Lng7CiAgICAgICAgdlt0d29dID0gcmlnaHQueTsKICAgICAgICB2W3RocmVlXSA9IHJpZ2h0Lno7CiAgICAgICAgcmV0dXJuICp0aGlzOwogICAgfQogICAgb3BlcmF0b3IgVFZlY3RvcjM8VD4gKCkgY29uc3QgeyByZXR1cm4gVFZlY3RvcjQ8VD4odltvbmVdLCB2W3R3b10sIHZbdGhyZWVdKTsgfQp9Owp0ZW1wbGF0ZTx1bnNpZ25lZCBvbmUsIHVuc2lnbmVkIHR3bywgdW5zaWduZWQgdGhyZWUsIHVuc2lnbmVkIGZvdXI+CnN0cnVjdCBmdXJyb3ZpbmVleHBvcnQgc3dpenpsZXJfZm91ciB7CiAgICBUIHZbNF07IAogICAgb3BlcmF0b3IgVFZlY3RvcjQ8VD4gKCkgY29uc3QgeyByZXR1cm4gVFZlY3RvcjQ8VD4odltvbmVdLCB2W3R3b10sIHZbdGhyZWVdLCB2W2ZvdXJdKTsgfQp9OwogCiAgICAgICAgICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB7VCB4LCB5LCB6LCB3O307IAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qge1QgY2VsbFs0XTt9OwoJCQlzd2l6emxlcl90d288MCwgMD4geHg7CgkJCXN3aXp6bGVyX3R3bzwwLCAxPiB4eTsKCQkJc3dpenpsZXJfdHdvPDAsIDI+IHh6OwoJCQlzd2l6emxlcl90d288MCwgMz4geHc7CgkJCXN3aXp6bGVyX3R3bzwxLCAwPiB5eDsKICAgICAgICAgICAgICAgICAgICAgICAgLy9ldGMKICAgICAgICAgICAgICAgIH07Cn07CgppbnQgbWFpbigpIHsKICAgICBUVmVjdG9yNDxmbG9hdD4gYTsKfQogICAg