1c878d03dSBenjamin Kramer //===- InterfaceSupport.cpp - MLIR Interface Support Classes --------------===//
2c878d03dSBenjamin Kramer //
3c878d03dSBenjamin Kramer // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c878d03dSBenjamin Kramer // See https://llvm.org/LICENSE.txt for license information.
5c878d03dSBenjamin Kramer // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c878d03dSBenjamin Kramer //
7c878d03dSBenjamin Kramer //===----------------------------------------------------------------------===//
8c878d03dSBenjamin Kramer //
9c878d03dSBenjamin Kramer // This file defines several support classes for defining interfaces.
10c878d03dSBenjamin Kramer //
11c878d03dSBenjamin Kramer //===----------------------------------------------------------------------===//
12c878d03dSBenjamin Kramer
13c878d03dSBenjamin Kramer #include "mlir/Support/InterfaceSupport.h"
14c878d03dSBenjamin Kramer #include "llvm/Support/Debug.h"
15c878d03dSBenjamin Kramer #include "llvm/Support/raw_ostream.h"
16c878d03dSBenjamin Kramer
17c878d03dSBenjamin Kramer #define DEBUG_TYPE "interfaces"
18c878d03dSBenjamin Kramer
19c878d03dSBenjamin Kramer using namespace mlir;
20c878d03dSBenjamin Kramer
InterfaceMap(MutableArrayRef<std::pair<TypeID,void * >> elements)21*548757baSBenjamin Kramer detail::InterfaceMap::InterfaceMap(
22*548757baSBenjamin Kramer MutableArrayRef<std::pair<TypeID, void *>> elements)
23*548757baSBenjamin Kramer : interfaces(elements.begin(), elements.end()) {
24*548757baSBenjamin Kramer llvm::sort(interfaces, [](const auto &lhs, const auto &rhs) {
25*548757baSBenjamin Kramer return compare(lhs.first, rhs.first);
26*548757baSBenjamin Kramer });
27*548757baSBenjamin Kramer }
28*548757baSBenjamin Kramer
insert(ArrayRef<std::pair<TypeID,void * >> elements)29c878d03dSBenjamin Kramer void detail::InterfaceMap::insert(
30c878d03dSBenjamin Kramer ArrayRef<std::pair<TypeID, void *>> elements) {
31c878d03dSBenjamin Kramer // Insert directly into the right position to keep the interfaces sorted.
32c878d03dSBenjamin Kramer for (auto &element : elements) {
33c878d03dSBenjamin Kramer TypeID id = element.first;
34c878d03dSBenjamin Kramer auto *it = llvm::lower_bound(interfaces, id, [](const auto &it, TypeID id) {
35c878d03dSBenjamin Kramer return compare(it.first, id);
36c878d03dSBenjamin Kramer });
37c878d03dSBenjamin Kramer if (it != interfaces.end() && it->first == id) {
38c878d03dSBenjamin Kramer LLVM_DEBUG(llvm::dbgs() << "Ignoring repeated interface registration");
39db79f4a2SMehdi Amini free(element.second);
40c878d03dSBenjamin Kramer continue;
41c878d03dSBenjamin Kramer }
42c878d03dSBenjamin Kramer interfaces.insert(it, element);
43c878d03dSBenjamin Kramer }
44c878d03dSBenjamin Kramer }
45