AniValueStorage.h 3.25 KB
//
//  AniValueStorage.h
//  SteveMaggieCpp
//
//  Created by Katarzyna Kalinowska-Górska on 13.06.2017.
//
//

#ifndef AniValueStorage_h
#define AniValueStorage_h

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

class AniValueStorage {

    public:

        static AniValueStorage& getInstance()
        {
            static AniValueStorage 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 storeAniSimpleValue(const AniSimpleValue& value, const std::string& container = DefaultContainer);
        void storeAniSimpleValueWithKey(const AniSimpleValue& value, const std::string& key, const std::string& container = DefaultContainer);
        AniSimpleValue* getStoredAniSimpleValue(const std::string& key, const std::string& container = DefaultContainer);
        void removeStoredAniSimpleValue(const std::string&, const std::string& container = DefaultContainer);
        void removeAllStoredAniSimpleValues(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:
    
        AniValueStorage()
        {
            _AniValueStorage = new rapidjson::Document();
        };
    
        ~AniValueStorage(){
            this->clearStoredData();
            delete _AniValueStorage;
        };

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

#endif /* AniValueStorage_h */