Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Pass.impl.hpp

    r2d0f918 rfac05b3  
    2222#include "AST/TranslationUnit.hpp"
    2323#include "AST/TypeSubstitution.hpp"
     24#include "Common/Iterate.hpp"
    2425
    2526#define VISIT_START( node ) \
     
    126127        }
    127128
     129        template< typename node_t >
     130        template< typename object_t, typename super_t, typename field_t >
     131        void __pass::result1< node_t >::apply( object_t * object, field_t super_t::* field ) {
     132                object->*field = value;
     133        }
     134
    128135        template< typename core_t >
    129136        template< typename node_t >
     
    227234
    228235                return {true, compound};
     236        }
     237
     238        template< template <class...> class container_t >
     239        template< typename object_t, typename super_t, typename field_t >
     240        void __pass::resultNstmt<container_t>::apply(object_t * object, field_t super_t::* field) {
     241                auto & container = object->*field;
     242                __pedantic_pass_assert( container.size() <= values.size() );
     243
     244                auto cit = enumerate(container).begin();
     245
     246                container_t<ptr<Stmt>> nvals;
     247                for (delta & d : values) {
     248                        if ( d.is_old ) {
     249                                __pedantic_pass_assert( cit.idx <= d.old_idx );
     250                                std::advance( cit, d.old_idx - cit.idx );
     251                                nvals.push_back( std::move( (*cit).val) );
     252                        } else {
     253                                nvals.push_back( std::move(d.new_val) );
     254                        }
     255                }
     256
     257                container = std::move(nvals);
     258        }
     259
     260        template< template <class...> class container_t >
     261        template< template <class...> class incontainer_t >
     262        void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Stmt>> * stmts ) {
     263                if (!stmts || stmts->empty()) return;
     264
     265                std::transform(stmts->begin(), stmts->end(), std::back_inserter( values ),
     266                        [](ast::ptr<ast::Stmt>& stmt) -> delta {
     267                                return delta( stmt.release(), -1, false );
     268                        });
     269                stmts->clear();
     270                differs = true;
     271        }
     272
     273        template< template<class...> class container_t >
     274        template< template<class...> class incontainer_t >
     275        void __pass::resultNstmt< container_t >::take_all( incontainer_t<ptr<Decl>> * decls ) {
     276                if (!decls || decls->empty()) return;
     277
     278                std::transform(decls->begin(), decls->end(), std::back_inserter( values ),
     279                        [](ast::ptr<ast::Decl>& decl) -> delta {
     280                                auto loc = decl->location;
     281                                auto stmt = new DeclStmt( loc, decl.release() );
     282                                return delta( stmt, -1, false );
     283                        });
     284                decls->clear();
     285                differs = true;
    229286        }
    230287
     
    296353
    297354                return new_kids;
     355        }
     356
     357        template< template <class...> class container_t, typename node_t >
     358        template< typename object_t, typename super_t, typename field_t >
     359        void __pass::resultN<container_t, node_t>::apply(object_t * object, field_t super_t::* field) {
     360                auto & container = object->*field;
     361                __pedantic_pass_assert( container.size() == values.size() );
     362
     363                for(size_t i = 0; i < container.size(); i++) {
     364                        // Take all the elements that are different in 'values'
     365                        // and swap them into 'container'
     366                        if( values[i] != nullptr ) swap(container[i], values[i]);
     367                }
     368
     369                // Now the original containers should still have the unchanged values
     370                // but also contain the new values
    298371        }
    299372
     
    9931066
    9941067//--------------------------------------------------------------------------
    995 // WhenClause
    996 template< typename core_t >
    997 const ast::WhenClause * ast::Pass< core_t >::visit( const ast::WhenClause * node ) {
    998         VISIT_START( node );
    999 
    1000         if ( __visit_children() ) {
    1001                 maybe_accept( node, &WhenClause::target );
    1002                 maybe_accept( node, &WhenClause::stmt );
    1003                 maybe_accept( node, &WhenClause::when_cond );
    1004         }
    1005 
    1006         VISIT_END( WhenClause, node );
    1007 }
    1008 
    1009 //--------------------------------------------------------------------------
    10101068// WaitForStmt
    10111069template< typename core_t >
     
    10321090
    10331091        if ( __visit_children() ) {
    1034                 maybe_accept( node, &WaitForClause::target );
     1092                maybe_accept( node, &WaitForClause::target_func );
    10351093                maybe_accept( node, &WaitForClause::target_args );
    10361094                maybe_accept( node, &WaitForClause::stmt );
    1037                 maybe_accept( node, &WaitForClause::when_cond );
     1095                maybe_accept( node, &WaitForClause::cond );
    10381096        }
    10391097
    10401098        VISIT_END( WaitForClause, node );
    1041 }
    1042 
    1043 //--------------------------------------------------------------------------
    1044 // WaitUntilStmt
    1045 template< typename core_t >
    1046 const ast::Stmt * ast::Pass< core_t >::visit( const ast::WaitUntilStmt * node ) {
    1047         VISIT_START( node );
    1048 
    1049         if ( __visit_children() ) {
    1050                 maybe_accept( node, &WaitUntilStmt::clauses );
    1051                 maybe_accept( node, &WaitUntilStmt::timeout_time );
    1052                 maybe_accept( node, &WaitUntilStmt::timeout_stmt );
    1053                 maybe_accept( node, &WaitUntilStmt::timeout_cond );
    1054                 maybe_accept( node, &WaitUntilStmt::else_stmt );
    1055                 maybe_accept( node, &WaitUntilStmt::else_cond );
    1056         }
    1057 
    1058         VISIT_END( Stmt, node );
    10591099}
    10601100
     
    21632203}
    21642204
    2165 #undef __pedantic_pass_assertf
    2166 #undef __pedantic_pass_assert
    21672205#undef VISIT_START
    21682206#undef VISIT_END
Note: See TracChangeset for help on using the changeset viewer.