misc.h
#if (!defined(__misc_h))

#include <iostream>
#include <iomanip>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <vector>
#include <sstream>
#include <fstream>
#include <vector>
#include <ctype.h>
#include "capd/capdlib.h"
#include "capd/mpcapdlib.h"

using namespace std;
using namespace capd;

string HostName();
string CurrentDayHour();
string CurrentDay();
string CurrentHour();
string itos(int i);

template <typename T> void Swap(T &a, T &b){
  T temp=a;
  a=b;
  b=temp;
}

template <typename T> T &Max(const T &a, const T &b){
  return (T &)(a>b?a:b);
}

template <typename T> T &Min(const T &a, const T &b){
  return (T &)((a<b)?a:b);
}

template <typename T> bool Sort(unsigned long n, T ra[]){
  // from Numerical Recipes in C (modified qcsort.C
  // sorts array ra[0],...ra[n-1]
  unsigned long i,ir,j,l;
  T rra;

  if (n <= 1) return false;
  l=(n >> 1)+1;
  ir=n;
  for (;;) {
    if (l > 1) {
      rra=ra[--l-1];
    } else {
      rra=ra[ir-1];
      ra[ir-1]=ra[0];
      if (--ir == 1) {
        ra[0]=rra;
        break;
      }
    }
    i=l;
    j=l+l;
    while (j <= ir) {
      if (j < ir && ra[j-1] < ra[j]) j++;
      if (rra < ra[j-1]) {
        ra[i-1]=ra[j-1];
        i=j;
        j <<= 1;
      } else j=ir+1;
    }
    ra[i-1]=rra;
  }
  return true;
}

bool FileRemove(const char *filename);
bool FileExists(const char *filename);
int FileSize(const char* FileName);
void FileCopy(const char* From, const char* To);
string dirname(const char* FileName);
long GetMemAvail();
long GetMemMax();
int Execute(const char *Command, bool disp=true);
int Execute(const char *Command, const char *FileName, bool disp=true);
void ViewTempFile(const char *PrintCommand, const char *FileName);
int exec(char *argv[]);
int execwait(char *argv[]);
int execwait(vector <string> argstring);
int execwait(const char *arg);

class TimeCount {
  long TicksComp;	// keeps start of computation time 
  long TicksElapsed;	// keeps start of elapsed time
			// usually elapsed time > computation time
			// may not be true for small elapsed time
public:
  void Reset();
  long GetCompTime();
  long GetElapsedTime();
  TimeCount(){Reset();};
  string ElapsedTimeString();
  void Print();
  void PrintElapsed(int w=0);
  friend ostream& operator<<(ostream& s, TimeCount & TC);
};

/************* SAVE OPTIONS **************/

class OptItem{
 public:
  string typ;
  string info;
  OptItem(string atyp, string ainfo){typ=atyp; info=ainfo;};
  virtual void SetValue(ifstream & InFile)=0;
  virtual void SetValue(const char *val)=0;
  virtual void Print(ostream& s)=0;
  virtual ~OptItem(){};
  //  virtual friend ostream& operator<<(ostream& s, const IntItem & OI)=0;
};

class CommentItem: public OptItem{
 public:
  CommentItem(string ainfo): OptItem("CommentType",ainfo){;};
  void SetValue(ifstream & InFile){};
  void SetValue(const char *val){};
  void Print(ostream& s){};
};

class IntItem: public OptItem{
 public:
  int *pvalue;
  IntItem(string ainfo, int *apvalue): OptItem("IntType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ InFile >> *pvalue;};
  void SetValue(const char *val){ *pvalue=atoi(val);};
  void Print(ostream& s){ s << *pvalue;}
  //  friend ostream& operator<<(ostream& s, const IntItem & OI){return s << *(OI.pvalue);};
};

class LongLongIntItem: public OptItem{
 public:
  long long int *pvalue;
  LongLongIntItem(string ainfo, long long int *apvalue): OptItem("IntType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ InFile >> *pvalue;};
  void SetValue(const char *val){ *pvalue=atoll(val);};
  void Print(ostream& s){ s << *pvalue;}
  //  friend ostream& operator<<(ostream& s, const IntItem & OI){return s << *(OI.pvalue);};
};

class BoolItem: public OptItem{
 public:
  bool *pvalue;
  BoolItem(string ainfo, bool *apvalue): OptItem("BoolType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ string str; InFile >> str; *(pvalue)=(str=="true");};
  void SetValue(const char *val){ *(pvalue)=(val[0]=='t'); if (val[0]=='n' || val[0]=='f') *(pvalue)=false; };
  void Print(ostream& s){ s << (*pvalue?"true":"false");};
};

class DoubleItem: public OptItem{
 public:
  double *pvalue;
  DoubleItem(string ainfo, double *apvalue): OptItem("DoubleType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ InFile >> *pvalue;};
  void SetValue(const char *val){ *pvalue=atof(val);};
  void Print(ostream& s){ s << *pvalue;};
};

class StringItem: public OptItem{
 public:
  string *pvalue;
  StringItem(string ainfo, string *apvalue): OptItem("StringType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ char ch; char WS[256]; InFile.get(ch);/*while (InFile.get(ch) && isspace(ch)); InFile.putback(ch); */ InFile.getline(WS,255); *pvalue=WS; InFile.putback('\n');};
  void SetValue(const char *val){ *pvalue=val; };
  void Print(ostream& s){ s << *pvalue;};
};

class ColorItem: public OptItem{
 public:
  double *pvalue;
  ColorItem(string ainfo, double *apvalue): OptItem("ColorType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ InFile >> pvalue[0] >> pvalue[1]>> pvalue[2];};
  void SetValue(const char *val){};
  void Print(ostream& s){ s << pvalue[0] << " " << pvalue[1] << " " << pvalue[2];};
};

class VectorItem: public OptItem{
 public:
  DVector *pvalue;
  VectorItem(string ainfo, DVector *apvalue): OptItem("VectorType",ainfo), pvalue(apvalue){;};
  void SetValue(ifstream & InFile){ int d; InFile >> d; (*pvalue).resize(d); for (int i=1;i<=d;i++) InFile >> (*pvalue)(i); };
  void SetValue(const char *val);
  void Print(ostream& s){ s << (*pvalue).dimension(); for (int i=1;i<=(*pvalue).dimension();i++) s << " " << (*pvalue)(i); };
};

class ConfigFile {
public:
  OptItem *Item[1000];
  string DefaultFileName;
  bool Defined;
  int ItemNum;
  void AddComment(const char *info)                                 {Item[ItemNum++] = new CommentItem(info);}
  void AddInt(const char *info, int *pvalue)                        {Item[ItemNum++] = new IntItem(info,pvalue);}
  void AddLongLongInt(const char *info, long long int *pvalue)      {Item[ItemNum++] = new LongLongIntItem(info,pvalue);}
  void AddBool(const char *info, bool *pvalue)                      {Item[ItemNum++] = new BoolItem(info,pvalue);}
  void AddDouble(const char *info, double *pvalue)                  {Item[ItemNum++] = new DoubleItem(info,pvalue);}
  void AddString(const char *info, string *pvalue)                  {Item[ItemNum++] = new StringItem(info,pvalue);}
  void AddVector(const char *info, DVector *pvalue)                 {Item[ItemNum++] = new VectorItem(info,pvalue);}
  void AddColor(const char *info, double *pvalue)                   {Item[ItemNum++] = new ColorItem(info,pvalue);}
  ConfigFile(string aDefaultFileName){ItemNum=0; Defined=false; DefaultFileName=aDefaultFileName;}
  virtual ~ConfigFile(){while (ItemNum>0) delete Item[--ItemNum];};
  virtual void Init()=0;
  void Define(){ if (Defined) return; Defined=true; Init();};
  virtual void Read(string FN);
  void ReadDefault(){Read(DefaultFileName);};
  virtual void Save(string FN);
  void SaveDefault(){Save(DefaultFileName);};
  bool GetValue(const char *info, const char *val);
};

string ScalarToLatexString(double x, int width1=5, int width2=3);

#define __misc_h __misc_h
#endif