Changes in src/Tuples/Explode.h [f831177:141b786]
- File:
-
- 1 edited
-
src/Tuples/Explode.h (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/Explode.h
rf831177 r141b786 33 33 /// helper function used by explode 34 34 template< typename OutputIterator > 35 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) { 36 if ( isTupleAssign ) { 37 // tuple assignment needs AddressExprs to be recursively exploded to easily get at all of the components 38 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) { 39 ResolvExpr::AltList alts; 40 explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign ); 41 for ( ResolvExpr::Alternative & alt : alts ) { 42 // distribute '&' over all components 43 alt.expr = distributeAddr( alt.expr ); 44 *out++ = alt; 45 } 46 // in tuple assignment, still need to handle the other cases, but only if not already handled here (don't want to output too many alternatives) 47 return; 35 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out ) { 36 Type * res = expr->get_result(); 37 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) { 38 ResolvExpr::AltList alts; 39 explodeUnique( addrExpr->get_arg(), alt, indexer, back_inserter( alts ) ); 40 for ( ResolvExpr::Alternative & alt : alts ) { 41 // distribute '&' over all components 42 alt.expr = distributeAddr( alt.expr ); 43 *out++ = alt; 48 44 } 49 } 50 Type * res = expr->get_result(); 51 if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) { 45 } else if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) { 52 46 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) { 53 47 // can open tuple expr and dump its exploded components 54 48 for ( Expression * expr : tupleExpr->get_exprs() ) { 55 explodeUnique( expr, alt, indexer, out , isTupleAssign);49 explodeUnique( expr, alt, indexer, out ); 56 50 } 57 51 } else { … … 64 58 for ( unsigned int i = 0; i < tupleType->size(); i++ ) { 65 59 TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i ); 66 explodeUnique( idx, alt, indexer, out , isTupleAssign);60 explodeUnique( idx, alt, indexer, out ); 67 61 delete idx; 68 62 } … … 77 71 /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type 78 72 template< typename OutputIterator > 79 void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out , bool isTupleAssign = false) {80 explodeUnique( alt.expr, alt, indexer, out , isTupleAssign);73 void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out ) { 74 explodeUnique( alt.expr, alt, indexer, out ); 81 75 } 82 76 83 77 // explode list of alternatives 84 78 template< typename AltIterator, typename OutputIterator > 85 void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out , bool isTupleAssign = false) {79 void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out ) { 86 80 for ( ; altBegin != altEnd; ++altBegin ) { 87 explode( *altBegin, indexer, out , isTupleAssign);81 explode( *altBegin, indexer, out ); 88 82 } 89 83 } 90 84 91 85 template< typename OutputIterator > 92 void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out , bool isTupleAssign = false) {93 explode( alts.begin(), alts.end(), indexer, out , isTupleAssign);86 void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out ) { 87 explode( alts.begin(), alts.end(), indexer, out ); 94 88 } 95 89 } // namespace Tuples
Note:
See TracChangeset
for help on using the changeset viewer.