Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.h

    r2d11663 rea6332d  
    1616#pragma once
    1717
    18 #include <deque>
    1918#include <list>   // for list
    20 #include <memory> // for unique_ptr
    2119#include <stack>  // for stack
    22 #include <vector>
    23 
    24 #include "AST/Node.hpp"  // for ptr
    25 #include "Common/CodeLocation.h"
    2620
    2721class Designation;
     
    5852} // namespace ResolvExpr
    5953
    60 namespace ast {
    61         // AST class types
    62         class Designation;
    63         struct InitAlternative;
    64         class Type;
    65 
    66         /// Iterates members of a type by initializer
    67         class MemberIterator {
    68         public:
    69                 virtual ~MemberIterator() {}
    70 
    71                 /// Internal set position based on iterator ranges
    72                 virtual void setPosition(
    73                         std::deque< ptr< Expr > >::const_iterator it,
    74                         std::deque< ptr< Expr > >::const_iterator end ) = 0;
    75 
    76                 /// walks the current object using the given designators as a guide
    77                 void setPosition( const std::deque< ptr< Expr > > & designators ) {
    78                         setPosition( designators.begin(), designators.end() );
    79                 }
    80 
    81                 /// retrieve the list of possible (Type,Designation) pairs for the current position in the
    82                 /// current object
    83                 virtual std::deque< InitAlternative > operator* () const = 0;
    84 
    85                 /// true if the iterator is not currently at the end
    86                 virtual operator bool() const = 0;
    87 
    88                 /// moves the iterator by one member in the current object
    89                 virtual MemberIterator & bigStep() = 0;
    90 
    91                 /// moves the iterator by one member in the current subobject
    92                 virtual MemberIterator & smallStep() = 0;
    93 
    94                 /// the type of the current object
    95                 virtual const Type * getType() = 0;
    96 
    97                 /// the type of the current subobject
    98                 virtual const Type * getNext() = 0;
    99        
    100                 /// helper for operator*; aggregates must add designator to each init alternative, but
    101                 /// adding designators in operator* creates duplicates
    102                 virtual std::deque< InitAlternative > first() const = 0;
    103         };
    104 
    105         /// Builds initializer lists in resolution
    106         class CurrentObject final {
    107                 std::vector< std::shared_ptr<MemberIterator> > objStack;
    108        
    109         public:
    110                 CurrentObject() = default;
    111                 CurrentObject( const CodeLocation & loc, const Type * type );
    112 
    113                 /// resolves unresolved designation
    114                 const Designation * findNext( const Designation * designation );
    115                 /// sets current position using the resolved designation
    116                 void setNext( const ast::Designation * designation );
    117                 /// steps to next sub-object of current object
    118                 void increment();
    119                 /// sets new current object for the duration of this brace-enclosed intializer-list
    120                 void enterListInit( const CodeLocation & loc );
    121                 /// restores previous current object
    122                 void exitListInit();
    123                 /// produces a list of alternatives (Type *, Designation *) for the current sub-object's
    124                 /// initializer.
    125                 std::deque< InitAlternative > getOptions();
    126                 /// produces the type of the current object but no subobjects
    127                 const Type * getCurrentType();
    128         };
    129 } // namespace ast
    130 
    13154// Local Variables: //
    13255// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.