ValueStorage.h 3.19 KB
//
//  ValueStorage.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 13.06.2017.
//
//

#ifndef ValueStorage_h
#define ValueStorage_h

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

class ValueStorage {

    public:

        static ValueStorage& getInstance()
        {
            static ValueStorage 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 storeSimpleValue(const SimpleValue& value, const std::string& container = DefaultContainer);
        void storeSimpleValueWithKey(const SimpleValue& value, const std::string& key, const std::string& container = DefaultContainer);
        SimpleValue* getStoredSimpleValue(const std::string& key, const std::string& container = DefaultContainer);
        void removeStoredSimpleValue(const std::string&, const std::string& container = DefaultContainer);
        void removeAllStoredSimpleValues(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:
    
        ValueStorage()
        {
            _valueStorage = new rapidjson::Document();
        };
    
        ~ValueStorage(){
            this->clearStoredData();
            delete _valueStorage;
        };

        std::map<std::string, int> _lastStoredKeyNumbers; // per container
        const unsigned int _modulus = 10000;
        rapidjson::Document* _valueStorage;
        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, SimpleValue*>> _storedSimpleValues;
    
        std::string generateNextKey(const std::string& container);
    
};

#endif /* ValueStorage_h */