// Phase is a collection of Pass(es)
using Phase = std::vector<std::unique_ptr<Pass>>;
+enum class PhaseEvent
+{
+ PhaseBegin,
+ PhaseEnd,
+
+ PassBegin,
+ PassEnd,
+};
+
+template <PhaseEvent E> struct PhaseEventInfo;
+
+template <> class PhaseEventInfo<PhaseEvent::PhaseBegin>
+{
+ // Empty
+};
+
+template <> class PhaseEventInfo<PhaseEvent::PhaseEnd>
+{
+ // Empty
+};
+
+template <> class PhaseEventInfo<PhaseEvent::PassBegin>
+{
+public:
+ void pass(const Pass *pass) { _pass = pass; }
+ const Pass *pass(void) const { return _pass; }
+
+private:
+ const Pass *_pass;
+};
+
+template <> class PhaseEventInfo<PhaseEvent::PassEnd>
+{
+public:
+ void pass(const Pass *pass) { _pass = pass; }
+ const Pass *pass(void) const { return _pass; }
+
+ void changed(bool changed) { _changed = changed; }
+ bool changed(void) const { return _changed; }
+
+private:
+ const Pass *_pass;
+ bool _changed;
+};
+
+struct PhaseEventListener
+{
+ virtual ~PhaseEventListener() = default;
+
+ virtual void notify(const PhaseEventInfo<PhaseEvent::PhaseBegin> *) { return; };
+ virtual void notify(const PhaseEventInfo<PhaseEvent::PhaseEnd> *) { return; };
+ virtual void notify(const PhaseEventInfo<PhaseEvent::PassBegin> *) { return; };
+ virtual void notify(const PhaseEventInfo<PhaseEvent::PassEnd> *) { return; };
+};
+
enum class PhaseStrategy
{
// Run all the passes until there is no pass that makes a change