Changes in src/AST/Pass.impl.hpp [fac05b3:2d0f918]
- File:
-
- 1 edited
-
src/AST/Pass.impl.hpp (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.impl.hpp
rfac05b3 r2d0f918 22 22 #include "AST/TranslationUnit.hpp" 23 23 #include "AST/TypeSubstitution.hpp" 24 #include "Common/Iterate.hpp"25 24 26 25 #define VISIT_START( node ) \ … … 127 126 } 128 127 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 135 128 template< typename core_t > 136 129 template< typename node_t > … … 234 227 235 228 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;286 229 } 287 230 … … 353 296 354 297 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 values370 // but also contain the new values371 298 } 372 299 … … 1066 993 1067 994 //-------------------------------------------------------------------------- 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 //-------------------------------------------------------------------------- 1068 1010 // WaitForStmt 1069 1011 template< typename core_t > … … 1090 1032 1091 1033 if ( __visit_children() ) { 1092 maybe_accept( node, &WaitForClause::target _func);1034 maybe_accept( node, &WaitForClause::target ); 1093 1035 maybe_accept( node, &WaitForClause::target_args ); 1094 1036 maybe_accept( node, &WaitForClause::stmt ); 1095 maybe_accept( node, &WaitForClause:: cond );1037 maybe_accept( node, &WaitForClause::when_cond ); 1096 1038 } 1097 1039 1098 1040 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 ); 1099 1059 } 1100 1060 … … 2203 2163 } 2204 2164 2165 #undef __pedantic_pass_assertf 2166 #undef __pedantic_pass_assert 2205 2167 #undef VISIT_START 2206 2168 #undef VISIT_END
Note:
See TracChangeset
for help on using the changeset viewer.