| #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 |