Ignore:
Timestamp:
Jun 1, 2018, 2:54:55 PM (7 years ago)
Author:
Aaron Moss <a3moss@…>
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)
Message:

stop eagerly copying EqvClass? on lookup

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/TypeEnvironment.cc

    r41e16b1 r00ac42e  
    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/utility.h"            // for maybeClone
     
    4444
    4545        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 ) {
    4650                dest.vars = src.vars;
    47                 dest.type = maybeClone( src.type );
     51                dest.type = maybeClone( ty );
    4852                dest.allowWidening = src.allowWidening;
    4953                dest.data = src.data;
     
    5559        EqvClass::EqvClass( const EqvClass &other ) {
    5660                initialize( other, *this );
     61        }
     62
     63        EqvClass::EqvClass( const EqvClass &other, const Type *ty ) {
     64                initialize( other, *this, ty );
    5765        }
    5866
     
    8290        }
    8391
    84         bool TypeEnvironment::lookup( const std::string &var, EqvClass &eqvClass ) const {
     92        const EqvClass* TypeEnvironment::lookup( const std::string &var ) const {
    8593                for ( std::list< EqvClass >::const_iterator i = env.begin(); i != env.end(); ++i ) {
    8694                        if ( i->vars.find( var ) != i->vars.end() ) {
    8795///       std::cout << var << " is in class ";
    8896///       i->print( std::cout );
    89                                 eqvClass = *i;
    90                                 return true;
     97                                return &*i;
    9198                        }
    9299///     std::cout << var << " is not in class ";
    93100///     i->print( std::cout );
    94101                } // 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                }
    96116        }
    97117
    98118        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) );
    111126        }
    112127
Note: See TracChangeset for help on using the changeset viewer.