//===- Support.cpp - Helpers for C interface to MLIR API ------------------===//
//
// 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
//
//===----------------------------------------------------------------------===//

#include "mlir/CAPI/Support.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/Support/ThreadPool.h"

#include <cstring>

MlirStringRef mlirStringRefCreateFromCString(const char *str) {
  return mlirStringRefCreate(str, strlen(str));
}

bool mlirStringRefEqual(MlirStringRef string, MlirStringRef other) {
  return llvm::StringRef(string.data, string.length) ==
         llvm::StringRef(other.data, other.length);
}

//===----------------------------------------------------------------------===//
// LLVM ThreadPool API.
//===----------------------------------------------------------------------===//
MlirLlvmThreadPool mlirLlvmThreadPoolCreate() {
  return wrap(new llvm::DefaultThreadPool());
}

void mlirLlvmThreadPoolDestroy(MlirLlvmThreadPool threadPool) {
  delete unwrap(threadPool);
}

//===----------------------------------------------------------------------===//
// TypeID API.
//===----------------------------------------------------------------------===//
MlirTypeID mlirTypeIDCreate(const void *ptr) {
  assert(reinterpret_cast<uintptr_t>(ptr) % 8 == 0 &&
         "ptr must be 8 byte aligned");
  // This is essentially a no-op that returns back `ptr`, but by going through
  // the `TypeID` functions we can get compiler errors in case the `TypeID`
  // api/representation changes
  return wrap(mlir::TypeID::getFromOpaquePointer(ptr));
}

bool mlirTypeIDEqual(MlirTypeID typeID1, MlirTypeID typeID2) {
  return unwrap(typeID1) == unwrap(typeID2);
}

size_t mlirTypeIDHashValue(MlirTypeID typeID) {
  return hash_value(unwrap(typeID));
}

//===----------------------------------------------------------------------===//
// TypeIDAllocator API.
//===----------------------------------------------------------------------===//

MlirTypeIDAllocator mlirTypeIDAllocatorCreate() {
  return wrap(new mlir::TypeIDAllocator());
}

void mlirTypeIDAllocatorDestroy(MlirTypeIDAllocator allocator) {
  delete unwrap(allocator);
}

MlirTypeID mlirTypeIDAllocatorAllocateTypeID(MlirTypeIDAllocator allocator) {
  return wrap(unwrap(allocator)->allocate());
}
