Changes in src/AST/Pass.proto.hpp [2d0f918:26e6d88]
- File:
-
- 1 edited
-
src/AST/Pass.proto.hpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Pass.proto.hpp
r2d0f918 r26e6d88 17 17 // IWYU pragma: private, include "Pass.hpp" 18 18 19 #include "Common/Iterate.hpp"20 19 #include "Common/Stats/Heap.h" 21 20 namespace ast { … … 25 24 template<typename node_t> node_t * deepCopy( const node_t * ); 26 25 } 27 28 #ifdef PEDANTIC_PASS_ASSERT29 #define __pedantic_pass_assert(...) assert (__VA_ARGS__)30 #define __pedantic_pass_assertf(...) assertf(__VA_ARGS__)31 #else32 #define __pedantic_pass_assert(...)33 #define __pedantic_pass_assertf(...)34 #endif35 26 36 27 namespace ast::__pass { … … 139 130 140 131 template< typename object_t, typename super_t, typename field_t > 141 void apply( object_t * object, field_t super_t::* field ) { 142 object->*field = value; 143 } 132 void apply( object_t *, field_t super_t::* field ); 144 133 }; 145 134 … … 161 150 162 151 template< typename object_t, typename super_t, typename field_t > 163 void apply( object_t * object, field_t super_t::* field ) { 164 field_t & container = object->*field; 165 __pedantic_pass_assert( container.size() <= values.size() ); 166 167 auto cit = enumerate(container).begin(); 168 169 container_t<ptr<Stmt>> nvals; 170 for ( delta & d : values ) { 171 if ( d.is_old ) { 172 __pedantic_pass_assert( cit.idx <= d.old_idx ); 173 std::advance( cit, d.old_idx - cit.idx ); 174 nvals.push_back( std::move( (*cit).val ) ); 175 } else { 176 nvals.push_back( std::move( d.new_val ) ); 177 } 178 } 179 180 container = std::move(nvals); 181 } 152 void apply( object_t *, field_t super_t::* field ); 182 153 183 154 template< template<class...> class incontainer_t > 184 void take_all( incontainer_t<ptr<Stmt>> * stmts ) { 185 if ( !stmts || stmts->empty() ) return; 186 187 std::transform( stmts->begin(), stmts->end(), std::back_inserter( values ), 188 [](ast::ptr<ast::Stmt>& stmt) -> delta { 189 return delta( stmt.release(), -1, false ); 190 }); 191 stmts->clear(); 192 differs = true; 193 } 155 void take_all( incontainer_t<ptr<Stmt>> * stmts ); 194 156 195 157 template< template<class...> class incontainer_t > 196 void take_all( incontainer_t<ptr<Decl>> * decls ) { 197 if ( !decls || decls->empty() ) return; 198 199 std::transform( decls->begin(), decls->end(), std::back_inserter( values ), 200 [](ast::ptr<ast::Decl>& decl) -> delta { 201 ast::Decl const * d = decl.release(); 202 return delta( new DeclStmt( d->location, d ), -1, false ); 203 }); 204 decls->clear(); 205 differs = true; 206 } 158 void take_all( incontainer_t<ptr<Decl>> * decls ); 207 159 }; 208 160 … … 214 166 215 167 template< typename object_t, typename super_t, typename field_t > 216 void apply( object_t * object, field_t super_t::* field ) { 217 field_t & container = object->*field; 218 __pedantic_pass_assert( container.size() == values.size() ); 219 220 for ( size_t i = 0; i < container.size(); ++i ) { 221 // Take all the elements that are different in 'values' 222 // and swap them into 'container' 223 if ( values[i] != nullptr ) swap(container[i], values[i]); 224 } 225 // Now the original containers should still have the unchanged values 226 // but also contain the new values. 227 } 168 void apply( object_t *, field_t super_t::* field ); 228 169 }; 229 170 … … 576 517 577 518 } // namespace ast::__pass 578 579 #undef __pedantic_pass_assertf580 #undef __pedantic_pass_assert
Note:
See TracChangeset
for help on using the changeset viewer.