Ignore:
File:
1 edited

Legend:

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

    r2d0f918 r26e6d88  
    1717// IWYU pragma: private, include "Pass.hpp"
    1818
    19 #include "Common/Iterate.hpp"
    2019#include "Common/Stats/Heap.h"
    2120namespace ast {
     
    2524        template<typename node_t> node_t * deepCopy( const node_t * );
    2625}
    27 
    28 #ifdef PEDANTIC_PASS_ASSERT
    29 #define __pedantic_pass_assert(...) assert (__VA_ARGS__)
    30 #define __pedantic_pass_assertf(...) assertf(__VA_ARGS__)
    31 #else
    32 #define __pedantic_pass_assert(...)
    33 #define __pedantic_pass_assertf(...)
    34 #endif
    3526
    3627namespace ast::__pass {
     
    139130
    140131        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 );
    144133};
    145134
     
    161150
    162151        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 );
    182153
    183154        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 );
    194156
    195157        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 );
    207159};
    208160
     
    214166
    215167        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 );
    228169};
    229170
     
    576517
    577518} // namespace ast::__pass
    578 
    579 #undef __pedantic_pass_assertf
    580 #undef __pedantic_pass_assert
Note: See TracChangeset for help on using the changeset viewer.