Changeset 9e1d485 for src/AST/Node.hpp


Ignore:
Timestamp:
May 15, 2019, 3:41:08 PM (7 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
69bafd2
Parents:
264e691
Message:

First draft of ast::Type with subclasses

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/Node.hpp

    r264e691 r9e1d485  
    9494std::ostream& operator<< ( std::ostream& out, const Node* node );
    9595
    96 // Base class for the smart pointer types
    97 // should never really be used.
    98 template< typename node_t, enum Node::ref_type ref_t>
     96/// Base class for the smart pointer types
     97/// should never really be used.
     98template< typename node_t, enum Node::ref_type ref_t >
    9999class ptr_base {
    100100public:
    101101        ptr_base() : node(nullptr) {}
    102         ptr_base( node_t * n ) : node(n) { if( !node ) node->increment(ref_t); }
     102        ptr_base( const node_t * n ) : node(n) { if( node ) node->increment(ref_t); }
    103103        ~ptr_base() { if( node ) node->decrement(ref_t); }
    104104
    105         template< enum  Node::ref_type o_ref_t >
     105        template< enum Node::ref_type o_ref_t >
    106106        ptr_base( const ptr_base<node_t, o_ref_t> & o ) : node(o.node) {
    107                 if( !node ) return;
    108                 node->increment(ref_t);
     107                if( node ) node->increment(ref_t);
    109108        }
    110109
    111         template< enum  Node::ref_type o_ref_t >
     110        template< enum Node::ref_type o_ref_t >
    112111        ptr_base( ptr_base<node_t, o_ref_t> && o ) : node(o.node) {
    113112                if( node ) node->increment(ref_t);
    114113        }
    115114
    116         template< enum  Node::ref_type o_ref_t >
     115        template< enum Node::ref_type o_ref_t >
    117116        ptr_base & operator=( const ptr_base<node_t, o_ref_t> & o ) {
    118117                assign(o.node);
     
    120119        }
    121120
    122         template< enum  Node::ref_type o_ref_t >
     121        template< enum Node::ref_type o_ref_t >
    123122        ptr_base & operator=( ptr_base<node_t, o_ref_t> && o ) {
    124                 if(o.node == node) return *this;
    125123                assign(o.node);
    126124                return *this;
     
    134132
    135133        template<typename o_node_t>
    136         const o_node_t * as() const { return dynamic_cast<o_node_t *>(node); }
     134        const o_node_t * as() const { return dynamic_cast<const o_node_t *>(node); }
    137135
    138136        using ptr = const node_t *;
    139137
    140138private:
    141         void assign(node_t * other ) {
     139        void assign( const node_t * other ) {
    142140                if( other ) other->increment(ref_t);
    143141                if( node  ) node ->decrement(ref_t);
     
    146144
    147145protected:
    148         node_t * node;
     146        const node_t * node;
    149147};
    150148
Note: See TracChangeset for help on using the changeset viewer.