blob: 2a574e4e415b605a6411ad35746edf43579b58d5 [file] [log] [blame]
/** ParamUtils.hpp:
* A collection of utility functions to make using parameter types easier.
* In reality, this stuff belongs elsewhere, but one step at a time
*/
#ifndef _PARAM_UTILS_HPP
#define _PARAM_UTILS_HPP
#include "Param.hpp"
#include <map>
#include <cassert>
#include "BuiltinParams.hpp"
class ParamUtils
{
public:
static bool
insert(Param * param, std::map<std::string,Param*> * paramTree)
{
assert(param);
assert(paramTree);
return ((paramTree->insert(std::make_pair(param->name,param))).second);
}
static const int AUTO_CREATE = 1;
static const int NO_CREATE = 0;
template <int FLAGS> static Param *
find(std::string name, std::map<std::string,Param*> * paramTree)
{
assert(paramTree);
Param * param;
/* First look in the suggested database */
std::map<std::string,Param*>::iterator pos = paramTree->find(name);
if ((FLAGS == AUTO_CREATE) && ((pos == paramTree->end())))
{
/* Check if string is valid */
if (!Param::is_valid_param_string(name.c_str()))
return NULL;
/* Now, create the user defined parameter given the passed name */
if ((param = new Param(name)) == NULL)
return NULL;
/* Finally, insert the new parameter into this preset's parameter tree */
std::pair<std::map<std::string,Param*>::iterator, bool> insertRetPair =
paramTree->insert(std::make_pair(param->name, param));
assert(insertRetPair.second);
} else if (pos != paramTree->end())
param = pos->second;
else
param = NULL;
/* Return the found (or created) parameter. Note that this could be null */
return param;
}
static Param *
find(const std::string & name, BuiltinParams * builtinParams, std::map<std::string,Param*> * insertionTree)
{
Param * param;
// Check first db
if ((param = builtinParams->find_builtin_param(name)) != 0)
return param;
// Check second db, create if necessary
return find<AUTO_CREATE>(name, insertionTree);
}
};
#endif