/** 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
