Changeset 8e18b8e for src/ResolvExpr/TypeEnvironment.cc
- Timestamp:
- May 31, 2018, 4:24:49 PM (6 years ago)
- Branches:
- new-env, with_gc
- Children:
- 0182bfa, 1d7b0a8
- Parents:
- 75308bcc
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/TypeEnvironment.cc
r75308bcc r8e18b8e 17 17 #include <algorithm> // for copy, set_intersection 18 18 #include <iterator> // for ostream_iterator, insert_iterator 19 #include <utility> // for pair 19 #include <utility> // for pair, move 20 20 21 21 #include "Common/PassVisitor.h" // for PassVisitor<GcTracer> … … 79 79 } 80 80 81 bool TypeEnvironment::lookup( const std::string &var, EqvClass &eqvClass) const {81 const EqvClass* TypeEnvironment::lookup( const std::string &var ) const { 82 82 for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) { 83 83 if ( i->vars.find( var ) != i->vars.end() ) { 84 84 /// std::cout << var << " is in class "; 85 85 /// i->print( std::cout ); 86 eqvClass = *i; 87 return true; 86 return &*i; 88 87 } 89 88 /// std::cout << var << " is not in class "; 90 89 /// i->print( std::cout ); 91 90 } // 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 } 93 105 } 94 106 95 107 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) ); 108 115 } 109 116
Note: See TracChangeset
for help on using the changeset viewer.