/*=========================================================================

  Program:   CMake - Cross-Platform Makefile Generator
  Module:    $RCSfile$
  Language:  C++
  Date:      $Date$
  Version:   $Revision$

  Copyright (c) 2002 Kitware, Inc., Insight Consortium.  All rights reserved.
  See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.

     This software is distributed WITHOUT ANY WARRANTY; without even 
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/
#ifndef cmVariableWatch_h
#define cmVariableWatch_h

#include "cmStandardIncludes.h"

/** \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);

  cmVariableWatch();
  ~cmVariableWatch();

  /**
   * Add watch to the variable
   */
  void AddWatch(const std::string& variable, WatchMethod method,
                void* client_data=0);
  void RemoveWatch(const std::string& variable, WatchMethod method);
  
  /**
   * This method is called when variable is accessed
   */
  void VariableAccessed(const std::string& variable, int access_type) const;

  /**
   * Different access types.
   */
  enum
    {
      VARIABLE_READ_ACCESS,
      UNKNOWN_VARIABLE_READ_ACCESS,
      ALLOWED_UNKNOWN_VARIABLE_READ_ACCESS,
      VARIABLE_MODIFIED_ACCESS,
      VARIABLE_REMOVED_ACCESS,
      NO_ACCESS
    };
  
protected:
  struct Pair
  {
    WatchMethod Method;
    void*        ClientData;
    Pair() : Method(0), ClientData(0) {}
  };

  typedef std::vector< Pair > VectorOfPairs;
  typedef std::map<cmStdString, VectorOfPairs > StringToVectorOfPairs;

  StringToVectorOfPairs WatchMap;
};


#endif
