/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 * 
 * File:   DominatorsTreeAnalysisProvider.h
 * Author: pgess  <v.melnychenko@xreate.org>
 *
 * Created on May 13, 2016, 11:39 AM
 */

#ifndef DOMINATORSTREEANALYSISPROVIDER_H
#define DOMINATORSTREEANALYSISPROVIDER_H

#include "transcendlayer.h"
#include <boost/smart_ptr/scoped_ptr.hpp>

namespace xreate{namespace dominators{

class DominatorsProviderPrivate;

/** \brief Dominators Analysis report */
class DominatorsTreeAnalysisProvider: public IAnalysisReport {
public:
    typedef std::pair<ScopePacked, ScopePacked> DominatedRange;
    typedef std::map<ScopePacked, DominatedRange> Dominators;

    DominatorsTreeAnalysisProvider();
    virtual ~DominatorsTreeAnalysisProvider();

    void run(const cfa::CFAGraph* graph);
    void print(std::ostringstream& output) const override;

    const Dominators& getForwardDominators() const;
    const Dominators& getPostDominators() const;

private:
    std::unique_ptr<DominatorsProviderPrivate> __private;
};

}} //end of namespace xreate::dominators

#endif /* DOMINATORSTREEANALYSISPROVIDER_H */

