Changeset a085470 for src/ResolvExpr
- Timestamp:
- Apr 10, 2023, 12:03:31 PM (3 years ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 6adeb5f
- Parents:
- 2b01f8e (diff), ea2759b (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)links above to see all the changes relative to each parent. - Location:
- src/ResolvExpr
- Files:
-
- 2 edited
-
CurrentObject.cc (modified) (4 diffs)
-
CurrentObject.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CurrentObject.cc
r2b01f8e ra085470 9 9 // Author : Rob Schluntz 10 10 // Created On : Tue Jun 13 15:28:32 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jul 1 09:16:01 202213 // Update Count : 1 511 // Last Modified By : Andrew Beach 12 // Last Modified On : Mon Apr 10 9:40:00 2023 13 // Update Count : 18 14 14 // 15 15 … … 593 593 594 594 namespace ast { 595 /// Iterates members of a type by initializer. 596 class MemberIterator { 597 public: 598 virtual ~MemberIterator() {} 599 600 /// Internal set position based on iterator ranges. 601 virtual void setPosition( 602 std::deque< ptr< Expr > >::const_iterator it, 603 std::deque< ptr< Expr > >::const_iterator end ) = 0; 604 605 /// Walks the current object using the given designators as a guide. 606 void setPosition( const std::deque< ptr< Expr > > & designators ) { 607 setPosition( designators.begin(), designators.end() ); 608 } 609 610 /// Retrieve the list of possible (Type,Designation) pairs for the 611 /// current position in the current object. 612 virtual std::deque< InitAlternative > operator* () const = 0; 613 614 /// True if the iterator is not currently at the end. 615 virtual operator bool() const = 0; 616 617 /// Moves the iterator by one member in the current object. 618 virtual MemberIterator & bigStep() = 0; 619 620 /// Moves the iterator by one member in the current subobject. 621 virtual MemberIterator & smallStep() = 0; 622 623 /// The type of the current object. 624 virtual const Type * getType() = 0; 625 626 /// The type of the current subobject. 627 virtual const Type * getNext() = 0; 628 629 /// Helper for operator*; aggregates must add designator to each init 630 /// alternative, but adding designators in operator* creates duplicates. 631 virtual std::deque< InitAlternative > first() const = 0; 632 }; 633 595 634 /// create a new MemberIterator that traverses a type correctly 596 635 MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type ); … … 684 723 685 724 void setPosition( 686 std::deque< ptr< Expr >>::const_iterator begin,687 std::deque< ptr< Expr >>::const_iterator end725 std::deque<ast::ptr<ast::Expr>>::const_iterator begin, 726 std::deque<ast::ptr<ast::Expr>>::const_iterator end 688 727 ) override { 689 728 if ( begin == end ) return; … … 898 937 }; 899 938 900 class TupleIterator final : public AggregateIterator { 901 public: 902 TupleIterator( const CodeLocation & loc, const TupleType * inst ) 903 : AggregateIterator( 904 loc, "TupleIterator", toString("Tuple", inst->size()), inst, inst->members 905 ) {} 939 /// Iterates across the positions in a tuple: 940 class TupleIterator final : public MemberIterator { 941 CodeLocation location; 942 ast::TupleType const * const tuple; 943 size_t index = 0; 944 size_t size = 0; 945 std::unique_ptr<MemberIterator> sub_iter; 946 947 const ast::Type * typeAtIndex() const { 948 assert( index < size ); 949 return tuple->types[ index ].get(); 950 } 951 952 public: 953 TupleIterator( const CodeLocation & loc, const TupleType * type ) 954 : location( loc ), tuple( type ), size( type->size() ) { 955 PRINT( std::cerr << "Creating tuple iterator: " << type << std::endl; ) 956 sub_iter.reset( createMemberIterator( loc, typeAtIndex() ) ); 957 } 958 959 void setPosition( const ast::Expr * expr ) { 960 auto arg = eval( expr ); 961 index = arg.first; 962 } 963 964 void setPosition( 965 std::deque< ptr< Expr > >::const_iterator begin, 966 std::deque< ptr< Expr > >::const_iterator end ) { 967 if ( begin == end ) return; 968 969 setPosition( *begin ); 970 sub_iter->setPosition( ++begin, end ); 971 } 972 973 std::deque< InitAlternative > operator*() const override { 974 return first(); 975 } 906 976 907 977 operator bool() const override { 908 return curMember != members.end() || (memberIter && *memberIter);978 return index < size; 909 979 } 910 980 911 981 TupleIterator & bigStep() override { 912 PRINT( std::cerr << "bigStep in " << kind << std::endl; ) 913 atbegin = false; 914 memberIter = nullptr; 915 curType = nullptr; 916 while ( curMember != members.end() ) { 917 ++curMember; 918 if ( init() ) return *this; 919 } 982 ++index; 983 sub_iter.reset( index < size ? 984 createMemberIterator( location, typeAtIndex() ) : nullptr ); 920 985 return *this; 986 } 987 988 TupleIterator & smallStep() override { 989 if ( sub_iter ) { 990 PRINT( std::cerr << "has member iter: " << *sub_iter << std::endl; ) 991 sub_iter->smallStep(); 992 if ( !sub_iter ) { 993 PRINT( std::cerr << "has valid member iter" << std::endl; ) 994 return *this; 995 } 996 } 997 return bigStep(); 998 } 999 1000 const ast::Type * getType() override { 1001 return tuple; 1002 } 1003 1004 const ast::Type * getNext() override { 1005 return ( sub_iter && *sub_iter ) ? sub_iter->getType() : nullptr; 1006 } 1007 1008 std::deque< InitAlternative > first() const override { 1009 PRINT( std::cerr << "first in TupleIterator (" << index << "/" << size << ")" << std::endl; ) 1010 if ( sub_iter && *sub_iter ) { 1011 std::deque< InitAlternative > ret = sub_iter->first(); 1012 for ( InitAlternative & alt : ret ) { 1013 alt.designation.get_and_mutate()->designators.emplace_front( 1014 ConstantExpr::from_ulong( location, index ) ); 1015 } 1016 return ret; 1017 } 1018 return {}; 921 1019 } 922 1020 }; -
src/ResolvExpr/CurrentObject.h
r2b01f8e ra085470 9 9 // Author : Rob Schluntz 10 10 // Created On : Thu Jun 8 11:07:25 2017 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Sat Jul 22 09:36:48 201713 // Update Count : 311 // Last Modified By : Andrew Beach 12 // Last Modified On : Thu Apr 6 16:14:00 2023 13 // Update Count : 4 14 14 // 15 15 … … 65 65 66 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 }; 67 class MemberIterator; 104 68 105 69 /// Builds initializer lists in resolution
Note:
See TracChangeset
for help on using the changeset viewer.