Changes in src/Tuples/Explode.h [62194cb:c43c171]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/Explode.h
r62194cb rc43c171 16 16 #pragma once 17 17 18 #include <iterator> // for back_inserter, back_insert_iterator 19 #include <utility> // for forward 18 #include <iterator> // for back_inserter, back_insert_iterator 20 19 21 #include "ResolvExpr/Alternative.h" // for Alternative, AltList 22 #include "ResolvExpr/ExplodedActual.h" // for ExplodedActual 23 #include "SynTree/Expression.h" // for Expression, UniqueExpr, AddressExpr 24 #include "SynTree/Type.h" // for TupleType, Type 25 #include "Tuples.h" // for maybeImpure 20 #include "ResolvExpr/Alternative.h" // for Alternative, AltList 21 #include "SynTree/Expression.h" // for Expression, UniqueExpr, AddressExpr 22 #include "SynTree/Type.h" // for TupleType, Type 23 #include "Tuples.h" // for maybeImpure 26 24 27 25 namespace SymTab { … … 41 39 } 42 40 43 /// Append alternative to an OutputIterator of Alternatives44 template<typename OutputIterator>45 void append( OutputIterator out, Expression* expr, const ResolvExpr::TypeEnvironment& env,46 const ResolvExpr::Cost& cost, const ResolvExpr::Cost& cvtCost ) {47 *out++ = ResolvExpr::Alternative{ expr, env, cost, cvtCost };48 }49 50 /// Append alternative to an ExplodedActual51 static inline void append( ResolvExpr::ExplodedActual& ea, Expression* expr,52 const ResolvExpr::TypeEnvironment&, const ResolvExpr::Cost&, const ResolvExpr::Cost& ) {53 ea.exprs.emplace_back( expr );54 /// xxx -- merge environment, cost?55 }56 57 41 /// helper function used by explode 58 template< typename Output > 59 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, 60 const SymTab::Indexer & indexer, Output&& out, bool isTupleAssign ) { 42 template< typename OutputIterator > 43 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign ) { 61 44 if ( isTupleAssign ) { 62 45 // tuple assignment needs CastExprs to be recursively exploded to easily get at all of the components 63 46 if ( CastExpr * castExpr = isReferenceCast( expr ) ) { 64 47 ResolvExpr::AltList alts; 65 explodeUnique( 66 castExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign ); 48 explodeUnique( castExpr->get_arg(), alt, indexer, back_inserter( alts ), isTupleAssign ); 67 49 for ( ResolvExpr::Alternative & alt : alts ) { 68 50 // distribute reference cast over all components 69 a ppend( std::forward<Output>(out), distributeReference( alt.release_expr() ),70 alt.env, alt.cost, alt.cvtCost );51 alt.expr = distributeReference( alt.expr ); 52 *out++ = alt; 71 53 } 72 54 // 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) … … 79 61 // can open tuple expr and dump its exploded components 80 62 for ( Expression * expr : tupleExpr->get_exprs() ) { 81 explodeUnique( expr, alt, indexer, std::forward<Output>(out), isTupleAssign );63 explodeUnique( expr, alt, indexer, out, isTupleAssign ); 82 64 } 83 65 } else { … … 95 77 for ( unsigned int i = 0; i < tupleType->size(); i++ ) { 96 78 TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i ); 97 explodeUnique( idx, alt, indexer, std::forward<Output>(out), isTupleAssign );79 explodeUnique( idx, alt, indexer, out, isTupleAssign ); 98 80 delete idx; 99 81 } … … 102 84 } else { 103 85 // atomic (non-tuple) type - output a clone of the expression in a new alternative 104 append( std::forward<Output>(out),expr->clone(), alt.env, alt.cost, alt.cvtCost );86 *out++ = ResolvExpr::Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost ); 105 87 } 106 88 } 107 89 108 90 /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type 109 template< typename Output > 110 void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, 111 Output&& out, bool isTupleAssign = false ) { 112 explodeUnique( alt.expr, alt, indexer, std::forward<Output>(out), isTupleAssign ); 91 template< typename OutputIterator > 92 void explode( const ResolvExpr::Alternative &alt, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) { 93 explodeUnique( alt.expr, alt, indexer, out, isTupleAssign ); 113 94 } 114 95 115 96 // explode list of alternatives 116 template< typename AltIterator, typename Output > 117 void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, 118 Output&& out, bool isTupleAssign = false ) { 97 template< typename AltIterator, typename OutputIterator > 98 void explode( AltIterator altBegin, AltIterator altEnd, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) { 119 99 for ( ; altBegin != altEnd; ++altBegin ) { 120 explode( *altBegin, indexer, std::forward<Output>(out), isTupleAssign );100 explode( *altBegin, indexer, out, isTupleAssign ); 121 101 } 122 102 } 123 103 124 template< typename Output > 125 void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, Output&& out, 126 bool isTupleAssign = false ) { 127 explode( alts.begin(), alts.end(), indexer, std::forward<Output>(out), isTupleAssign ); 104 template< typename OutputIterator > 105 void explode( const ResolvExpr::AltList & alts, const SymTab::Indexer & indexer, OutputIterator out, bool isTupleAssign = false ) { 106 explode( alts.begin(), alts.end(), indexer, out, isTupleAssign ); 128 107 } 129 108 } // namespace Tuples
Note: See TracChangeset
for help on using the changeset viewer.