Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/ResolvExpr/CurrentObject.cc

    rea2759b r8f06277  
    99// Author           : Rob Schluntz
    1010// Created On       : Tue Jun 13 15:28:32 2017
    11 // Last Modified By : Andrew Beach
    12 // Last Modified On : Mon Apr 10  9:40:00 2023
    13 // Update Count     : 18
     11// Last Modified By : Peter A. Buhr
     12// Last Modified On : Fri Jul  1 09:16:01 2022
     13// Update Count     : 15
    1414//
    1515
     
    593593
    594594namespace 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 
    634595        /// create a new MemberIterator that traverses a type correctly
    635596        MemberIterator * createMemberIterator( const CodeLocation & loc, const Type * type );
     
    723684
    724685                void setPosition(
    725                         std::deque<ast::ptr<ast::Expr>>::const_iterator begin,
    726                         std::deque<ast::ptr<ast::Expr>>::const_iterator end
     686                        std::deque< ptr< Expr > >::const_iterator begin,
     687                        std::deque< ptr< Expr > >::const_iterator end
    727688                ) override {
    728689                        if ( begin == end ) return;
     
    937898        };
    938899
    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                 }
     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                ) {}
    976906
    977907                operator bool() const override {
    978                         return index < size;
     908                        return curMember != members.end() || (memberIter && *memberIter);
    979909                }
    980910
    981911                TupleIterator & bigStep() override {
    982                         ++index;
    983                         sub_iter.reset( index < size ?
    984                                 createMemberIterator( location, typeAtIndex() ) : nullptr );
     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                        }
    985920                        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 {};
    1019921                }
    1020922        };
Note: See TracChangeset for help on using the changeset viewer.