#pragma implementation

#include "parameters.h"


inline void error( const char* str1, const char* str2 = "" )
{
    cerr << str1 << ' ' << str2 << '\n';
    exit(1);
}


ofstream *parameters::load(char *name){
  char paramin[100];
  sprintf(paramin,"results/%s/%s",name,name);
  cout<<"paramin: "<<paramin<<endl;
  ifstream paraminputfile(paramin,ios::in);

  char paramfilename[100];
  sprintf(paramfilename,"results/%s/%s.params",name,name);
  cout<<"paramfilename "<<paramfilename<<endl;

  ofstream *paramoutputfile = new ofstream(paramfilename,ios::out);
  *paramoutputfile<<"Performing experiment "<<name<<endl;

  char *paramname;
  char *paramstr;

  bool moreparams = true;

  while (moreparams){
    paramname=new char[50];
    paraminputfile>>paramname;  
    if (!paraminputfile)
      moreparams = false;
    else{
      paramstr=new char[50];
      paraminputfile>>paramstr;
      params[paramname] = paramstr;
      *paramoutputfile<<paramname<<" = "<<paramstr<<endl;
    }
 
  }

  return paramoutputfile;
}

bool parameters::boolp(char *name){
  bool answer; 
  char *val=new char[100];
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end())
    sprintf(val, it->second);
  else{
    cout<<"parameter "<<name<<" missing. Aborting."<<endl;
    error("Parameter missing");
  }
  if (strcmp(val,"false")==0)
    answer = false;
  else if (strcmp(val,"true")==0)
    answer = true;
  else{ 
    cout<<"param "<<name<<" = "<<val<<" != bool "<<endl;
    error("param not bool");
  }
  cout<<"found "<<name<<" "<<answer<<endl;

  return answer;
}


int parameters::intp(char *name){
  int answer;
  char *val = new char[100];

  map<const char *, const char *, ltstr>::iterator it = params.find(name);  

  if (it!=params.end())
    sprintf(val, it->second);
  else{
    cout<<"parameter "<<name<<" missing. Aborting."<<endl;
    error("Parameter missing");
  }
  answer = atoi(val);  
  cout<<"found "<<name<<" "<<answer<<endl;
  
  return answer;
}

const char *parameters::stringp(char *name){

  map<const char *, const char *, ltstr>::iterator it = params.find(name);

  if (it!=params.end()){
    cout<<"found "<<name<<" "<<(it->second)<<endl;
    return it->second;
  }
  else{
    cout<<"parameter "<<name<<" missing. Aborting."<<endl;
    error("Parameter missing");
    return 0;
  }
  
}

const char *parameters::stringp(char *name, char *dflt){
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end()){
    cout<<"found "<<name<<" "<<(it->second)<<endl;
    return it->second;
  }
  else{
    cout<<"using default value "<<dflt<<" for parameter "<<name<<endl;
    return dflt;
  }
  
}

double parameters::doublep(char *name){
  double answer; 
  char *val = new char[100];
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end())
    sprintf(val, it->second);
  else{
    cout<<"parameter "<<name<<" missing. Aborting."<<endl;
    error("Parameter missing");
  }
  answer = atof(val);  
  cout<<"found "<<name<<" "<<answer<<endl;

  return answer;
}

bool parameters::boolp(char *name, bool dflt){
  bool answer; 
  char *val = new char[100];
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end()){
    sprintf(val, it->second);
    if (strcmp(val,"false")==0)
      answer = false;
    else if (strcmp(val,"true")==0)
      answer = true;
    else{ 
      cout<<"param "<<name<<" = "<<val<<" != bool "<<endl;
      error("param not bool");
    }
  }
  else{
    answer = dflt;
    cout<<"using default value "<<dflt<<" for parameter "<<name<<endl;
  }
  cout<<"found "<<name<<" "<<answer<<endl;

  return answer;
}


int parameters::intp(char *name, int dflt){
  int answer;
  char *val = new char[100];
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end()){
    sprintf(val, it->second);
    answer = atoi(val);  
  }
  else{
    answer = dflt;
    cout<<"using default value "<<dflt<<" for parameter "<<name<<endl;
  }
  cout<<"found "<<name<<" "<<answer<<endl;
  return answer;
}

double parameters::doublep(char *name, double dflt){
  double answer; 
  char *val = new char[100];
  map<const char *, const char *, ltstr>::iterator it = params.find(name);
  if (it!=params.end()){
    sprintf(val, it->second);
    answer = atof(val);  
  }
  else{
    answer = dflt;
    cout<<"using default value "<<dflt<<" for parameter "<<name<<endl;
  }
  cout<<"found "<<name<<" "<<answer<<endl;
  return answer;
}


parameters::parameters()
{
}

parameters::parameters(char *name)
{

    load(name);
}



