#include <stdio.h>
#include <vector>
using namespace std;
struct Space2
{
struct Vector
{
};
};
struct Space3
{
struct Vector
{
};
};
template<typename Space>
struct ParticleData{};
template <>
struct ParticleData<Space2>
{
float orientation;
float invInertia;
ParticleData()
{
orientation = 2.0f ;
invInertia = 3.0f;
}
};
template <>
struct ParticleData<Space3>
{
float test;
ParticleData()
{
test = 100500.0f;
}
};
template<typename Space,typename AwesomeParam>
struct ParticleSystem
{
struct Particle : public ParticleData<Space>
{
float someGenericStuff;
};
typedef ParticleSystem<Space,AwesomeParam> SelfType;
typedef ParticleSystem<Space2,AwesomeParam> ParticleSystem2;
typedef ParticleSystem<Space3,AwesomeParam> ParticleSystem3;
void DumpParticle(size_t particleIndex,ParticleSystem2* dummy)
{
printf("2: %f %f\n", particles[particleIndex].orientation, particles[particleIndex].invInertia );
}
void DumpParticle(size_t particleIndex,ParticleSystem3* dummy )
{
printf("3: %f\n", particles[particleIndex].test);
}
void DumpParticles()
{
for(size_t particleIndex = 0; particleIndex < particles.size(); particleIndex++)
{
DumpParticle(particleIndex,this);
}
}
ParticleSystem()
{
particles.push_back(Particle());
}
std::vector<Particle> particles;
};
int main()
{
ParticleSystem<Space3,float> p3;
ParticleSystem<Space2,char> p2;
p3.DumpParticles();
p2.DumpParticles();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDx2ZWN0b3I+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnN0cnVjdCBTcGFjZTIKewogICAgc3RydWN0IFZlY3RvcgogICAgewoKICAgIH07Cgp9OwpzdHJ1Y3QgU3BhY2UzCnsKICAgIHN0cnVjdCBWZWN0b3IKICAgIHsKCiAgICB9OwoKfTsKCnRlbXBsYXRlPHR5cGVuYW1lIFNwYWNlPgpzdHJ1Y3QgUGFydGljbGVEYXRhe307Cgp0ZW1wbGF0ZSA8PgpzdHJ1Y3QgUGFydGljbGVEYXRhPFNwYWNlMj4KewogIGZsb2F0IG9yaWVudGF0aW9uOwogIGZsb2F0IGludkluZXJ0aWE7CiAgUGFydGljbGVEYXRhKCkKICB7CiAgICBvcmllbnRhdGlvbiA9IDIuMGYgOwogICAgaW52SW5lcnRpYSA9IDMuMGY7CiAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IFBhcnRpY2xlRGF0YTxTcGFjZTM+CnsKICAgIGZsb2F0IHRlc3Q7CiAgICBQYXJ0aWNsZURhdGEoKQogICAgewogICAgICAgIHRlc3QgPSAxMDA1MDAuMGY7CiAgICB9Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBTcGFjZSx0eXBlbmFtZSBBd2Vzb21lUGFyYW0+CnN0cnVjdCBQYXJ0aWNsZVN5c3RlbQp7CiAgc3RydWN0IFBhcnRpY2xlIDogcHVibGljIFBhcnRpY2xlRGF0YTxTcGFjZT4KICB7CiAgICBmbG9hdCBzb21lR2VuZXJpY1N0dWZmOwogIH07CgogIHR5cGVkZWYgUGFydGljbGVTeXN0ZW08U3BhY2UsQXdlc29tZVBhcmFtPiBTZWxmVHlwZTsKICB0eXBlZGVmIFBhcnRpY2xlU3lzdGVtPFNwYWNlMixBd2Vzb21lUGFyYW0+IFBhcnRpY2xlU3lzdGVtMjsKICB0eXBlZGVmIFBhcnRpY2xlU3lzdGVtPFNwYWNlMyxBd2Vzb21lUGFyYW0+IFBhcnRpY2xlU3lzdGVtMzsKCiAgCiAgdm9pZCBEdW1wUGFydGljbGUoc2l6ZV90IHBhcnRpY2xlSW5kZXgsUGFydGljbGVTeXN0ZW0yKiBkdW1teSkKICB7CiAgICBwcmludGYoIjI6ICVmICVmXG4iLCBwYXJ0aWNsZXNbcGFydGljbGVJbmRleF0ub3JpZW50YXRpb24sIHBhcnRpY2xlc1twYXJ0aWNsZUluZGV4XS5pbnZJbmVydGlhICk7CiAgfQoKICB2b2lkIER1bXBQYXJ0aWNsZShzaXplX3QgcGFydGljbGVJbmRleCxQYXJ0aWNsZVN5c3RlbTMqIGR1bW15ICkKICB7CiAgICBwcmludGYoIjM6ICVmXG4iLCBwYXJ0aWNsZXNbcGFydGljbGVJbmRleF0udGVzdCk7CiAgfQoKICB2b2lkIER1bXBQYXJ0aWNsZXMoKQogIHsKICAgIGZvcihzaXplX3QgcGFydGljbGVJbmRleCA9IDA7IHBhcnRpY2xlSW5kZXggPCBwYXJ0aWNsZXMuc2l6ZSgpOyBwYXJ0aWNsZUluZGV4KyspCiAgICB7CiAgICAgIER1bXBQYXJ0aWNsZShwYXJ0aWNsZUluZGV4LHRoaXMpOwogICAgfQogIH0KICBQYXJ0aWNsZVN5c3RlbSgpCiAgewogICAgcGFydGljbGVzLnB1c2hfYmFjayhQYXJ0aWNsZSgpKTsKICB9CiAgc3RkOjp2ZWN0b3I8UGFydGljbGU+IHBhcnRpY2xlczsKfTsKCgoKaW50IG1haW4oKQp7CiAgICBQYXJ0aWNsZVN5c3RlbTxTcGFjZTMsZmxvYXQ+IHAzOwogICAgUGFydGljbGVTeXN0ZW08U3BhY2UyLGNoYXI+IHAyOwogICAgcDMuRHVtcFBhcnRpY2xlcygpOwogICAgcDIuRHVtcFBhcnRpY2xlcygpOwogICAgcmV0dXJuIDA7Cn0K