#include <vector>
#include <stdio.h>
namespace Test
{
struct Vector2f{float x, y;};
struct Vector3f{float x, y, z;};
struct Tensor3f{float xx, xy, xz, yy, yz, zz;};
struct Matrix3x3f{float data[9];};
struct Space2
{
typedef Vector2f Vector;
};
struct Space3
{
typedef Vector3f Vector;
};
template<typename T>
struct ParticleData{};
template<>
struct ParticleData<Space3>
{
Matrix3x3f orientation;
Tensor3f inertiaTensor;
};
template<>
struct ParticleData<Space2>
{
float orientation;
float invInertia;
};
template<typename Space>
struct ParticleSystem
{
struct Particle : public ParticleData<Space>
{
typename Space::Vector pos, velocity;
};
void DumpParticle();
void DumpParticles()
{
DumpParticle();
}
std::vector<Particle> particles;
};
template<>
void ParticleSystem<Space2>::DumpParticle()
{
printf("%f %f", particles[0].orientation, particles[0].invInertia);
}
template<>
void ParticleSystem<Space3>::DumpParticle()
{
printf("%f %f", particles[0].orientation.data[0], particles[0].inertiaTensor.xx);
}
}
int main()
{
Test::ParticleSystem<Test::Space2> sys;
sys.DumpParticles();
return 0;
}
I2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPHN0ZGlvLmg+CgpuYW1lc3BhY2UgVGVzdAp7CiAgc3RydWN0IFZlY3RvcjJme2Zsb2F0IHgsIHk7fTsKICBzdHJ1Y3QgVmVjdG9yM2Z7ZmxvYXQgeCwgeSwgejt9OwogIHN0cnVjdCBUZW5zb3IzZntmbG9hdCB4eCwgeHksIHh6LCB5eSwgeXosIHp6O307CiAgc3RydWN0IE1hdHJpeDN4M2Z7ZmxvYXQgZGF0YVs5XTt9OwogIHN0cnVjdCBTcGFjZTIKICB7CiAgICB0eXBlZGVmIFZlY3RvcjJmIFZlY3RvcjsKICB9OwogIHN0cnVjdCBTcGFjZTMKICB7CiAgICB0eXBlZGVmIFZlY3RvcjNmIFZlY3RvcjsKICB9OwoKCiAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICBzdHJ1Y3QgUGFydGljbGVEYXRhe307CgogIHRlbXBsYXRlPD4gCiAgc3RydWN0IFBhcnRpY2xlRGF0YTxTcGFjZTM+CiAgewogICAgTWF0cml4M3gzZiBvcmllbnRhdGlvbjsKICAgIFRlbnNvcjNmIGluZXJ0aWFUZW5zb3I7CiAgfTsKICB0ZW1wbGF0ZTw+IAogIHN0cnVjdCBQYXJ0aWNsZURhdGE8U3BhY2UyPgogIHsKICAgIGZsb2F0IG9yaWVudGF0aW9uOwogICAgZmxvYXQgaW52SW5lcnRpYTsKICB9OwoKICB0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZT4KICBzdHJ1Y3QgUGFydGljbGVTeXN0ZW0KICB7CiAgICBzdHJ1Y3QgUGFydGljbGUgOiBwdWJsaWMgUGFydGljbGVEYXRhPFNwYWNlPgogICAgewogICAgICB0eXBlbmFtZSBTcGFjZTo6VmVjdG9yIHBvcywgdmVsb2NpdHk7CiAgICB9OwoKICAgIHZvaWQgRHVtcFBhcnRpY2xlKCk7CgogICAgdm9pZCBEdW1wUGFydGljbGVzKCkKICAgIHsKICAgICAgRHVtcFBhcnRpY2xlKCk7CiAgICB9CgogICAgc3RkOjp2ZWN0b3I8UGFydGljbGU+IHBhcnRpY2xlczsKICB9OwoKICB0ZW1wbGF0ZTw+CiAgdm9pZCBQYXJ0aWNsZVN5c3RlbTxTcGFjZTI+OjpEdW1wUGFydGljbGUoKQogIHsKICAgIHByaW50ZigiJWYgJWYiLCBwYXJ0aWNsZXNbMF0ub3JpZW50YXRpb24sIHBhcnRpY2xlc1swXS5pbnZJbmVydGlhKTsKICB9CgogIHRlbXBsYXRlPD4KICB2b2lkIFBhcnRpY2xlU3lzdGVtPFNwYWNlMz46OkR1bXBQYXJ0aWNsZSgpCiAgewogICAgcHJpbnRmKCIlZiAlZiIsIHBhcnRpY2xlc1swXS5vcmllbnRhdGlvbi5kYXRhWzBdLCBwYXJ0aWNsZXNbMF0uaW5lcnRpYVRlbnNvci54eCk7CiAgfQogIAoKfQoKaW50IG1haW4oKQp7CiAgVGVzdDo6UGFydGljbGVTeXN0ZW08VGVzdDo6U3BhY2UyPiBzeXM7CiAgc3lzLkR1bXBQYXJ0aWNsZXMoKTsKCiAgcmV0dXJuIDA7Cn0=