Changeset 65660bd for src/Tuples/Tuples.h
- Timestamp:
- Sep 22, 2016, 8:14:56 AM (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, resolv-new, with_gc
- Children:
- ac9ca96
- Parents:
- 1132b62
- git-author:
- Rob Schluntz <rschlunt@…> (09/21/16 23:43:37)
- git-committer:
- Rob Schluntz <rschlunt@…> (09/22/16 08:14:56)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Tuples/Tuples.h
r1132b62 r65660bd 15 15 16 16 #ifndef _TUPLES_H_ 17 #define _TUPLE _H_17 #define _TUPLES_H_ 18 18 19 19 #include <string> … … 27 27 namespace Tuples { 28 28 // TupleAssignment.cc 29 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign, std::list<ResolvExpr::AltList> & possibilities );29 void handleTupleAssignment( ResolvExpr::AlternativeFinder & currentFinder, UntypedExpr * assign, const std::list<ResolvExpr::AltList> & possibilities ); 30 30 31 31 // TupleExpansion.cc … … 34 34 void expandUniqueExpr( std::list< Declaration * > & translationUnit ); 35 35 36 TupleType * makeTupleType( const std::list< Expression * > & exprs ); 36 /// returns VoidType if any of the expressions have Voidtype, otherwise TupleType of the Expression result types 37 Type * makeTupleType( const std::list< Expression * > & exprs ); 38 39 bool maybeImpure( Expression * expr ); 40 41 42 /// helper function used by explode 43 template< typename OutputIterator > 44 void explodeUnique( Expression * expr, const ResolvExpr::Alternative & alt, OutputIterator out ) { 45 Type * res = expr->get_result(); 46 if ( AddressExpr * addrExpr = dynamic_cast< AddressExpr * >( expr ) ) { 47 ResolvExpr::AltList alts; 48 explodeUnique( addrExpr->get_arg(), alt, back_inserter( alts ) ); 49 for ( ResolvExpr::Alternative & alt : alts ) { 50 // distribute '&' over all components 51 alt.expr = new AddressExpr( alt.expr ); 52 *out++ = alt; 53 } 54 } else if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) { 55 if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( expr ) ) { 56 // can open tuple expr and dump its exploded components 57 for ( Expression * expr : tupleExpr->get_exprs() ) { 58 explodeUnique( expr, alt, out ); 59 } 60 } else { 61 // tuple type, but not tuple expr - recursively index into its components 62 Expression * arg = expr->clone(); 63 if ( Tuples::maybeImpure( arg ) ) { 64 // expressions which may contain side effects require a single unique instance of the expression 65 arg = new UniqueExpr( arg ); 66 } 67 for ( unsigned int i = 0; i < tupleType->size(); i++ ) { 68 TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i ); 69 explodeUnique( idx, alt, out ); 70 delete idx; 71 } 72 delete arg; 73 } 74 } else { 75 // atomic (non-tuple) type - output a clone of the expression in a new alternative 76 *out++ = ResolvExpr::Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost ); 77 } 78 } 79 80 /// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type 81 template< typename OutputIterator > 82 void explode( const ResolvExpr::Alternative &alt, OutputIterator out ) { 83 explodeUnique( alt.expr, alt, out ); 84 } 85 86 // explode list of alternatives 87 template< typename AltIterator, typename OutputIterator > 88 void explode( AltIterator altBegin, AltIterator altEnd, OutputIterator out ) { 89 for ( ; altBegin != altEnd; ++altBegin ) { 90 explode( *altBegin, out ); 91 } 92 } 93 94 template< typename OutputIterator > 95 void explode( const ResolvExpr::AltList & alts, OutputIterator out ) { 96 explode( alts.begin(), alts.end(), out ); 97 } 37 98 } // namespace Tuples 38 99
Note: See TracChangeset
for help on using the changeset viewer.