/* 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 "clasplayer.h"
#include <boost/smart_ptr/scoped_ptr.hpp>

namespace xreate{namespace dominators{
    class DominatorTree;
    
    class DominatorsTreeAnalysisProvider: public IAnalysisData {
    public:
        typedef std::pair<ScopePacked, ScopePacked> DominatedRange;
        typedef std::map<ScopePacked, DominatedRange> Dominators;
        
        DominatorsTreeAnalysisProvider();
        virtual ~DominatorsTreeAnalysisProvider();

        void run(const ClaspLayer* engine);
        void print(std::ostringstream& output) const;
        
        const Dominators& getForwardDominators() const;
        const Dominators& getPostDominators() const;
        
    private:
        boost::scoped_ptr<DominatorTree> treeForwardDominators;
        boost::scoped_ptr<DominatorTree> treePostDominators;
    };
}} //end of namespace xreate::dominators

#endif /* DOMINATORSTREEANALYSISPROVIDER_H */

