#include #include #include #include "IPhreeqc.h" #include "IPhreeqc.hpp" class IPhreeqcLib { public: static int CreateIPhreeqc(void); static IPQ_RESULT DestroyIPhreeqc(int n); static IPhreeqc* GetInstance(int n); private: static std::map Instances; static size_t InstancesIndex; }; IPQ_RESULT AccumulateLine(int id, const char *line) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { switch (IPhreeqcPtr->AccumulateLine(line)) { case VR_OK: return IPQ_OK; case VR_OUTOFMEMORY: return IPQ_OUTOFMEMORY; default: assert(false); } } return IPQ_BADINSTANCE; } int AddError(int id, const char* error_msg) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return (int)IPhreeqcPtr->AddError(error_msg); } return IPQ_BADINSTANCE; } // TODO AddWarning int CreateIPhreeqc(void) { return IPhreeqcLib::CreateIPhreeqc(); } IPQ_RESULT ClearAccumulatedLines(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->ClearAccumulatedLines(); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT DestroyIPhreeqc(int id) { return IPhreeqcLib::DestroyIPhreeqc(id); } // TODO Maybe GetAccumulatedLines const char* GetComponent(int id, int n) { static const char err_msg[] = "GetComponent: Invalid instance id.\n"; static const char empty[] = ""; static std::string comp; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { std::list< std::string > comps = IPhreeqcPtr->ListComponents(); if (n < 0 || n >= (int)comps.size()) { return empty; } std::list< std::string >::iterator it = comps.begin(); for(int i = 0; i < n; ++i) { ++it; } comp = (*it); return comp.c_str(); } return err_msg; } int GetComponentCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return (int)IPhreeqcPtr->ListComponents().size(); } return IPQ_BADINSTANCE; } const char* GetDumpLine(int id, int n) { static const char err_msg[] = "GetDumpLine: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetDumpLine(n); } return err_msg; } int GetDumpLineCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetDumpLineCount(); } return 0; } int GetDumpOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetDumpOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } const char* GetDumpString(int id) { static const char empty[] = ""; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetDumpString(); } return empty; } int GetDumpStringOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetDumpStringOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } const char* GetErrorLine(int id, int n) { static const char err_msg[] = "GetErrorLine: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetErrorLine(n); } return err_msg; } int GetErrorLineCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return (int)IPhreeqcPtr->GetErrorLineCount(); } return IPQ_BADINSTANCE; } int GetErrorOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetErrorOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } const char* GetErrorString(int id) { static const char err_msg[] = "GetErrorString: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetErrorString(); } return err_msg; } int GetLogOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetLogOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } int GetOutputOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetOutputOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } int GetSelectedOutputColumnCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetSelectedOutputColumnCount(); } return IPQ_BADINSTANCE; } int GetSelectedOutputOn(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { if (IPhreeqcPtr->GetSelectedOutputOn()) { return 1; } else { return 0; } } return IPQ_BADINSTANCE; } int GetSelectedOutputRowCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetSelectedOutputRowCount(); } return IPQ_BADINSTANCE; } IPQ_RESULT GetSelectedOutputValue(int id, int row, int col, VAR* pVAR) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { switch(IPhreeqcPtr->GetSelectedOutputValue(row, col, pVAR)) { case VR_OK: return IPQ_OK; case VR_OUTOFMEMORY: return IPQ_OUTOFMEMORY; case VR_BADVARTYPE: return IPQ_BADVARTYPE; case VR_INVALIDARG: return IPQ_INVALIDARG; case VR_INVALIDROW: return IPQ_INVALIDROW; case VR_INVALIDCOL: return IPQ_INVALIDCOL; default: assert(false); } } return IPQ_BADINSTANCE; } const char* GetWarningLine(int id, int n) { static const char err_msg[] = "GetWarningLine: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetWarningLine(n); } return err_msg; } int GetWarningLineCount(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return (int)IPhreeqcPtr->GetWarningLineCount(); } return IPQ_BADINSTANCE; } const char* GetWarningString(int id) { static const char err_msg[] = "GetWarningString: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->GetWarningString(); } return err_msg; } int LoadDatabase(int id, const char* filename) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->LoadDatabase(filename); } return IPQ_BADINSTANCE; } int LoadDatabaseString(int id, const char* input) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->LoadDatabaseString(input); } return IPQ_BADINSTANCE; } void OutputError(int id) { static const char err_msg[] = "OutputError: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->OutputError(); return; } std::cout << err_msg << std::endl; } void OutputLines(int id) { static const char err_msg[] = "OutputLines: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->OutputLines(); return; } std::cout << err_msg << std::endl; } void OutputWarning(int id) { static const char err_msg[] = "OutputWarning: Invalid instance id.\n"; IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->OutputWarning(); return; } std::cout << err_msg << std::endl; } int RunAccumulated(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->RunAccumulated(); } return IPQ_BADINSTANCE; } int RunFile(int id, const char* filename) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->RunFile(filename); } return IPQ_BADINSTANCE; } int RunString(int id, const char* input) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { return IPhreeqcPtr->RunString(input); } return IPQ_BADINSTANCE; } IPQ_RESULT SetDumpOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetDumpOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT SetDumpStringOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetDumpStringOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT SetErrorOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetErrorOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT SetLogOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetLogOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT SetOutputOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetOutputOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT SetSelectedOutputOn(int id, int value) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->SetSelectedOutputOn(value != 0); return IPQ_OK; } return IPQ_BADINSTANCE; } IPQ_RESULT UnLoadDatabase(int id) { IPhreeqc* IPhreeqcPtr = IPhreeqcLib::GetInstance(id); if (IPhreeqcPtr) { IPhreeqcPtr->UnLoadDatabase(); return IPQ_OK; } return IPQ_BADINSTANCE; } // helper functions // std::map IPhreeqcLib::Instances; size_t IPhreeqcLib::InstancesIndex = 0; int IPhreeqcLib::CreateIPhreeqc(void) { int n = IPQ_OUTOFMEMORY; try { IPhreeqc* IPhreeqcPtr = new IPhreeqc; if (IPhreeqcPtr) { std::map::value_type instance(IPhreeqcLib::InstancesIndex, IPhreeqcPtr); std::pair::iterator, bool> pr = IPhreeqcLib::Instances.insert(instance); if (pr.second) { n = (int) (*pr.first).first; ++IPhreeqcLib::InstancesIndex; } } } catch(...) { return IPQ_OUTOFMEMORY; } return n; } IPQ_RESULT IPhreeqcLib::DestroyIPhreeqc(int id) { IPQ_RESULT retval = IPQ_BADINSTANCE; if (id >= 0) { std::map::iterator it = IPhreeqcLib::Instances.find(size_t(id)); if (it != IPhreeqcLib::Instances.end()) { delete (*it).second; IPhreeqcLib::Instances.erase(it); retval = IPQ_OK; } } return retval; } IPhreeqc* IPhreeqcLib::GetInstance(int id) { std::map::iterator it = IPhreeqcLib::Instances.find(size_t(id)); if (it != IPhreeqcLib::Instances.end()) { return (*it).second; } return 0; }