/// This file is part of the X3DToolKit library
/// Copyright (C) 2002-2004  Yannick Le Goc (legoc@imag.fr)

/// http://artis.imag.fr/Members/Yannick.Legoc/X3D/

/// This library is free software; you can redistribute it and/or
/// modify it under the terms of the GNU Lesser General Public
/// License as published by the Free Software Foundation; either
/// version 2.1 of the License, or (at your option) any later version.

/// This library is distributed in the hope that it will be useful,
/// but WITHOUT ANY WARRANTY; without even the implied warranty of
/// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
/// Lesser General Public License for more details.

/// You should have received a copy of the GNU Lesser General Public
/// License along with this library; if not, write to the Free Software
/// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
////////////////////////////////////////////////////////////////////////////////
//                            MemReleaserStateVariables.h                     //
////////////////////////////////////////////////////////////////////////////////

#ifndef MEMRELEASERGLOBALVARIABLES_H
#define MEMRELEASERGLOBALVARIABLES_H

#include "StateVariables.h"

namespace X3DTK {

/// StateVariables for the MemReleaser processor.

class MemReleaserStateVariables : public StateVariables
{
public:
  /// Constructor.
  MemReleaserStateVariables();
  /// Destructor.
  virtual ~MemReleaserStateVariables();

  /// Initializes the traversal.
  void init();
  /// Finishes the traversal.
  void finish();
  
  /// Sets the verbose option.
  void setVerbose(bool verbose);
  
  /// Pushes the parent.
  void pushParent(SFNode P);
  /// Pops the parent.
  void popParent();
  /// Sets the current node to be deleted.
  void setDelete(bool value);
  /// Adds the node N to be deleted.
  void addNodeToDelete(X3DAbstractNode *N);
  
  /// Gets the parent.
  SFNode getParent() const {return _nodeStack.front();};
  /// Gets the current node to be deleted or not.
  bool getDelete() const;

private: 
  bool _verbose;
  MFNode _nodeStack;
  MFNode _toDeleteNodes;
  bool _toDelete;  
};

}

#endif
