Ignore:
Timestamp:
May 31, 2018, 4:24:49 PM (6 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
new-env, with_gc
Children:
0182bfa, 1d7b0a8
Parents:
75308bcc
Message:

stop eagerly copying EqvClass? on lookup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/TypeEnvironment.cc

    r75308bcc r8e18b8e  
    1717#include <algorithm>                   // for copy, set_intersection
    1818#include <iterator>                    // for ostream_iterator, insert_iterator
    19 #include <utility>                     // for pair
     19#include <utility>                     // for pair, move
    2020
    2121#include "Common/PassVisitor.h"        // for PassVisitor<GcTracer>
     
    7979        }
    8080
    81         bool TypeEnvironment::lookup( const std::string &var, EqvClass &eqvClass ) const {
     81        const EqvClass* TypeEnvironment::lookup( const std::string &var ) const {
    8282                for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) {
    8383                        if ( i->vars.find( var ) != i->vars.end() ) {
    8484///       std::cout << var << " is in class ";
    8585///       i->print( std::cout );
    86                                 eqvClass = *i;
    87                                 return true;
     86                                return &*i;
    8887                        }
    8988///     std::cout << var << " is not in class ";
    9089///     i->print( std::cout );
    9190                } // for
    92                 return false;
     91                return nullptr;
     92        }
     93
     94        /// Removes any class from env that intersects eqvClass
     95        void filterOverlappingClasses( std::list<EqvClass> &env, const EqvClass &eqvClass ) {
     96                for ( auto i = env.begin(); i != env.end(); ) {
     97                        auto next = i;
     98                        ++next;
     99                        std::set<std::string> intersection;
     100                        std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(),
     101                                std::inserter( intersection, intersection.begin() ) );
     102                        if ( ! intersection.empty() ) { env.erase( i ); }
     103                        i = next;
     104                }
    93105        }
    94106
    95107        void TypeEnvironment::add( const EqvClass &eqvClass ) {
    96                 std::list< EqvClass >::iterator i = env.begin();
    97                 while ( i != env.end() ) {
    98                         std::list< EqvClass >::iterator next = i;
    99                         next++;
    100                         std::set< std::string > intersection;
    101                         std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(), std::inserter( intersection, intersection.begin() ) );
    102                         if ( ! intersection.empty() ) {
    103                                 env.erase( i );
    104                         } // if
    105                         i = next;
    106                 } // while
    107                 env.insert( env.end(), eqvClass );
     108                filterOverlappingClasses( env, eqvClass );
     109                env.push_back( eqvClass );
     110        }
     111
     112        void TypeEnvironment::add( EqvClass &&eqvClass ) {
     113                filterOverlappingClasses( env, eqvClass );
     114                env.push_back( std::move(eqvClass) );
    108115        }
    109116
Note: See TracChangeset for help on using the changeset viewer.