From: Alex Schmidt Date: Tue, 19 Mar 2013 12:10:18 +0000 (+0100) Subject: added hypercache class, which combines observable and configuration cache. X-Git-Url: http://git.treefish.org/~alex/phys/latlib.git/commitdiff_plain/fbbe6f07bc8720030541b7319acb02c9233cd622?ds=sidebyside added hypercache class, which combines observable and configuration cache. --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 09b20bb..cc76100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,6 +3,9 @@ project(latlib) add_library(lat_configcache configcache.cpp) target_link_libraries(lat_configcache boost_iostreams lat_writeout) +add_library(lat_hypercache hypercache.cpp) +target_link_libraries(lat_hypercache lat_configcache lat_writeout) + add_library(lat_neigh neigh.cpp) add_library(lat_writeout writeout.cpp) diff --git a/hypercache.cpp b/hypercache.cpp new file mode 100644 index 0000000..8fcc609 --- /dev/null +++ b/hypercache.cpp @@ -0,0 +1,73 @@ +#include "hypercache.h" + +hypercache::defaults *hypercache::Defaults = NULL; +configcache *hypercache::O = NULL; +configcache *hypercache::C = NULL; + +void hypercache::initCache(configcache *cache, + const string& cacheid, const int& nequi, const int& nskip, const string& datadir, + char **configmem, const int& configMemSize, const int& cachemode, writeout *out_a) { + + bool allInitBefore = true; + + if (O == NULL || C == NULL) + allInitBefore = false; + + cache = new configcache(cacheid, nequi, nskip, datadir, configmem, configMemSize, cachemode, out_a); + + if (Defaults == NULL) { + Defaults = new defaults; + Defaults->nequi = nequi; + Defaults->nskip = nskip; + Defaults->datadir = datadir; + Defaults->out = out_a; + } + + if (O != NULL && C != NULL && !allInitBefore) { + for (vector::iterator parit=delayedParaAdd.begin(); parit != delayedParaAdd.end(); ++parit) { + O->addPara(parit->parid, parit->val); + C->addPara(parit->parid, parit->val); + } + for (vector::iterator parit=delayedParaSet.begin(); parit != delayedParaSet.end(); ++parit) { + O->setPara(parit->parid, parit->val); + C->setPara(parit->parid, parit->val); + } + } +} + +void hypercache::initCache(configcache *cache, const string& subdir, + const string& cacheid, char **configmem, const int& configMemSize, const int& cachemode) { + if (Defaults == NULL) { + cerr << "Defaults were not initialized prior to short initialization!" << endl; + exit(1); + } + + initCache(cache, cacheid, Defaults->nequi, Defaults->nskip, Defaults->datadir + "/" + subdir, + configmem, configMemSize, cachemode, Defaults->out); +} + +void hypercache::addPara(const string& parid, const double& val) { + if (O == NULL || C == NULL) { + para newpara; + newpara.parid = parid; + newpara.val = val; + delayedParaAdd.push_back(newpara); + } + else { + O->addPara(parid, val); + C->addPara(parid, val); + } +} + +void hypercache::setPara(const string& parid, const double& val) { + if (O == NULL || C == NULL) { + para newpara; + newpara.parid = parid; + newpara.val = val; + delayedParaSet.push_back(newpara); + } + else { + O->setPara(parid, val); + C->setPara(parid, val); + } +} diff --git a/hypercache.h b/hypercache.h new file mode 100644 index 0000000..53e0f67 --- /dev/null +++ b/hypercache.h @@ -0,0 +1,65 @@ +#ifndef HYPERCACHE_H +#define HYPERCACHE_H + +#include + +#include "configcache.h" + +using namespace std; + +class hypercache { + public: + static void initO(const string& cacheid, const int& nequi, const int& nskip, const string& datadir, + char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL, writeout *out_a=NULL) { + initCache(O, cacheid, nequi, nskip, datadir+"/o", configmem, configMemSize, cachemode, out_a); + } + static void initC(const string& cacheid, const int& nequi, const int& nskip, const string& datadir, + char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL, writeout *out_a=NULL) { + initCache(C, cacheid, nequi, nskip, datadir+"/c", configmem, configMemSize, cachemode, out_a); + } + + static void initO(const string& cacheid, char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL) { + initCache(O, "o", cacheid, configmem, configMemSize, cachemode); + } + static void initC(const string& cacheid, char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL) { + initCache(C, "c", cacheid, configmem, configMemSize, cachemode); + } + + static void addPara(const string& parid, const double& val=0); + static void setPara(const string& parid, const double& value); + static bool readO() { return O->readConfig(); } + static bool readC() { return C->readConfig(); } + static void writeO() { O->writeConfig(); } + static void writeC() { C->writeConfig(); } + static void writeHeaderO(const string& headerid, char *header, long unsigned int size) { O->writeHeader(headerid, header, size); } + static void *getHeaderO(const string& headerid) { O->getHeader(headerid); } + static void writeHeaderC(const string& headerid, char *header, long unsigned int size) { C->writeHeader(headerid, header, size); } + static void *getHeaderC(const string& headerid) { C->getHeader(headerid); } + + private: + struct defaults{ + int nequi; + int nskip; + string datadir; + writeout *out; + }; + struct para{ + string parid; + double val; + }; + + static void initCache(configcache *cache, + const string& cacheid, const int& nequi, const int& nskip, const string& datadir, + char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL, writeout *out_a=NULL); + + static void initCache( configcache *cache, const string& subdir, + const string& cacheid, char **configmem, const int& configMemSize, const int& cachemode=CACHE_MODE_FULL); + + static configcache *O; + static configcache *C; + static defaults *Defaults; + static vector delayedParaAdd; + static vector delayedParaSet; +}; + +#endif