Changeset 699a97d
- Timestamp:
- Apr 20, 2023, 3:21:09 PM (12 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- 04c78215, b110bcc
- Parents:
- 45e753c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/CurrentObject.cc
r45e753c r699a97d 671 671 }; 672 672 673 /// Iterates array types 674 class ArrayIterator final : public MemberIterator { 673 /// Iterates over an indexed type: 674 class IndexIterator : public MemberIterator { 675 protected: 675 676 CodeLocation location; 676 const ArrayType * array = nullptr;677 const Type * base = nullptr;678 677 size_t index = 0; 679 678 size_t size = 0; 680 std::unique_ptr< MemberIterator > memberIter; 681 682 void setSize( const Expr * expr ) { 683 auto res = eval( expr ); 684 if ( ! res.second ) { 685 SemanticError( location, toString( "Array designator must be a constant expression: ", expr ) ); 686 } 687 size = res.first; 688 } 689 690 public: 691 ArrayIterator( const CodeLocation & loc, const ArrayType * at ) : location( loc ), array( at ), base( at->base ) { 692 PRINT( std::cerr << "Creating array iterator: " << at << std::endl; ) 693 memberIter.reset( createMemberIterator( loc, base ) ); 694 if ( at->isVarLen ) { 695 SemanticError( location, at, "VLA initialization does not support @=: " ); 696 } 697 setSize( at->dimension ); 698 } 679 std::unique_ptr<MemberIterator> memberIter; 680 public: 681 IndexIterator( const CodeLocation & loc, size_t size ) : 682 location( loc ), size( size ) 683 {} 699 684 700 685 void setPosition( const Expr * expr ) { … … 705 690 auto arg = eval( expr ); 706 691 index = arg.first; 707 return;708 692 709 693 // if ( auto constExpr = dynamic_cast< const ConstantExpr * >( expr ) ) { … … 735 719 736 720 operator bool() const override { return index < size; } 721 }; 722 723 /// Iterates over the members of array types: 724 class ArrayIterator final : public IndexIterator { 725 const ArrayType * array = nullptr; 726 const Type * base = nullptr; 727 728 size_t getSize( const Expr * expr ) { 729 auto res = eval( expr ); 730 if ( !res.second ) { 731 SemanticError( location, toString( "Array designator must be a constant expression: ", expr ) ); 732 } 733 return res.first; 734 } 735 736 public: 737 ArrayIterator( const CodeLocation & loc, const ArrayType * at ) : 738 IndexIterator( loc, getSize( at->dimension) ), 739 array( at ), base( at->base ) { 740 PRINT( std::cerr << "Creating array iterator: " << at << std::endl; ) 741 memberIter.reset( createMemberIterator( loc, base ) ); 742 if ( at->isVarLen ) { 743 SemanticError( location, at, "VLA initialization does not support @=: " ); 744 } 745 } 737 746 738 747 ArrayIterator & bigStep() override { … … 873 882 874 883 const Type * getNext() final { 875 return ( memberIter && *memberIter ) ? memberIter->getType() : nullptr; 884 bool hasMember = memberIter && *memberIter; 885 return hasMember ? memberIter->getType() : nullptr; 876 886 } 877 887 … … 938 948 939 949 /// Iterates across the positions in a tuple: 940 class TupleIterator final : public MemberIterator { 941 CodeLocation location; 950 class TupleIterator final : public IndexIterator { 942 951 ast::TupleType const * const tuple; 943 size_t index = 0;944 size_t size = 0;945 std::unique_ptr<MemberIterator> sub_iter;946 952 947 953 const ast::Type * typeAtIndex() const { … … 952 958 public: 953 959 TupleIterator( const CodeLocation & loc, const TupleType * type ) 954 : location( loc ), tuple( type ), size( type->size()) {960 : IndexIterator( loc, type->size() ), tuple( type ) { 955 961 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 } 976 977 operator bool() const override { 978 return index < size; 962 memberIter.reset( createMemberIterator( loc, typeAtIndex() ) ); 979 963 } 980 964 981 965 TupleIterator & bigStep() override { 982 966 ++index; 983 sub_iter.reset( index < size ?967 memberIter.reset( index < size ? 984 968 createMemberIterator( location, typeAtIndex() ) : nullptr ); 985 969 return *this; … … 987 971 988 972 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 ) {973 if ( memberIter ) { 974 PRINT( std::cerr << "has member iter: " << *memberIter << std::endl; ) 975 memberIter->smallStep(); 976 if ( !memberIter ) { 993 977 PRINT( std::cerr << "has valid member iter" << std::endl; ) 994 978 return *this; … … 1003 987 1004 988 const ast::Type * getNext() override { 1005 return ( sub_iter && *sub_iter ) ? sub_iter->getType() : nullptr; 989 bool hasMember = memberIter && *memberIter; 990 return hasMember ? memberIter->getType() : nullptr; 1006 991 } 1007 992 1008 993 std::deque< InitAlternative > first() const override { 1009 994 PRINT( std::cerr << "first in TupleIterator (" << index << "/" << size << ")" << std::endl; ) 1010 if ( sub_iter && *sub_iter ) {1011 std::deque< InitAlternative > ret = sub_iter->first();995 if ( memberIter && *memberIter ) { 996 std::deque< InitAlternative > ret = memberIter->first(); 1012 997 for ( InitAlternative & alt : ret ) { 1013 998 alt.designation.get_and_mutate()->designators.emplace_front(
Note: See TracChangeset
for help on using the changeset viewer.