HValueStorage.h 3.21 KB
//
//  HValueStorage.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 13.06.2017.
//
//

#ifndef HValueStorage_h
#define HValueStorage_h

#include "json/document.h"
#include "HSimpleValue.h"

class HValueStorage {

    public:

        static HValueStorage& getInstance()
        {
            static HValueStorage instance;
            return instance;
        };

        static const std::string DefaultContainer;

        std::string storeValue(const rapidjson::Value& value, const std::string& container = DefaultContainer);
        void storeValueWithKey(const rapidjson::Value& value, const std::string& key, const std::string& container = DefaultContainer);
        rapidjson::Value* getStoredValue(const std::string& key, const std::string& container = DefaultContainer);
        void removeStoredValue(const std::string& key, const std::string& container = DefaultContainer);
        void removeAllStoredValues(const std::string& container = "");
    
        std::string storeFunction(std::function<void()> callback, const std::string& container = DefaultContainer);
        void storeFunctionWithKey(std::function<void()> callback, const std::string& key, const std::string& container = DefaultContainer);
        std::function<void()> getStoredFunction(const std::string& key, const std::string& container = DefaultContainer);
        void runStoredFunction(const std::string& key, const std::string& container = DefaultContainer);
        void runAndRemoveStoredFunction(const std::string& key, const std::string& container = DefaultContainer);
        void removeStoredFunction(const std::string& key, const std::string& container = DefaultContainer);
        void removeAllStoredFunctions(const std::string& container = "");

        std::string storeHSimpleValue(const HSimpleValue& value, const std::string& container = DefaultContainer);
        void storeHSimpleValueWithKey(const HSimpleValue& value, const std::string& key, const std::string& container = DefaultContainer);
        HSimpleValue* getStoredHSimpleValue(const std::string& key, const std::string& container = DefaultContainer);
        void removeStoredHSimpleValue(const std::string&, const std::string& container = DefaultContainer);
        void removeAllStoredHSimpleValues(const std::string& container = "");

        // if no container is provided, data from all containers (including the default container) will be cleared
        void clearStoredData(const std::string& container = "");

    protected:
    
        HValueStorage()
        {
            _HValueStorage = new rapidjson::Document();
        };
    
        ~HValueStorage(){
            this->clearStoredData();
            delete _HValueStorage;
        };

        std::map<std::string, int> _lastStoredKeyNumbers; // per container
        const unsigned int _modulus = 10000;
        rapidjson::Document* _HValueStorage;
        std::map<std::string, std::map<std::string, rapidjson::Value*>> _storedValues;
        std::map<std::string, std::map<std::string, std::function<void()>>> _storedFunctions;
        std::map<std::string, std::map<std::string, HSimpleValue*>> _storedHSimpleValues;
    
        std::string generateNextKey(const std::string& container);
    
};

#endif /* HValueStorage_h */