diff options
Diffstat (limited to 'Source/cmVariableWatch.h')
-rw-r--r-- | Source/cmVariableWatch.h | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/Source/cmVariableWatch.h b/Source/cmVariableWatch.h new file mode 100644 index 0000000..1230101 --- /dev/null +++ b/Source/cmVariableWatch.h @@ -0,0 +1,86 @@ +/* Distributed under the OSI-approved BSD 3-Clause License. See accompanying + file Copyright.txt or https://cmake.org/licensing for details. */ +#ifndef cmVariableWatch_h +#define cmVariableWatch_h + +#include "cmConfigure.h" // IWYU pragma: keep + +#include <map> +#include <memory> // IWYU pragma: keep +#include <string> +#include <vector> + +class cmMakefile; + +/** \class cmVariableWatch + * \brief Helper class for watching of variable accesses. + * + * Calls function when variable is accessed + */ +class cmVariableWatch +{ +public: + typedef void (*WatchMethod)(const std::string& variable, int access_type, + void* client_data, const char* newValue, + const cmMakefile* mf); + typedef void (*DeleteData)(void* client_data); + + cmVariableWatch(); + ~cmVariableWatch(); + + /** + * Add watch to the variable + */ + bool AddWatch(const std::string& variable, WatchMethod method, + void* client_data = nullptr, DeleteData delete_data = nullptr); + void RemoveWatch(const std::string& variable, WatchMethod method, + void* client_data = nullptr); + + /** + * This method is called when variable is accessed + */ + bool VariableAccessed(const std::string& variable, int access_type, + const char* newValue, const cmMakefile* mf) const; + + /** + * Different access types. + */ + enum + { + VARIABLE_READ_ACCESS = 0, + UNKNOWN_VARIABLE_READ_ACCESS, + UNKNOWN_VARIABLE_DEFINED_ACCESS, + VARIABLE_MODIFIED_ACCESS, + VARIABLE_REMOVED_ACCESS, + NO_ACCESS + }; + + /** + * Return the access as string + */ + static const char* GetAccessAsString(int access_type); + +protected: + struct Pair + { + WatchMethod Method = nullptr; + void* ClientData = nullptr; + DeleteData DeleteDataCall = nullptr; + ~Pair() + { + if (this->DeleteDataCall && this->ClientData) { + this->DeleteDataCall(this->ClientData); + } + } + Pair() = default; + Pair(const Pair&) = delete; + Pair& operator=(const Pair&) = delete; + }; + + typedef std::vector<std::shared_ptr<Pair>> VectorOfPairs; + typedef std::map<std::string, VectorOfPairs> StringToVectorOfPairs; + + StringToVectorOfPairs WatchMap; +}; + +#endif |