diff options
author | Ben Boeckel <mathstuf@gmail.com> | 2013-08-02 19:44:15 (GMT) |
---|---|---|
committer | Brad King <brad.king@kitware.com> | 2013-08-08 17:31:09 (GMT) |
commit | 0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3 (patch) | |
tree | 677af4bf1f9b6492ad012c86d638a3510f39e8ba | |
parent | fc7c3b4dc8522ad489a6fb67ac6030f302c65df3 (diff) | |
download | CMake-0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3.zip CMake-0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3.tar.gz CMake-0d6acb1df8c20bb21f4d328cf2c35d0cbb6d7ea3.tar.bz2 |
variable_watch: Add a deleter for the client data
The client data is arbitrary and the callback may be called an
unspecified number of times, so the cmVariableWatch must be the one to
delete the client data in the end (if it is needed at all).
-rw-r--r-- | Source/cmVariableWatch.cxx | 4 | ||||
-rw-r--r-- | Source/cmVariableWatch.h | 13 |
2 files changed, 14 insertions, 3 deletions
diff --git a/Source/cmVariableWatch.cxx b/Source/cmVariableWatch.cxx index 21b910d..21acd3b 100644 --- a/Source/cmVariableWatch.cxx +++ b/Source/cmVariableWatch.cxx @@ -53,11 +53,13 @@ cmVariableWatch::~cmVariableWatch() } void cmVariableWatch::AddWatch(const std::string& variable, - WatchMethod method, void* client_data /*=0*/) + WatchMethod method, void* client_data /*=0*/, + DeleteData delete_data /*=0*/) { cmVariableWatch::Pair* p = new cmVariableWatch::Pair; p->Method = method; p->ClientData = client_data; + p->DeleteDataCall = delete_data; cmVariableWatch::VectorOfPairs* vp = &this->WatchMap[variable]; cmVariableWatch::VectorOfPairs::size_type cc; for ( cc = 0; cc < vp->size(); cc ++ ) diff --git a/Source/cmVariableWatch.h b/Source/cmVariableWatch.h index 45273e5..d666815 100644 --- a/Source/cmVariableWatch.h +++ b/Source/cmVariableWatch.h @@ -26,6 +26,7 @@ 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(); @@ -34,7 +35,7 @@ public: * Add watch to the variable */ void AddWatch(const std::string& variable, WatchMethod method, - void* client_data=0); + void* client_data=0, DeleteData delete_data=0); void RemoveWatch(const std::string& variable, WatchMethod method); /** @@ -67,7 +68,15 @@ protected: { WatchMethod Method; void* ClientData; - Pair() : Method(0), ClientData(0) {} + DeleteData DeleteDataCall; + Pair() : Method(0), ClientData(0), DeleteDataCall(0) {} + ~Pair() + { + if (this->DeleteDataCall && this->ClientData) + { + this->DeleteDataCall(this->ClientData); + } + } }; typedef std::vector< Pair* > VectorOfPairs; |