Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Init.hpp

    r23f99e1 rf3cc5b6  
    2323#include "Visitor.hpp"
    2424
     25// Must be included in *all* AST classes; should be #undef'd at the end of the file
     26#define MUTATE_FRIEND template<typename node_t> friend auto mutate(const node_t * node);
     27
    2528namespace ast {
    2629
     
    4043private:
    4144        Designation* clone() const override { return new Designation{ *this }; }
     45        MUTATE_FRIEND
    4246};
     47
     48/// Flag for whether to construct from initialzier
     49enum ConstructFlag { DoConstruct, MaybeConstruct };
    4350
    4451/// Object initializer base class
    4552class Init : public ParseNode {
    4653public:
    47         bool maybeConstructed;
     54        ConstructFlag maybeConstructed;
    4855
    49         Init( const CodeLocation& loc, bool mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
     56        Init( const CodeLocation& loc, ConstructFlag mc ) : ParseNode( loc ), maybeConstructed( mc ) {}
    5057
    5158        const Init * accept( Visitor& v ) const override = 0;
    5259private:
    5360        const Init * clone() const override = 0;
     61        MUTATE_FRIEND
    5462};
    5563
     
    6068        ptr<Expr> value;
    6169
    62         SingleInit( const CodeLocation& loc, Expr* val, bool mc = false )
     70        SingleInit( const CodeLocation& loc, Expr* val, ConstructFlag mc = DoConstruct )
    6371        : Init( loc, mc ), value( val ) {}
    6472
     
    6674private:
    6775        SingleInit * clone() const override { return new SingleInit{ *this }; }
    68 
    69         /// Must be copied in ALL derived classes
    70         template<typename node_t>
    71         friend auto mutate(const node_t * node);
     76        MUTATE_FRIEND
    7277};
    7378
     
    8287
    8388        ListInit( const CodeLocation& loc, std::vector<ptr<Init>>&& is,
    84                 std::vector<ptr<Designation>>&& ds = {}, bool mc = false );
     89                std::vector<ptr<Designation>>&& ds = {}, ConstructFlag mc = DoConstruct );
    8590
    8691        using iterator = std::vector<ptr<Init>>::iterator;
     
    9499private:
    95100        ListInit * clone() const override { return new ListInit{ *this }; }
    96 
    97         /// Must be copied in ALL derived classes
    98         template<typename node_t>
    99         friend auto mutate(const node_t * node);
     101        MUTATE_FRIEND
    100102};
    101103
     
    112114
    113115        ConstructorInit( const CodeLocation& loc, Stmt* ctor, Stmt* dtor, Init* init )
    114         : Init( loc, true ), ctor( ctor ), dtor( dtor ), init( init ) {}
     116        : Init( loc, DoConstruct ), ctor( ctor ), dtor( dtor ), init( init ) {}
    115117
    116118        const Init * accept( Visitor & v ) const override { return v.visit( this ); }
    117119private:
    118120        ConstructorInit * clone() const override { return new ConstructorInit{ *this }; }
    119 
    120         /// Must be copied in ALL derived classes
    121         template<typename node_t>
    122         friend auto mutate(const node_t * node);
     121        MUTATE_FRIEND
    123122};
    124123
     
    139138}
    140139
     140#undef MUTATE_FRIEND
     141
    141142// Local Variables: //
    142143// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.