/*******************************************************************\

Module:

Author: Daniel Kroening, kroening@cs.cmu.edu

\*******************************************************************/

#ifndef CPROVER_UTIL_EXPR_VISITOR
#define CPROVER_UTIL_EXPR_VISITOR

#include "expr.h"

class expr_visitort
{
public:

  void operator() (exprt &expr)
  {
    visitor(expr);
  }

  void operator() (const exprt &expr)
  {
    visitor(expr);
  }
  
  virtual ~expr_visitort()
  {
  }

protected:
  void visitor(exprt &expr)
  {
    pre_visitor(expr);

    Forall_operands(it, expr)
      visitor(*it);
      
    post_visitor(expr);
  }

  virtual void pre_visitor(exprt &expr)
  {
  }

  virtual void post_visitor(exprt &expr)
  {
  }
  
  void visitor(const exprt &expr)
  {
    pre_visitor(expr);

    forall_operands(it, expr)
      visitor(*it);
      
    post_visitor(expr);
  }

  virtual void pre_visitor(const exprt &expr)
  {
  }

  virtual void post_visitor(const exprt &expr)
  {
  }
};

#endif
