| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*============================================================================
- CMake - Cross Platform Makefile Generator
- Copyright 2000-2009 Kitware, Inc., Insight Software Consortium
- Distributed under the OSI-approved BSD License (the "License");
- see accompanying file Copyright.txt for details.
- This software is distributed WITHOUT ANY WARRANTY; without even the
- implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- See the License for more information.
- ============================================================================*/
- #include "cmVariableWatch.h"
- static const char* const cmVariableWatchAccessStrings[] =
- {
- "READ_ACCESS",
- "UNKNOWN_READ_ACCESS",
- "UNKNOWN_DEFINED_ACCESS",
- "ALLOWED_UNKNOWN_READ_ACCESS",
- "MODIFIED_ACCESS",
- "REMOVED_ACCESS",
- "NO_ACCESS"
- };
- const char* cmVariableWatch::GetAccessAsString(int access_type)
- {
- if ( access_type < 0 || access_type >= cmVariableWatch::NO_ACCESS )
- {
- return "NO_ACCESS";
- }
- return cmVariableWatchAccessStrings[access_type];
- }
- cmVariableWatch::cmVariableWatch()
- {
- }
- cmVariableWatch::~cmVariableWatch()
- {
- cmVariableWatch::StringToVectorOfPairs::iterator svp_it;
- for ( svp_it = this->WatchMap.begin();
- svp_it != this->WatchMap.end(); ++svp_it )
- {
- cmVariableWatch::VectorOfPairs::iterator p_it;
- for ( p_it = svp_it->second.begin();
- p_it != svp_it->second.end(); ++p_it )
- {
- delete *p_it;
- }
- }
- }
- bool cmVariableWatch::AddWatch(const std::string& variable,
- 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 ++ )
- {
- cmVariableWatch::Pair* pair = (*vp)[cc];
- if ( pair->Method == method &&
- client_data && client_data == pair->ClientData)
- {
- // Callback already exists
- return false;
- }
- }
- vp->push_back(p);
- return true;
- }
- void cmVariableWatch::RemoveWatch(const std::string& variable,
- WatchMethod method,
- void* client_data /*=0*/)
- {
- if ( !this->WatchMap.count(variable) )
- {
- return;
- }
- cmVariableWatch::VectorOfPairs* vp = &this->WatchMap[variable];
- cmVariableWatch::VectorOfPairs::iterator it;
- for ( it = vp->begin(); it != vp->end(); ++it )
- {
- 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);
- return;
- }
- }
- }
- void cmVariableWatch::VariableAccessed(const std::string& variable,
- int access_type,
- const char* newValue,
- const cmMakefile* mf) const
- {
- cmVariableWatch::StringToVectorOfPairs::const_iterator mit =
- this->WatchMap.find(variable);
- if ( mit != this->WatchMap.end() )
- {
- const cmVariableWatch::VectorOfPairs* vp = &mit->second;
- cmVariableWatch::VectorOfPairs::const_iterator it;
- for ( it = vp->begin(); it != vp->end(); it ++ )
- {
- (*it)->Method(variable, access_type, (*it)->ClientData,
- newValue, mf);
- }
- }
- }
|