//===-- SubElementInterfaces.td - Sub-Element Interfaces ---*- tablegen -*-===//
//
// 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 contains a set of interfaces that can be used to interface with
// sub-elements, e.g. held attributes and types, of a composite attribute or
// type.
//
//===----------------------------------------------------------------------===//

#ifndef MLIR_IR_SUBELEMENTINTERFACES_TD_
#define MLIR_IR_SUBELEMENTINTERFACES_TD_

include "mlir/IR/OpBase.td"

//===----------------------------------------------------------------------===//
// SubElementInterfaceBase
//===----------------------------------------------------------------------===//

class SubElementInterfaceBase<string interfaceName, string derivedValue> {
  string cppNamespace = "::mlir";

  list<InterfaceMethod> methods = [
    InterfaceMethod<
      /*desc=*/[{
        Walk all of the immediately nested sub-attributes and sub-types. This
        method does not recurse into sub elements.
      }], "void", "walkImmediateSubElements",
      (ins "llvm::function_ref<void(mlir::Attribute)>":$walkAttrsFn,
           "llvm::function_ref<void(mlir::Type)>":$walkTypesFn)
    >,
    InterfaceMethod<
      /*desc=*/[{
        Replace the attributes identified by the indices with the corresponding
        value. The index is derived from the order of the attributes returned by
        the attribute callback of `walkImmediateSubElements`. An index of 0 would
        replace the very first attribute given by `walkImmediateSubElements`.
        The new instance with the values replaced is returned.
      }], cppNamespace # "::" # interfaceName, "replaceImmediateSubAttribute",
      (ins "::llvm::ArrayRef<std::pair<size_t, ::mlir::Attribute>>":$replacements),
      [{}],
      /*defaultImplementation=*/[{
        llvm_unreachable("Attribute or Type does not support replacing attributes");
      }]
    >,
  ];

  code extraClassDeclaration = [{
    /// Walk all of the held sub-attributes.
    void walkSubAttrs(llvm::function_ref<void(mlir::Attribute)> walkFn) {
      walkSubElements(walkFn, /*walkTypesFn=*/[](mlir::Type) {});
    }

    /// Walk all of the held sub-types.
    void walkSubTypes(llvm::function_ref<void(mlir::Type)> walkFn) {
      walkSubElements(/*walkAttrsFn=*/[](mlir::Attribute) {}, walkFn);
    }

    /// Walk all of the held sub-attributes and sub-types.
    void walkSubElements(llvm::function_ref<void(mlir::Attribute)> walkAttrsFn,
                         llvm::function_ref<void(mlir::Type)> walkTypesFn);
  }];

  code extraTraitClassDeclaration = [{
    /// Walk all of the held sub-attributes.
    void walkSubAttrs(llvm::function_ref<void(mlir::Attribute)> walkFn) {
      walkSubElements(walkFn, /*walkTypesFn=*/[](mlir::Type) {});
    }

    /// Walk all of the held sub-types.
    void walkSubTypes(llvm::function_ref<void(mlir::Type)> walkFn) {
      walkSubElements(/*walkAttrsFn=*/[](mlir::Attribute) {}, walkFn);
    }

    /// Walk all of the held sub-attributes and sub-types.
    void walkSubElements(llvm::function_ref<void(mlir::Attribute)> walkAttrsFn,
                         llvm::function_ref<void(mlir::Type)> walkTypesFn) {
      }] # interfaceName # " interface(" # derivedValue # [{);
      interface.walkSubElements(walkAttrsFn, walkTypesFn);
    }
  }];
}

//===----------------------------------------------------------------------===//
// SubElementAttrInterface
//===----------------------------------------------------------------------===//

def SubElementAttrInterface
    : AttrInterface<"SubElementAttrInterface">,
      SubElementInterfaceBase<"SubElementAttrInterface", "$_attr"> {
  let description = [{
    An interface used to query and manipulate sub-elements, such as sub-types
    and sub-attributes of a composite attribute.
  }];
}

//===----------------------------------------------------------------------===//
// SubElementTypeInterface
//===----------------------------------------------------------------------===//

def SubElementTypeInterface
    : TypeInterface<"SubElementTypeInterface">,
      SubElementInterfaceBase<"SubElementTypeInterface", "$_type"> {
  let description = [{
    An interface used to query and manipulate sub-elements, such as sub-types
    and sub-attributes of a composite type.
  }];
}

#endif // MLIR_IR_SUBELEMENTINTERFACES_TD_
