Imported attribute support from latest CosmoTool

This commit is contained in:
Guilhem Lavaux 2012-11-20 17:07:55 -05:00
parent a91851de76
commit fe62b7ef8d
3 changed files with 92 additions and 87 deletions

View file

@ -1,6 +1,8 @@
#ifndef __COSMOTOOLBOX_HPP
#define __COSMOTOOLBOX_HPP
#include <map>
#include <string>
namespace CosmoTool
{
@ -9,9 +11,24 @@ namespace CosmoTool
static const int NEED_VELOCITY = 4;
static const int NEED_TYPE = 8;
struct SimuParticle
{
float Pos[3];
float Vel[3];
int type;
int id;
bool flag_vel, flag_type, flag_id;
};
typedef bool (*SimuFilter)(const SimuParticle& p);
class SimuData
{
public:
typedef void (*FreeFunction)(void *);
typedef std::map<std::string, std::pair<void *, FreeFunction> > AttributeMap;
float BoxSize;
float time;
float Hubble;
@ -24,10 +41,12 @@ namespace CosmoTool
int *Id;
float *Pos[3];
float *Vel[3];
float *uniqueID;
int *type;
AttributeMap attributes;
public:
SimuData() : Id(0),NumPart(0),type(0), uniqueID(0) { Pos[0]=Pos[1]=Pos[2]=0; Vel[0]=Vel[1]=Vel[2]=0; uniqueID=0}
SimuData() : Id(0),NumPart(0),type(0) { Pos[0]=Pos[1]=Pos[2]=0; Vel[0]=Vel[1]=Vel[2]=0; }
~SimuData()
{
for (int j = 0; j < 3; j++)
@ -41,9 +60,37 @@ namespace CosmoTool
delete[] type;
if (Id)
delete[] Id;
if (uniqueID)
delete[] uniqueID;
for (AttributeMap::iterator i = attributes.begin();
i != attributes.end();
++i)
{
if (i->second.second)
i->second.second(i->second.first);
}
}
template<typename T>
T *as(const std::string& n)
{
AttributeMap::iterator i = attributes.find(n);
if (i == attributes.end())
return 0;
return reinterpret_cast<T *>(i->first);
}
void new_attribute(const std::string& n, void *p, FreeFunction free_func)
{
AttributeMap::iterator i = attributes.find(n);
if (i != attributes.end())
{
if (i->second.second)
i->second.second(i->second.first);
}
attributes[n] = std::make_pair(p, free_func);
}
};
};