#include <iostream>
using namespace std;
namespace vector
{
class float2
{
public:
float2(float x,float y):x(x),y(y)
{}
float x, y;
};
class float3
{
public:
union {
struct {
float x,y,z;
};
float f[3];
};
public:
float3(float x,float y,float z):x(x),y(y),z(z)
{}
float2 swizzle_xx() const;
float3 swizzle_xxx() const;
float3 swizzle_yzx() const;
const float3 &swizzle_xyz() const;
float3 &swizzle_xyz();
float2 &swizzle_yz();
};
namespace detail {
template <int X, int Y>
float2 swizzle2(const float3 &v)
{
static_assert(X < 3 && Y < 3, "");
return float2(v.f[X], v.f[Y]);
}
template <int X, int Y, int Z>
float3 swizzle3(const float3 &v)
{
static_assert(X < 3 && Y < 3 && Z < 3, "");
return float3(v.f[X], v.f[Y], v.f[Z]);
}
}
// 結果がfloat2
float2 float3::swizzle_xx() const {return detail::swizzle2<0, 0>(*this);}
float2 &float3::swizzle_yz() {return reinterpret_cast<float2 &>(y);}
// 結果がfloat3
float3 float3::swizzle_xxx() const {return detail::swizzle3<0, 0, 0>(*this);}
float3 float3::swizzle_yzx() const {return detail::swizzle3<1, 2, 0>(*this);}
const float3 &float3::swizzle_xyz() const {return *this;}
float3 &float3::swizzle_xyz() {return *this;}
}
#define xxx swizzle_xxx()
#define yzx swizzle_yzx()
#define xyz swizzle_xyz()
#define xx swizzle_xx()
#define yz swizzle_yz()
int main() {
// your code goes here
using namespace vector;
float3 a(1,2,3);
auto b=a.yzx;
cout<<b.x<<b.y<<b.z<<endl;
b.yz = a.xx;
cout<<b.x<<b.y<<b.z<<endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCm5hbWVzcGFjZSB2ZWN0b3IKewoJY2xhc3MgZmxvYXQyCgl7CgkJcHVibGljOgoJCWZsb2F0MihmbG9hdCB4LGZsb2F0IHkpOngoeCkseSh5KQoJCXt9CgkJZmxvYXQgeCwgeTsKCX07CgljbGFzcyBmbG9hdDMKCXsKCQlwdWJsaWM6CgkJdW5pb24gewoJCQlzdHJ1Y3QgewoJCQkJZmxvYXQgeCx5LHo7CgkJCX07CgkJCWZsb2F0IGZbM107CgkJfTsKCgkJcHVibGljOgoJCWZsb2F0MyhmbG9hdCB4LGZsb2F0IHksZmxvYXQgeik6eCh4KSx5KHkpLHooeikKCQl7fQogCiAJCWZsb2F0MgkJCXN3aXp6bGVfeHgoKQljb25zdDsKIAkJZmxvYXQzCQkJc3dpenpsZV94eHgoKQljb25zdDsKIAkJZmxvYXQzCQkJc3dpenpsZV95engoKQljb25zdDsKIAkJY29uc3QgZmxvYXQzCSZzd2l6emxlX3h5eigpCWNvbnN0OwogCQlmbG9hdDMgCQkJJnN3aXp6bGVfeHl6KCk7CiAJCWZsb2F0MgkJCSZzd2l6emxlX3l6KCk7Cgl9OwoKCW5hbWVzcGFjZSBkZXRhaWwgewoJCXRlbXBsYXRlIDxpbnQgWCwgaW50IFk+CgkJZmxvYXQyIHN3aXp6bGUyKGNvbnN0IGZsb2F0MyAmdikKCQl7CgkJCXN0YXRpY19hc3NlcnQoWCA8IDMgJiYgWSA8IDMsICIiKTsKCQkJcmV0dXJuIGZsb2F0Mih2LmZbWF0sIHYuZltZXSk7CgkJfQoJCXRlbXBsYXRlIDxpbnQgWCwgaW50IFksIGludCBaPgoJCWZsb2F0MyBzd2l6emxlMyhjb25zdCBmbG9hdDMgJnYpCgkJewoJCQlzdGF0aWNfYXNzZXJ0KFggPCAzICYmIFkgPCAzICYmIFogPCAzLCAiIik7CgkJCXJldHVybiBmbG9hdDModi5mW1hdLCB2LmZbWV0sIHYuZltaXSk7CgkJfQoJfQoKCS8vIOe1kOaenOOBjGZsb2F0MgkKIAlmbG9hdDIJCQlmbG9hdDM6OnN3aXp6bGVfeHgoKQljb25zdAl7cmV0dXJuIGRldGFpbDo6c3dpenpsZTI8MCwgMD4oKnRoaXMpO30KIAlmbG9hdDIJCQkmZmxvYXQzOjpzd2l6emxlX3l6KCkJCQl7cmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQyICY+KHkpO30KCgkvLyDntZDmnpzjgYxmbG9hdDMKIAlmbG9hdDMJCQlmbG9hdDM6OnN3aXp6bGVfeHh4KCkJY29uc3QJe3JldHVybiBkZXRhaWw6OnN3aXp6bGUzPDAsIDAsIDA+KCp0aGlzKTt9CiAJZmxvYXQzCQkJZmxvYXQzOjpzd2l6emxlX3l6eCgpCWNvbnN0CXtyZXR1cm4gZGV0YWlsOjpzd2l6emxlMzwxLCAyLCAwPigqdGhpcyk7fQogCWNvbnN0IGZsb2F0MwkmZmxvYXQzOjpzd2l6emxlX3h5eigpCWNvbnN0CXtyZXR1cm4gKnRoaXM7fQogCWZsb2F0MyAJCQkmZmxvYXQzOjpzd2l6emxlX3h5eigpCQkJe3JldHVybiAqdGhpczt9Cn0KCiNkZWZpbmUgeHh4IHN3aXp6bGVfeHh4KCkKI2RlZmluZSB5enggc3dpenpsZV95engoKQojZGVmaW5lIHh5eiBzd2l6emxlX3h5eigpCiNkZWZpbmUgeHggIHN3aXp6bGVfeHgoKQojZGVmaW5lIHl6ICBzd2l6emxlX3l6KCkKCiAKaW50IG1haW4oKSB7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCiAgICB1c2luZyBuYW1lc3BhY2UgdmVjdG9yOwogICAgZmxvYXQzIGEoMSwyLDMpOwogICAgYXV0byBiPWEueXp4OwogICAgY291dDw8Yi54PDxiLnk8PGIuejw8ZW5kbDsKCgliLnl6ID0gYS54eDsKICAgIGNvdXQ8PGIueDw8Yi55PDxiLno8PGVuZGw7CglyZXR1cm4gMDsKfSA=