blob: 218619946722ac47468080e3dfdf5bab63350f46 [file] [log] [blame]
#ifndef _INIT_COND_UTILS_HPP
#define _INIT_COND_UTILS_HPP
#include <map>
#include "InitCond.hpp"
#include <iostream>
#include <stdlib.h>
namespace InitCondUtils {
class LoadUnspecInitCond {
public:
LoadUnspecInitCond(std::map<std::string,InitCond*> & initCondTree, std::map<std::string,InitCond*> & perFrameInitEqnTree):
m_initCondTree(initCondTree), m_perFrameInitEqnTree(perFrameInitEqnTree) {}
void operator()(Param * param);
private:
std::map<std::string,InitCond*> & m_initCondTree;
std::map<std::string,InitCond*> & m_perFrameInitEqnTree;
};
inline void LoadUnspecInitCond::operator() (Param * param) {
InitCond * init_cond = 0;
CValue init_val;
assert(param);
assert(param->engine_val);
/* Don't count these parameters as initial conditions */
if (param->flags & P_FLAG_READONLY)
return;
if (param->flags & P_FLAG_QVAR)
return;
// if (param->flags & P_FLAG_TVAR)
// return;
if (param->flags & P_FLAG_USERDEF)
return;
/* If initial condition was not defined by the preset file, force a default one
with the following code */
if (m_initCondTree.find(param->name) == m_initCondTree.end()) {
/* Make sure initial condition does not exist in the set of per frame initial equations */
if (m_perFrameInitEqnTree.find(param->name) != m_perFrameInitEqnTree.end())
return;
// Set an initial vialue via correct union member
if (param->type == P_TYPE_BOOL)
init_val.bool_val = param->default_init_val.bool_val;
else if (param->type == P_TYPE_INT)
init_val.int_val = param->default_init_val.int_val;
else if (param->type == P_TYPE_DOUBLE) {
init_val.float_val = param->default_init_val.float_val;
}
//printf("%s\n", param->name);
/* Create new initial condition */
//std::cerr << "[InitCondUtils] creating an unspecified initial condition of name " << param->name << std::endl;
if ((init_cond = new InitCond(param, init_val)) == NULL) {
abort();
}
/* Insert the initial condition into this presets tree */
std::pair<std::map<std::string, InitCond*>::iterator, bool> inserteePair =
m_initCondTree.insert(std::make_pair(init_cond->param->name, init_cond));
assert(inserteePair.second);
assert(inserteePair.first->second);
} else
assert(m_initCondTree.find(param->name)->second);
}
}
#endif