@@ -32,14 +32,17 @@ struct OperationState;
32
32
class OpAsmParser ;
33
33
class OpAsmParserResult ;
34
34
class OpAsmPrinter ;
35
+ class OperandRange ;
35
36
class OpFoldResult ;
36
37
class ParseResult ;
37
38
class Pattern ;
38
39
class Region ;
40
+ class ResultRange ;
39
41
class RewritePattern ;
40
42
class Type ;
41
43
class Value ;
42
44
class ValueRange ;
45
+ template <typename ValueRangeT> class ValueTypeRange ;
43
46
44
47
// / This is an adaptor from a list of values to named operands of OpTy. In a
45
48
// / generic operation context, e.g., in dialect conversions, an ordered array of
@@ -535,6 +538,46 @@ class OpPrintingFlags {
535
538
// Operation Value-Iterators
536
539
// ===----------------------------------------------------------------------===//
537
540
541
+ // ===----------------------------------------------------------------------===//
542
+ // TypeRange
543
+
544
+ // / This class provides an abstraction over the various different ranges of
545
+ // / value types. In many cases, this prevents the need to explicitly materialize
546
+ // / a SmallVector/std::vector. This class should be used in places that are not
547
+ // / suitable for a more derived type (e.g. ArrayRef) or a template range
548
+ // / parameter.
549
+ class TypeRange
550
+ : public detail::indexed_accessor_range_base<
551
+ TypeRange,
552
+ llvm::PointerUnion<const Value *, const Type *, OpOperand *>, Type,
553
+ Type, Type> {
554
+ public:
555
+ using RangeBaseT::RangeBaseT;
556
+ TypeRange (ArrayRef<Type> types = llvm::None);
557
+ explicit TypeRange (OperandRange values);
558
+ explicit TypeRange (ResultRange values);
559
+ explicit TypeRange (ValueRange values);
560
+ template <typename ValueRangeT>
561
+ TypeRange (ValueTypeRange<ValueRangeT> values)
562
+ : TypeRange(ValueRangeT(values.begin().getCurrent(),
563
+ values.end().getCurrent())) {}
564
+
565
+ private:
566
+ // / The owner of the range is either:
567
+ // / * A pointer to the first element of an array of values.
568
+ // / * A pointer to the first element of an array of types.
569
+ // / * A pointer to the first element of an array of operands.
570
+ using OwnerT = llvm::PointerUnion<const Value *, const Type *, OpOperand *>;
571
+
572
+ // / See `detail::indexed_accessor_range_base` for details.
573
+ static OwnerT offset_base (OwnerT object, ptrdiff_t index);
574
+ // / See `detail::indexed_accessor_range_base` for details.
575
+ static Type dereference_iterator (OwnerT object, ptrdiff_t index);
576
+
577
+ // / Allow access to `offset_base` and `dereference_iterator`.
578
+ friend RangeBaseT;
579
+ };
580
+
538
581
// ===----------------------------------------------------------------------===//
539
582
// ValueTypeRange
540
583
@@ -555,6 +598,18 @@ class ValueTypeIterator final
555
598
: llvm::mapped_iterator<ValueIteratorT, Type (*)(Value)>(it, &unwrap) {}
556
599
};
557
600
601
+ // / This class implements iteration on the types of a given range of values.
602
+ template <typename ValueRangeT>
603
+ class ValueTypeRange final
604
+ : public llvm::iterator_range<
605
+ ValueTypeIterator<typename ValueRangeT::iterator>> {
606
+ public:
607
+ using llvm::iterator_range<
608
+ ValueTypeIterator<typename ValueRangeT::iterator>>::iterator_range;
609
+ template <typename Container>
610
+ ValueTypeRange (Container &&c) : ValueTypeRange(c.begin(), c.end()) {}
611
+ };
612
+
558
613
// ===----------------------------------------------------------------------===//
559
614
// OperandRange
560
615
@@ -568,7 +623,8 @@ class OperandRange final
568
623
569
624
// / Returns the types of the values within this range.
570
625
using type_iterator = ValueTypeIterator<iterator>;
571
- iterator_range<type_iterator> getTypes () const { return {begin (), end ()}; }
626
+ using type_range = ValueTypeRange<OperandRange>;
627
+ type_range getTypes () const { return {begin (), end ()}; }
572
628
573
629
private:
574
630
// / See `detail::indexed_accessor_range_base` for details.
@@ -598,7 +654,8 @@ class ResultRange final
598
654
599
655
// / Returns the types of the values within this range.
600
656
using type_iterator = ArrayRef<Type>::iterator;
601
- ArrayRef<Type> getTypes () const ;
657
+ using type_range = ArrayRef<Type>;
658
+ type_range getTypes () const ;
602
659
603
660
private:
604
661
// / See `indexed_accessor_range` for details.
@@ -666,7 +723,8 @@ class ValueRange final
666
723
667
724
// / Returns the types of the values within this range.
668
725
using type_iterator = ValueTypeIterator<iterator>;
669
- iterator_range<type_iterator> getTypes () const { return {begin (), end ()}; }
726
+ using type_range = ValueTypeRange<ValueRange>;
727
+ type_range getTypes () const { return {begin (), end ()}; }
670
728
671
729
private:
672
730
using OwnerT = detail::ValueRangeOwner;
0 commit comments