Changeset 00ac42e for src/ResolvExpr/TypeEnvironment.cc
- Timestamp:
- Jun 1, 2018, 2:54:55 PM (7 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, with_gc
- Children:
- 262bd63
- Parents:
- 41e16b1
- git-author:
- Aaron Moss <a3moss@…> (05/31/18 16:24:49)
- git-committer:
- Aaron Moss <a3moss@…> (06/01/18 14:54:55)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/TypeEnvironment.cc
r41e16b1 r00ac42e 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/utility.h" // for maybeClone … … 44 44 45 45 void EqvClass::initialize( const EqvClass &src, EqvClass &dest ) { 46 initialize( src, dest, src.type ); 47 } 48 49 void EqvClass::initialize( const EqvClass &src, EqvClass &dest, const Type *ty ) { 46 50 dest.vars = src.vars; 47 dest.type = maybeClone( src.type);51 dest.type = maybeClone( ty ); 48 52 dest.allowWidening = src.allowWidening; 49 53 dest.data = src.data; … … 55 59 EqvClass::EqvClass( const EqvClass &other ) { 56 60 initialize( other, *this ); 61 } 62 63 EqvClass::EqvClass( const EqvClass &other, const Type *ty ) { 64 initialize( other, *this, ty ); 57 65 } 58 66 … … 82 90 } 83 91 84 bool TypeEnvironment::lookup( const std::string &var, EqvClass &eqvClass) const {92 const EqvClass* TypeEnvironment::lookup( const std::string &var ) const { 85 93 for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) { 86 94 if ( i->vars.find( var ) != i->vars.end() ) { 87 95 /// std::cout << var << " is in class "; 88 96 /// i->print( std::cout ); 89 eqvClass = *i; 90 return true; 97 return &*i; 91 98 } 92 99 /// std::cout << var << " is not in class "; 93 100 /// i->print( std::cout ); 94 101 } // for 95 return false; 102 return nullptr; 103 } 104 105 /// Removes any class from env that intersects eqvClass 106 void filterOverlappingClasses( std::list<EqvClass> &env, const EqvClass &eqvClass ) { 107 for ( auto i = env.begin(); i != env.end(); ) { 108 auto next = i; 109 ++next; 110 std::set<std::string> intersection; 111 std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(), 112 std::inserter( intersection, intersection.begin() ) ); 113 if ( ! intersection.empty() ) { env.erase( i ); } 114 i = next; 115 } 96 116 } 97 117 98 118 void TypeEnvironment::add( const EqvClass &eqvClass ) { 99 std::list< EqvClass >::iterator i = env.begin(); 100 while ( i != env.end() ) { 101 std::list< EqvClass >::iterator next = i; 102 next++; 103 std::set< std::string > intersection; 104 std::set_intersection( i->vars.begin(), i->vars.end(), eqvClass.vars.begin(), eqvClass.vars.end(), std::inserter( intersection, intersection.begin() ) ); 105 if ( ! intersection.empty() ) { 106 env.erase( i ); 107 } // if 108 i = next; 109 } // while 110 env.insert( env.end(), eqvClass ); 119 filterOverlappingClasses( env, eqvClass ); 120 env.push_back( eqvClass ); 121 } 122 123 void TypeEnvironment::add( EqvClass &&eqvClass ) { 124 filterOverlappingClasses( env, eqvClass ); 125 env.push_back( std::move(eqvClass) ); 111 126 } 112 127
Note: See TracChangeset
for help on using the changeset viewer.