//===- BuiltinAttributeInterfaces.h - Builtin Attr Interfaces ---*- 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 // //===----------------------------------------------------------------------===// #ifndef MLIR_IR_BUILTINATTRIBUTEINTERFACES_H #define MLIR_IR_BUILTINATTRIBUTEINTERFACES_H #include "mlir/IR/AffineMap.h" #include "mlir/IR/Attributes.h" #include "mlir/IR/BuiltinTypeInterfaces.h" #include "mlir/IR/Types.h" #include "llvm/Support/raw_ostream.h" #include <complex> #include <optional> namespace mlir { //===----------------------------------------------------------------------===// // ElementsAttr //===----------------------------------------------------------------------===// namespace detail { /// This class provides support for indexing into the element range of an /// ElementsAttr. It is used to opaquely wrap either a contiguous range, via /// `ElementsAttrIndexer::contiguous`, or a non-contiguous range, via /// `ElementsAttrIndexer::nonContiguous`, A contiguous range is an array-like /// range, where all of the elements are layed out sequentially in memory. A /// non-contiguous range implies no contiguity, and elements may even be /// materialized when indexing, such as the case for a mapped_range. struct ElementsAttrIndexer { … }; /// This class implements a generic iterator for ElementsAttr. template <typename T> class ElementsAttrIterator : public llvm::iterator_facade_base<ElementsAttrIterator<T>, std::random_access_iterator_tag, T, std::ptrdiff_t, T, T> { … }; /// This class provides iterator utilities for an ElementsAttr range. template <typename IteratorT> class ElementsAttrRange : public llvm::iterator_range<IteratorT> { … }; } // namespace detail //===----------------------------------------------------------------------===// // MemRefLayoutAttrInterface //===----------------------------------------------------------------------===// namespace detail { // Verify the affine map 'm' can be used as a layout specification // for memref with 'shape'. LogicalResult verifyAffineMapAsLayout(AffineMap m, ArrayRef<int64_t> shape, function_ref<InFlightDiagnostic()> emitError); } // namespace detail } // namespace mlir //===----------------------------------------------------------------------===// // Tablegen Interface Declarations //===----------------------------------------------------------------------===// #include "mlir/IR/BuiltinAttributeInterfaces.h.inc" //===----------------------------------------------------------------------===// // ElementsAttr //===----------------------------------------------------------------------===// namespace mlir { namespace detail { /// Return the value at the given index. template <typename IteratorT> auto ElementsAttrRange<IteratorT>::operator[](ArrayRef<uint64_t> index) const -> reference { … } } // namespace detail /// Return the elements of this attribute as a value of type 'T'. template <typename T> auto ElementsAttr::value_begin() const -> DefaultValueCheckT<T, iterator<T>> { … } template <typename T> auto ElementsAttr::try_value_begin() const -> DefaultValueCheckT<T, std::optional<iterator<T>>> { … } } // namespace mlir. #endif // MLIR_IR_BUILTINATTRIBUTEINTERFACES_H