Ignore:
Timestamp:
May 10, 2023, 11:26:44 AM (14 months ago)
Author:
Andrew Beach <ajbeach@…>
Branches:
ADT, ast-experimental, master
Children:
8fd1b7c
Parents:
e50fce1
Message:

Clean up methods for result1/N/Nstmt classes and the padantic pass macros.

File:
1 edited

Legend:

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

    re50fce1 r2d0f918  
    1717// IWYU pragma: private, include "Pass.hpp"
    1818
     19#include "Common/Iterate.hpp"
    1920#include "Common/Stats/Heap.h"
    2021namespace ast {
     
    2425        template<typename node_t> node_t * deepCopy( const node_t * );
    2526}
     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
    2635
    2736namespace ast::__pass {
     
    130139
    131140        template< typename object_t, typename super_t, typename field_t >
    132         void apply( object_t *, field_t super_t::* field );
     141        void apply( object_t * object, field_t super_t::* field ) {
     142                object->*field = value;
     143        }
    133144};
    134145
     
    150161
    151162        template< typename object_t, typename super_t, typename field_t >
    152         void apply( object_t *, field_t super_t::* field );
     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        }
    153182
    154183        template< template<class...> class incontainer_t >
    155         void take_all( incontainer_t<ptr<Stmt>> * stmts );
     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        }
    156194
    157195        template< template<class...> class incontainer_t >
    158         void take_all( incontainer_t<ptr<Decl>> * decls );
     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        }
    159207};
    160208
     
    166214
    167215        template< typename object_t, typename super_t, typename field_t >
    168         void apply( object_t *, field_t super_t::* field );
     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        }
    169228};
    170229
     
    517576
    518577} // namespace ast::__pass
     578
     579#undef __pedantic_pass_assertf
     580#undef __pedantic_pass_assert
Note: See TracChangeset for help on using the changeset viewer.