#include <algorithm>
#include <iostream>
#include <cassert>
#include <list>

#include "Mutate.h"
#include "ChooseMutator.h"
#include "LabelFixer.h"
#include "MLEMutator.h"
#include "CaseRangeMutator.h"
#include "ForExprMutator.h"
#include "LabelTypeChecker.h"
//#include "ExceptMutator.h"

#include "utility.h"

#include "SynTree/Visitor.h"

using namespace std;

namespace ControlStruct {
    void mutate( std::list< Declaration * > translationUnit ) {
	ChooseMutator chmut;
	ForExprMutator formut;
	CaseRangeMutator ranges;  // has to run after ChooseMutator
	LabelFixer lfix;
	//ExceptMutator exc;
	LabelTypeChecker lbl;

	mutateAll( translationUnit, formut );
	acceptAll( translationUnit, lfix );
	mutateAll( translationUnit, chmut );
	mutateAll( translationUnit, ranges );
	//mutateAll( translationUnit, exc );
	//acceptAll( translationUnit, lbl );
    }
} // namespace CodeGen
