Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Tuples/Explode.h

    r62194cb rc43c171  
    1616#pragma once
    1717
    18 #include <iterator>                     // for back_inserter, back_insert_iterator
    19 #include <utility>                      // for forward
     18#include <iterator>                  // for back_inserter, back_insert_iterator
    2019
    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
    2624
    2725namespace SymTab {
     
    4139        }
    4240
    43         /// Append alternative to an OutputIterator of Alternatives
    44         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 ExplodedActual
    51         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 
    5741        /// 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 ) {
    6144                if ( isTupleAssign ) {
    6245                        // tuple assignment needs CastExprs to be recursively exploded to easily get at all of the components
    6346                        if ( CastExpr * castExpr = isReferenceCast( expr ) ) {
    6447                                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 );
    6749                                for ( ResolvExpr::Alternative & alt : alts ) {
    6850                                        // distribute reference cast over all components
    69                                         append( std::forward<Output>(out), distributeReference( alt.release_expr() ),
    70                                                 alt.env, alt.cost, alt.cvtCost );
     51                                        alt.expr = distributeReference( alt.expr );
     52                                        *out++ = alt;
    7153                                }
    7254                                // 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)
     
    7961                                // can open tuple expr and dump its exploded components
    8062                                for ( Expression * expr : tupleExpr->get_exprs() ) {
    81                                         explodeUnique( expr, alt, indexer, std::forward<Output>(out), isTupleAssign );
     63                                        explodeUnique( expr, alt, indexer, out, isTupleAssign );
    8264                                }
    8365                        } else {
     
    9577                                for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
    9678                                        TupleIndexExpr * idx = new TupleIndexExpr( arg->clone(), i );
    97                                         explodeUnique( idx, alt, indexer, std::forward<Output>(out), isTupleAssign );
     79                                        explodeUnique( idx, alt, indexer, out, isTupleAssign );
    9880                                        delete idx;
    9981                                }
     
    10284                } else {
    10385                        // 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 );
    10587                }
    10688        }
    10789
    10890        /// 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 );
    11394        }
    11495
    11596        // 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 ) {
    11999                for ( ; altBegin != altEnd; ++altBegin ) {
    120                         explode( *altBegin, indexer, std::forward<Output>(out), isTupleAssign );
     100                        explode( *altBegin, indexer, out, isTupleAssign );
    121101                }
    122102        }
    123103
    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 );
    128107        }
    129108} // namespace Tuples
Note: See TracChangeset for help on using the changeset viewer.