Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/ValueStorage.hpp

    r03c902 re4afb4  
    99#define VALUESTORAGE_HPP_
    1010
    11 #include "Actions/MapOfActions.hpp"
     11#include <boost/filesystem.hpp>
     12#include <boost/lexical_cast.hpp>
     13#include <boost/program_options.hpp>
     14
     15#include <map>
     16#include <set>
     17#include <vector>
     18#include <typeinfo>
     19
     20#include "Actions/OptionTrait.hpp"
     21#include "Actions/OptionRegistry.hpp"
     22#include "Exceptions/IllegalTypeException.hpp"
     23#include "Exceptions/MissingValueException.hpp"
     24#include "Helpers/Assert.hpp"
     25#include "Patterns/Singleton.hpp"
     26
     27class MapOfActionsTest;
     28
     29class Box;
     30class atom;
     31class element;
     32class molecule;
     33class Vector;
     34
     35namespace po = boost::program_options;
     36
     37using boost::lexical_cast;
     38
    1239#include "Patterns/Singleton.hpp"
    1340
     
    2148
    2249public:
     50
     51  bool isCurrentValuePresent(const char *name) const;
     52  void queryCurrentValue(const char * name, const atom * &_T);
     53  void queryCurrentValue(const char * name, const element * &_T);
     54  void queryCurrentValue(const char * name, const molecule * &_T);
     55  void queryCurrentValue(const char * name, class Box &_T);
     56  void queryCurrentValue(const char * name, class Vector &_T);
     57  void queryCurrentValue(const char * name, class BoxVector &_T);
     58  void queryCurrentValue(const char * name, std::vector<const atom *>&_T);
     59  void queryCurrentValue(const char * name, std::vector<const element *>&_T);
     60  void queryCurrentValue(const char * name, std::vector<const molecule *>&_T);
     61  void queryCurrentValue(const char * name, boost::filesystem::path&_T);
     62
    2363  /** Gets a value from the storage
    2464   * If the value is not present, an ASSERT is thrown unless optional is set to true.
     
    2767   * \return true - value present, false - value not present (only given when optional set to true)
    2868   */
    29   template <typename T> bool queryCurrentValue(const char *name, T &_T, const bool optional = false) {
    30     if (optional) {
    31       if (!MapOfActions_instance.isCurrentValuePresent(name))
    32         return false;
    33     }
    34     MapOfActions_instance.queryCurrentValue(name, _T);
    35     return true;
     69  template<typename T> void queryCurrentValue(const char * name, T &_T)
     70  {
     71    if (typeid( T ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
     72      if (CurrentValueMap.find(name) == CurrentValueMap.end())
     73        throw MissingValueException(__FILE__, __LINE__);
     74      _T = lexical_cast<T>(CurrentValueMap[name].c_str());
     75      CurrentValueMap.erase(name);
     76    } else
     77      throw IllegalTypeException(__FILE__,__LINE__);
    3678  }
     79  template<typename T> void queryCurrentValue(const char * name, std::vector<T> &_T)
     80  {
     81    T temp;
     82    if (typeid( std::vector<T> ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) { // constructor of type_info is private, hence can only store by ref or ptr
     83      if (CurrentValueMap.find(name) == CurrentValueMap.end())
     84        throw MissingValueException(__FILE__, __LINE__);
     85      std::istringstream stream(CurrentValueMap[name]);
     86      CurrentValueMap.erase(name);
     87      while (!stream.fail()) {
     88        stream >> temp >> std::ws;
     89        _T.push_back(temp);
     90      }
     91    } else
     92      throw IllegalTypeException(__FILE__,__LINE__);
     93  }
     94
     95  void setCurrentValue(const char * name, const atom * &_T);
     96  void setCurrentValue(const char * name, const element * &_T);
     97  void setCurrentValue(const char * name, const molecule * &_T);
     98  void setCurrentValue(const char * name, class Box &_T);
     99  void setCurrentValue(const char * name, class Vector &_T);
     100  void setCurrentValue(const char * name, std::vector<const atom *>&_T);
     101  void setCurrentValue(const char * name, std::vector<const element *>&_T);
     102  void setCurrentValue(const char * name, std::vector<const molecule *>&_T);
     103  void setCurrentValue(const char * name, boost::filesystem::path&_T);
    37104
    38105  /** Sets a value in the storage.
     
    40107   * \param _T value
    41108   */
    42   template <typename T> void setCurrentValue(const char *name, T &_T) {
    43     MapOfActions_instance.setCurrentValue(name, _T);
     109  template<class T> void setCurrentValue(const char * name, T &_T)
     110  {
     111    std::ostringstream stream;
     112    if (typeid( T ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) {  // constructor of type_info is private, hence can only store by ref or ptr
     113      stream << _T;
     114      CurrentValueMap[name] = stream.str();
     115    } else
     116      throw IllegalTypeException(__FILE__,__LINE__);
     117  }
     118  /** Sets a value in the storage.
     119   * \param name key of value
     120   * \param _T value
     121   */
     122  template<class T> void setCurrentValue(const char * name, std::vector<T> &_T)
     123  {
     124    std::ostringstream stream;
     125    if (typeid( std::vector<T> ) == *(OptionRegistry_instance.getOptionByName(name)->getType())) {  // constructor of type_info is private, hence can only store by ref or ptr
     126      std::ostringstream stream;
     127      for (typename std::vector<T>::const_iterator iter = _T.begin(); iter != _T.end(); ++iter) {
     128        stream << (*iter) << " ";
     129      }
     130      CurrentValueMap[name] = stream.str();
     131    } else
     132      throw IllegalTypeException(__FILE__,__LINE__);
    44133  }
    45134
    46   /** Obtain a descriptive text for a given key.
    47    * \param actionname key
    48    * \return text describing the key's contents
    49    */
    50   std::string getDescription(std::string actionname);
     135  const std::string getCurrentValue(std::string actionname);
    51136
    52137protected:
     
    54139  ~ValueStorage();
    55140
    56   MapOfActions &MapOfActions_instance;
     141  std::map<std::string, std::string> CurrentValueMap;
     142
     143  OptionRegistry &OptionRegistry_instance;
    57144};
    58145
Note: See TracChangeset for help on using the changeset viewer.