Ignore:
Timestamp:
May 17, 2015, 1:19:35 PM (9 years ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
Children:
0dd3a2f
Parents:
b87a5ed
Message:

licencing: second groups of files

File:
1 edited

Legend:

Unmodified
Added
Removed
  • translator/Tuples/TupleAssignment.cc

    rb87a5ed ra32b204  
    1919  bool TupleAssignSpotter::pointsToTuple( Expression *expr ) {
    2020    // also check for function returning tuple of reference types
    21     if(AddressExpr *addr = dynamic_cast<AddressExpr *>(expr) )
    22       if( isTuple(addr->get_arg() ) )
     21    if (AddressExpr *addr = dynamic_cast<AddressExpr *>(expr) )
     22      if ( isTuple(addr->get_arg() ) )
    2323        return true;
    2424    return false;
     
    2626
    2727  bool TupleAssignSpotter::isTupleVar( DeclarationWithType *decl ) {
    28     if( dynamic_cast<TupleType *>(decl->get_type()) )
     28    if ( dynamic_cast<TupleType *>(decl->get_type()) )
    2929      return true;
    3030    return false;
     
    3333  bool TupleAssignSpotter::isTuple( Expression *expr, bool isRight ) {
    3434    // true if `expr' is an expression returning a tuple: tuple, tuple variable or MRV function
    35     if ( !expr ) return false;
    36 
    37     if( dynamic_cast<TupleExpr *>(expr) )
    38       return true;
    39     else if( VariableExpr *var = dynamic_cast<VariableExpr *>(expr) ) {
    40       if( isTupleVar(var->get_var()) )
     35    if ( ! expr ) return false;
     36
     37    if ( dynamic_cast<TupleExpr *>(expr) )
     38      return true;
     39    else if ( VariableExpr *var = dynamic_cast<VariableExpr *>(expr) ) {
     40      if ( isTupleVar(var->get_var()) )
    4141        return true;
    4242    }
     
    5252      return false;
    5353
    54     if( new_assigns.empty() ) return false;
     54    if ( new_assigns.empty() ) return false;
    5555    /*return */matcher->solve( new_assigns );
    56     if( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
     56    if ( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
    5757      // now resolve new assignments
    5858      std::list< Expression * > solved_assigns;
     
    6161
    6262      ResolvExpr::AltList current;
    63       for( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
     63      for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
    6464        //try {
    6565        ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
     
    8080      return true;
    8181    } else { // mass assignment
    82       //if( new_assigns.empty() ) return false;
     82      //if ( new_assigns.empty() ) return false;
    8383      std::list< Expression * > solved_assigns;
    8484      ResolvExpr::AltList solved_alts;
     
    8787      ResolvExpr::AltList current;
    8888      if ( optMass.empty() ) {
    89         for( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
     89        for ( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
    9090          optMass.push_back( ResolvExpr::AltList() );
    9191      }
    9292      int cnt = 0;
    93       for( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
     93      for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
    9494
    9595        ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
     
    110110
    111111  bool TupleAssignSpotter::isMVR( Expression *expr ) {
    112     if( expr->get_results().size() > 1 ) {
     112    if ( expr->get_results().size() > 1 ) {
    113113      // MVR processing
    114114      return true;
     
    118118
    119119  bool TupleAssignSpotter::isTupleAssignment( UntypedExpr * expr, std::list<ResolvExpr::AltList> &possibilities ) {
    120     if(  NameExpr *assgnop = dynamic_cast< NameExpr * >(expr->get_function()) ) {
    121 
    122       if( assgnop->get_name() == std::string("?=?") ) {
    123 
    124         for( std::list<ResolvExpr::AltList>::iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) {
     120    if (  NameExpr *assgnop = dynamic_cast< NameExpr * >(expr->get_function()) ) {
     121
     122      if ( assgnop->get_name() == std::string("?=?") ) {
     123
     124        for ( std::list<ResolvExpr::AltList>::iterator ali = possibilities.begin(); ali != possibilities.end(); ++ali ) {
    125125          assert( ali->size() == 2 );
    126126          ResolvExpr::AltList::iterator opit = ali->begin();
    127127          ResolvExpr::Alternative op1 = *opit, op2 = *(++opit);
    128128
    129           if( pointsToTuple(op1.expr) ) { // also handles tuple vars
     129          if ( pointsToTuple(op1.expr) ) { // also handles tuple vars
    130130            if ( isTuple( op2.expr, true ) )
    131131              matcher = new MultipleAssignMatcher(op1.expr, op2.expr);
    132             else if( isMVR( op2.expr ) ) {
     132            else if ( isMVR( op2.expr ) ) {
    133133              // handle MVR differently
    134134            } else
     
    137137
    138138            std::list< ResolvExpr::AltList > options;
    139             if( match() )
     139            if ( match() )
    140140              /*
    141               if( hasMatched ) {
     141              if ( hasMatched ) {
    142142                // throw SemanticError("Ambiguous tuple assignment");
    143143              } else {*/
     
    150150        }
    151151
    152         if( hasMatched ) {
    153           if( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
     152        if ( hasMatched ) {
     153          if ( dynamic_cast<TupleAssignSpotter::MultipleAssignMatcher *>( matcher ) ) {
    154154            //options.print( std::cerr );
    155155            std::list< ResolvExpr::AltList >best = options.get_best();
    156             if( best.size() == 1 ) {
     156            if ( best.size() == 1 ) {
    157157              std::list<Expression *> solved_assigns;
    158               for( ResolvExpr::AltList::iterator i = best.front().begin(); i != best.front().end(); ++i ){
     158              for ( ResolvExpr::AltList::iterator i = best.front().begin(); i != best.front().end(); ++i ){
    159159                solved_assigns.push_back( i->expr );
    160160              }
     
    165165            assert(! optMass.empty() );
    166166            ResolvExpr::AltList winners;
    167             for( std::vector< ResolvExpr::AltList >::iterator i = optMass.begin(); i != optMass.end(); ++i )
     167            for ( std::vector< ResolvExpr::AltList >::iterator i = optMass.begin(); i != optMass.end(); ++i )
    168168              findMinCostAlt( i->begin(), i->end(), back_inserter(winners) );
    169169
    170170            std::list< Expression *> solved_assigns;
    171             for( ResolvExpr::AltList::iterator i = winners.begin(); i != winners.end(); ++i )
     171            for ( ResolvExpr::AltList::iterator i = winners.begin(); i != winners.end(); ++i )
    172172              solved_assigns.push_back( i->expr );
    173173            currentFinder->get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns/*, SolvedTupleExpr::MASS*/), currentFinder->get_environ(), ResolvExpr::Cost() ) );
     
    181181  void TupleAssignSpotter::Matcher::init( Expression *_lhs, Expression *_rhs ) {
    182182    lhs.clear();
    183     if(AddressExpr *addr = dynamic_cast<AddressExpr *>(_lhs) )
    184       if( TupleExpr *tuple = dynamic_cast<TupleExpr *>(addr->get_arg()) )
     183    if (AddressExpr *addr = dynamic_cast<AddressExpr *>(_lhs) )
     184      if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(addr->get_arg()) )
    185185        std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(lhs) );
    186186
     
    195195    init(_lhs,_rhs);
    196196
    197     if( TupleExpr *tuple = dynamic_cast<TupleExpr *>(_rhs) )
     197    if ( TupleExpr *tuple = dynamic_cast<TupleExpr *>(_rhs) )
    198198      std::copy( tuple->get_exprs().begin(), tuple->get_exprs().end(), back_inserter(rhs) );
    199199  }
     
    211211    if ( lhs.empty() || (rhs.size() != 1) ) return false;
    212212
    213     for( std::list< Expression * >::iterator l = lhs.begin(); l != lhs.end(); l++ ) {
     213    for ( std::list< Expression * >::iterator l = lhs.begin(); l != lhs.end(); l++ ) {
    214214      std::list< Expression * > args;
    215215      args.push_back( new AddressExpr(*l) );
     
    229229    ResolvExpr::AltList current;
    230230    if ( optMass.empty() ) {
    231       for( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
     231      for ( std::list< Expression * >::size_type i = 0; i != new_assigns.size(); ++i )
    232232        optMass.push_back( ResolvExpr::AltList() );
    233233    }
    234234    int cnt = 0;
    235     for( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
     235    for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i, cnt++ ) {
    236236
    237237      ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
     
    250250  bool TupleAssignSpotter::MultipleAssignMatcher::match( std::list< Expression * > &out ) {
    251251    // need more complicated matching
    252     if( lhs.size() == rhs.size() ) {
     252    if ( lhs.size() == rhs.size() ) {
    253253      zipWith( lhs.begin(), lhs.end(), rhs.begin(), rhs.end(), back_inserter(out), TupleAssignSpotter::Matcher::createAssgn );
    254254      return true;
     
    265265
    266266    ResolvExpr::AltList current;
    267     for( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
     267    for ( std::list< Expression * >::iterator i = new_assigns.begin(); i != new_assigns.end(); ++i ) {
    268268      //try {
    269269      ResolvExpr::AlternativeFinder finder( currentFinder->get_indexer(), currentFinder->get_environ() );
     
    297297    // transpose matrix
    298298    if ( costMatrix.empty() )
    299       for( unsigned int i = 0; i< opt.size(); ++i)
     299      for ( unsigned int i = 0; i< opt.size(); ++i)
    300300        costMatrix.push_back( vector<ResolvExpr::Cost>() );
    301301
    302302    int cnt = 0;
    303     for( ResolvExpr::AltList::iterator i = opt.begin(); i != opt.end(); ++i, cnt++ )
     303    for ( ResolvExpr::AltList::iterator i = opt.begin(); i != opt.end(); ++i, cnt++ )
    304304      costMatrix[cnt].push_back( i->cost );
    305305
     
    312312    list< ResolvExpr::AltList > ret;
    313313    list< multiset<int> > solns;
    314     for( vector< vector<Cost> >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
     314    for ( vector< vector<Cost> >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    315315      list<int> current;
    316316      findMinCost( i->begin(), i->end(), back_inserter(current) );
     
    320320    multiset<int> result;
    321321    lift_intersection( solns.begin(), solns.end(), inserter( result, result.begin() ) );
    322     if( result.size() != 1 )
     322    if ( result.size() != 1 )
    323323      throw SemanticError("Ambiguous tuple expression");
    324324    ret.push_back(get_option( *(result.begin() )));
     
    329329    using namespace std;
    330330
    331     for( vector< vector < ResolvExpr::Cost > >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
    332       for( vector < ResolvExpr::Cost >::iterator j = i->begin(); j != i->end(); ++j )
     331    for ( vector< vector < ResolvExpr::Cost > >::iterator i = costMatrix.begin(); i != costMatrix.end(); ++i ) {
     332      for ( vector < ResolvExpr::Cost >::iterator j = i->begin(); j != i->end(); ++j )
    333333        ostr << *j << " " ;
    334334      ostr << std::endl;
     
    352352    Cost minCost = Cost::infinity;
    353353    unsigned int index = 0;
    354     for( InputIterator i = begin; i != end; ++i, index++ ) {
    355       if( *i < minCost ) {
     354    for ( InputIterator i = begin; i != end; ++i, index++ ) {
     355      if ( *i < minCost ) {
    356356        minCost = *i;
    357357        alternatives.clear();
    358358        alternatives.push_back( index );
    359       } else if( *i == minCost ) {
     359      } else if ( *i == minCost ) {
    360360        alternatives.push_back( index );
    361361      }
     
    366366  template< class InputIterator, class OutputIterator >
    367367  void TupleAssignSpotter::Options::lift_intersection( InputIterator begin, InputIterator end, OutputIterator out ){
    368     if( begin == end ) return;
     368    if ( begin == end ) return;
    369369    InputIterator test = begin;
    370370
    371     if(++test == end)
     371    if (++test == end)
    372372      { copy(begin->begin(), begin->end(), out); return; }
    373373
     
    376376    copy( begin->begin(), begin->end(), inserter( cur, cur.begin() ) );
    377377
    378     while( test != end ) {
     378    while ( test != end ) {
    379379      std::multiset<int> temp;
    380380      set_intersection( cur.begin(), cur.end(), test->begin(), test->end(), inserter(temp,temp.begin()) );
     
    390390
    391391  ResolvExpr::AltList TupleAssignSpotter::Options::get_option( std::list< ResolvExpr::AltList >::size_type index ) {
    392     if( index >= options.size() )
     392    if ( index >= options.size() )
    393393      throw 0; // XXX
    394394    std::list< ResolvExpr::AltList >::iterator it = options.begin();
    395     for( std::list< ResolvExpr::AltList >::size_type i = 0; i < index; ++i, ++it );
     395    for ( std::list< ResolvExpr::AltList >::size_type i = 0; i < index; ++i, ++it );
    396396    return *it;
    397397  }
Note: See TracChangeset for help on using the changeset viewer.