/*
 * This file is part of the Cforall project
 *
 * $Id: ScrubTyVars.h,v 1.4 2005/08/29 20:14:13 rcbilson Exp $
 *
 */

#ifndef GENPOLY_SCRUBTYVARS_H
#define GENPOLY_SCRUBTYVARS_H

#include "GenPoly.h"

#include "SynTree/SynTree.h"
#include "SynTree/Mutator.h"

namespace GenPoly {

class ScrubTyVars : public Mutator
{
public:
  ScrubTyVars( bool doAll, const TyVarMap &tyVars ): doAll( doAll ), tyVars( tyVars ) {}
  
  template< typename SynTreeClass >
  static SynTreeClass *scrub( SynTreeClass *target, const TyVarMap &tyVars );
  template< typename SynTreeClass >
  static SynTreeClass *scrub( SynTreeClass *target );
  
  virtual Type* mutate( TypeInstType *typeInst );
  virtual Type* mutate( PointerType *pointer );

private:
  bool doAll;
  const TyVarMap &tyVars;
};

/* static class method */
template< typename SynTreeClass >
SynTreeClass *
ScrubTyVars::scrub( SynTreeClass *target, const TyVarMap &tyVars )
{
  ScrubTyVars scrubber( false, tyVars );
  return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
}

/* static class method */
template< typename SynTreeClass >
SynTreeClass *
ScrubTyVars::scrub( SynTreeClass *target )
{
  TyVarMap tyVars;
  ScrubTyVars scrubber( true, tyVars );
  return static_cast< SynTreeClass* >( target->acceptMutator( scrubber ) );
}

} // namespace GenPoly

#endif /* #ifndef GENPOLY_SCRUBTYVARS_H */
