//===- TypeRange.h ----------------------------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // // This file defines the TypeRange and ValueTypeRange classes. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_TYPERANGE_H #define MLIR_IR_TYPERANGE_H #include "mlir/IR/Types.h" #include "mlir/IR/Value.h" #include "mlir/IR/ValueRange.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/Sequence.h" namespace mlir { //===----------------------------------------------------------------------===// // TypeRange /// This class provides an abstraction over the various different ranges of /// value types. In many cases, this prevents the need to explicitly materialize /// a SmallVector/std::vector. This class should be used in places that are not /// suitable for a more derived type (e.g. ArrayRef) or a template range /// parameter. class TypeRange : public llvm::detail::indexed_accessor_range_base< TypeRange, llvm::PointerUnion<const Value *, const Type *, OpOperand *, detail::OpResultImpl *>, Type, Type, Type> { … }; /// Make TypeRange hashable. inline ::llvm::hash_code hash_value(TypeRange arg) { … } /// Emit a type range to the given output stream. inline raw_ostream &operator<<(raw_ostream &os, const TypeRange &types) { … } //===----------------------------------------------------------------------===// // TypeRangeRange TypeRangeRangeIterator; /// This class provides an abstraction for a range of TypeRange. This is useful /// when accessing the types of a range of ranges, such as when using /// OperandRangeRange. class TypeRangeRange : public llvm::iterator_range<TypeRangeRangeIterator> { … }; //===----------------------------------------------------------------------===// // ValueTypeRange /// This class implements iteration on the types of a given range of values. template <typename ValueIteratorT> class ValueTypeIterator final : public llvm::mapped_iterator_base<ValueTypeIterator<ValueIteratorT>, ValueIteratorT, Type> { … }; /// This class implements iteration on the types of a given range of values. template <typename ValueRangeT> class ValueTypeRange final : public llvm::iterator_range< ValueTypeIterator<typename ValueRangeT::iterator>> { … }; template <typename RangeT> inline bool operator==(ArrayRef<Type> lhs, const ValueTypeRange<RangeT> &rhs) { … } //===----------------------------------------------------------------------===// // SubElements //===----------------------------------------------------------------------===// /// Enable TypeRange to be introspected for sub-elements. template <> struct AttrTypeSubElementHandler<TypeRange> { … }; } // namespace mlir namespace llvm { // Provide DenseMapInfo for TypeRange. template <> struct DenseMapInfo<mlir::TypeRange> { … }; } // namespace llvm #endif // MLIR_IR_TYPERANGE_H