Browse Source

variable_watch: Allow specifying the data to match in RemoveWatch

Now that watches are dependent on their client_data when adding, it also
makes sense to allow matching the data for removal.
Ben Boeckel 12 years ago
parent
commit
34b397e8de
2 changed files with 8 additions and 3 deletions
  1. 6 2
      Source/cmVariableWatch.cxx
  2. 2 1
      Source/cmVariableWatch.h

+ 6 - 2
Source/cmVariableWatch.cxx

@@ -77,13 +77,17 @@ bool cmVariableWatch::AddWatch(const std::string& variable,
 }
 
 void cmVariableWatch::RemoveWatch(const std::string& variable,
-                                  WatchMethod method)
+                                  WatchMethod method,
+                                  void* client_data /*=0*/)
 {
   cmVariableWatch::VectorOfPairs* vp = &this->WatchMap[variable];
   cmVariableWatch::VectorOfPairs::iterator it;
   for ( it = vp->begin(); it != vp->end(); ++it )
     {
-    if ( (*it)->Method == method )
+    if ( (*it)->Method == method &&
+         // If client_data is NULL, we want to disconnect all watches against
+         // the given method; otherwise match ClientData as well.
+         (!client_data || (client_data == (*it)->ClientData)))
       {
       delete *it;
       vp->erase(it);

+ 2 - 1
Source/cmVariableWatch.h

@@ -36,7 +36,8 @@ public:
    */
   bool AddWatch(const std::string& variable, WatchMethod method,
                 void* client_data=0, DeleteData delete_data=0);
-  void RemoveWatch(const std::string& variable, WatchMethod method);
+  void RemoveWatch(const std::string& variable, WatchMethod method,
+                   void* client_data=0);
 
   /**
    * This method is called when variable is accessed