source: src/ResolvExpr/CurrentObject.h@ 07d867b

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 07d867b was 2d11663, checked in by Aaron Moss <a3moss@…>, 6 years ago

resolver porting; finish top level of initialization

  • Property mode set to 100644
File size: 4.1 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// CurrentObject.h --
8//
9// Author : Rob Schluntz
10// Created On : Thu Jun 8 11:07:25 2017
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Sat Jul 22 09:36:48 2017
13// Update Count : 3
14//
15
16#pragma once
17
18#include <deque>
19#include <list> // for list
20#include <memory> // for unique_ptr
21#include <stack> // for stack
22#include <vector>
23
24#include "AST/Node.hpp" // for ptr
25#include "Common/CodeLocation.h"
26
27class Designation;
28class Type;
29struct InitAlternative;
30
31namespace ResolvExpr {
32 class MemberIterator;
33
34 // TODO: memory management of MemberIterators
35 class CurrentObject {
36 public:
37 CurrentObject();
38 CurrentObject( Type * type );
39
40 /// resolves unresolved designation
41 Designation * findNext( Designation * designation );
42 /// sets current position using resolved designation
43 void setNext( Designation * designation );
44 /// steps to next sub-object of current-object
45 void increment();
46 /// sets new current-object for the duration of this brace-enclosed initializer-list
47 void enterListInit();
48 /// restores previous current-object
49 void exitListInit();
50 /// produces a list of alternatives (Type *, Designation *) for the current sub-object's initializer
51 std::list< InitAlternative > getOptions();
52 /// produces the type of the current object but no subobjects
53 Type * getCurrentType();
54
55 private:
56 std::stack< MemberIterator * > objStack;
57 };
58} // namespace ResolvExpr
59
60namespace 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
131// Local Variables: //
132// tab-width: 4 //
133// mode: c++ //
134// compile-command: "make install" //
135// End: //
136
Note: See TracBrowser for help on using the repository browser.