//===- ValueRange.h - Indexed Value-Iterators Range Classes -----*- 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 ValueRange related classes. // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_VALUERANGE_H #define MLIR_IR_VALUERANGE_H #include "mlir/IR/BuiltinAttributes.h" #include "mlir/IR/Types.h" #include "mlir/IR/Value.h" #include "llvm/ADT/PointerUnion.h" #include "llvm/ADT/Sequence.h" #include <optional> namespace mlir { class ValueRange; template <typename ValueRangeT> class ValueTypeRange; class TypeRangeRange; template <typename ValueIteratorT> class ValueTypeIterator; class OperandRangeRange; class MutableOperandRangeRange; //===----------------------------------------------------------------------===// // Operation Value-Iterators //===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===// // OperandRange /// This class implements the operand iterators for the Operation class. class OperandRange final : public llvm::detail::indexed_accessor_range_base< OperandRange, OpOperand *, Value, Value, Value> { … }; //===----------------------------------------------------------------------===// // OperandRangeRange /// This class represents a contiguous range of operand ranges, e.g. from a /// VariadicOfVariadic operand group. class OperandRangeRange final : public llvm::indexed_accessor_range< OperandRangeRange, std::pair<OpOperand *, Attribute>, OperandRange, OperandRange, OperandRange> { … }; //===----------------------------------------------------------------------===// // MutableOperandRange /// This class provides a mutable adaptor for a range of operands. It allows for /// setting, inserting, and erasing operands from the given range. class MutableOperandRange { … }; //===----------------------------------------------------------------------===// // MutableOperandRangeRange /// This class represents a contiguous range of mutable operand ranges, e.g. /// from a VariadicOfVariadic operand group. class MutableOperandRangeRange final : public llvm::indexed_accessor_range< MutableOperandRangeRange, std::pair<MutableOperandRange, NamedAttribute>, MutableOperandRange, MutableOperandRange, MutableOperandRange> { … }; //===----------------------------------------------------------------------===// // ResultRange /// This class implements the result iterators for the Operation class. class ResultRange final : public llvm::detail::indexed_accessor_range_base< ResultRange, detail::OpResultImpl *, OpResult, OpResult, OpResult> { … }; /// This class implements a use iterator for a range of operation results. /// This iterates over all uses of all results within the given result range. class ResultRange::UseIterator final : public llvm::iterator_facade_base<UseIterator, std::forward_iterator_tag, OpOperand> { … }; //===----------------------------------------------------------------------===// // ValueRange /// This class provides an abstraction over the different types of ranges over /// Values. 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 ValueRange final : public llvm::detail::indexed_accessor_range_base< ValueRange, PointerUnion<const Value *, OpOperand *, detail::OpResultImpl *>, Value, Value, Value> { … }; } // namespace mlir #endif // MLIR_IR_VALUERANGE_H