1//===- TypeRange.cpp ------------------------------------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "mlir/IR/TypeRange.h"
10#include "mlir/IR/Operation.h"
11
12using namespace mlir;
13
14//===----------------------------------------------------------------------===//
15// TypeRange
16//===----------------------------------------------------------------------===//
17
18TypeRange::TypeRange(ArrayRef<Type> types)
19 : TypeRange(types.data(), types.size()) {
20 assert(llvm::all_of(types, [](Type t) { return t; }) &&
21 "attempting to construct a TypeRange with null types");
22}
23TypeRange::TypeRange(OperandRange values)
24 : TypeRange(values.begin().getBase(), values.size()) {}
25TypeRange::TypeRange(ResultRange values)
26 : TypeRange(values.getBase(), values.size()) {}
27TypeRange::TypeRange(ValueRange values) : TypeRange(OwnerT(), values.size()) {
28 if (count == 0)
29 return;
30 ValueRange::OwnerT owner = values.begin().getBase();
31 if (auto *result = llvm::dyn_cast_if_present<detail::OpResultImpl *>(Val&: owner))
32 this->base = result;
33 else if (auto *operand = llvm::dyn_cast_if_present<OpOperand *>(Val&: owner))
34 this->base = operand;
35 else
36 this->base = cast<const Value *>(Val&: owner);
37}
38
39/// See `llvm::detail::indexed_accessor_range_base` for details.
40TypeRange::OwnerT TypeRange::offset_base(OwnerT object, ptrdiff_t index) {
41 if (const auto *value = llvm::dyn_cast_if_present<const Value *>(Val&: object))
42 return {value + index};
43 if (auto *operand = llvm::dyn_cast_if_present<OpOperand *>(Val&: object))
44 return {operand + index};
45 if (auto *result = llvm::dyn_cast_if_present<detail::OpResultImpl *>(Val&: object))
46 return {result->getNextResultAtOffset(offset: index)};
47 return {llvm::dyn_cast_if_present<const Type *>(Val&: object) + index};
48}
49
50/// See `llvm::detail::indexed_accessor_range_base` for details.
51Type TypeRange::dereference_iterator(OwnerT object, ptrdiff_t index) {
52 if (const auto *value = llvm::dyn_cast_if_present<const Value *>(Val&: object))
53 return (value + index)->getType();
54 if (auto *operand = llvm::dyn_cast_if_present<OpOperand *>(Val&: object))
55 return (operand + index)->get().getType();
56 if (auto *result = llvm::dyn_cast_if_present<detail::OpResultImpl *>(Val&: object))
57 return result->getNextResultAtOffset(offset: index)->getType();
58 return llvm::dyn_cast_if_present<const Type *>(Val&: object)[index];
59}
60

source code of mlir/lib/IR/TypeRange.cpp