//===-- runtime/type-code.cpp ---------------------------------------------===//
//
// 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 "flang/Runtime/type-code.h"

namespace Fortran::runtime {

RT_OFFLOAD_API_GROUP_BEGIN

RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) {
  switch (f) {
  case TypeCategory::Integer:
    switch (kind) {
    case 1:
      raw_ = CFI_type_int8_t;
      break;
    case 2:
      raw_ = CFI_type_int16_t;
      break;
    case 4:
      raw_ = CFI_type_int32_t;
      break;
    case 8:
      raw_ = CFI_type_int64_t;
      break;
    case 16:
      raw_ = CFI_type_int128_t;
      break;
    }
    break;
  case TypeCategory::Real:
    switch (kind) {
    case 2:
      raw_ = CFI_type_half_float;
      break;
    case 3:
      raw_ = CFI_type_bfloat;
      break;
    case 4:
      raw_ = CFI_type_float;
      break;
    case 8:
      raw_ = CFI_type_double;
      break;
    case 10:
      raw_ = CFI_type_extended_double;
      break;
    case 16:
      raw_ = CFI_type_float128;
      break;
    }
    break;
  case TypeCategory::Complex:
    switch (kind) {
    case 2:
      raw_ = CFI_type_half_float_Complex;
      break;
    case 3:
      raw_ = CFI_type_bfloat_Complex;
      break;
    case 4:
      raw_ = CFI_type_float_Complex;
      break;
    case 8:
      raw_ = CFI_type_double_Complex;
      break;
    case 10:
      raw_ = CFI_type_extended_double_Complex;
      break;
    case 16:
      raw_ = CFI_type_long_double_Complex;
      break;
    }
    break;
  case TypeCategory::Character:
    switch (kind) {
    case 1:
      raw_ = CFI_type_char;
      break;
    case 2:
      raw_ = CFI_type_char16_t;
      break;
    case 4:
      raw_ = CFI_type_char32_t;
      break;
    }
    break;
  case TypeCategory::Logical:
    switch (kind) {
    case 1:
      raw_ = CFI_type_Bool;
      break;
    case 2:
      raw_ = CFI_type_int_least16_t;
      break;
    case 4:
      raw_ = CFI_type_int_least32_t;
      break;
    case 8:
      raw_ = CFI_type_int_least64_t;
      break;
    }
    break;
  case TypeCategory::Derived:
    raw_ = CFI_type_struct;
    break;
  }
}

RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>>
TypeCode::GetCategoryAndKind() const {
  switch (raw_) {
  case CFI_type_signed_char:
    return std::make_pair(TypeCategory::Character, sizeof(signed char));
  case CFI_type_short:
    return std::make_pair(TypeCategory::Integer, sizeof(short));
  case CFI_type_int:
    return std::make_pair(TypeCategory::Integer, sizeof(int));
  case CFI_type_long:
    return std::make_pair(TypeCategory::Integer, sizeof(long));
  case CFI_type_long_long:
    return std::make_pair(TypeCategory::Integer, sizeof(long long));
  case CFI_type_size_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::size_t));
  case CFI_type_int8_t:
    return std::make_pair(TypeCategory::Integer, 1);
  case CFI_type_int16_t:
    return std::make_pair(TypeCategory::Integer, 2);
  case CFI_type_int32_t:
    return std::make_pair(TypeCategory::Integer, 4);
  case CFI_type_int64_t:
    return std::make_pair(TypeCategory::Integer, 8);
  case CFI_type_int128_t:
    return std::make_pair(TypeCategory::Integer, 16);
  case CFI_type_int_least8_t:
    return std::make_pair(TypeCategory::Logical, 1);
  case CFI_type_int_least16_t:
    return std::make_pair(TypeCategory::Logical, 2);
  case CFI_type_int_least32_t:
    return std::make_pair(TypeCategory::Logical, 4);
  case CFI_type_int_least64_t:
    return std::make_pair(TypeCategory::Logical, 8);
  case CFI_type_int_least128_t:
    return std::make_pair(TypeCategory::Integer, 16);
  case CFI_type_int_fast8_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast8_t));
  case CFI_type_int_fast16_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast16_t));
  case CFI_type_int_fast32_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast32_t));
  case CFI_type_int_fast64_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast64_t));
  case CFI_type_int_fast128_t:
    return std::make_pair(TypeCategory::Integer, 16);
  case CFI_type_intmax_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::intmax_t));
  case CFI_type_intptr_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::intptr_t));
  case CFI_type_ptrdiff_t:
    return std::make_pair(TypeCategory::Integer, sizeof(std::ptrdiff_t));
  case CFI_type_half_float:
    return std::make_pair(TypeCategory::Real, 2);
  case CFI_type_bfloat:
    return std::make_pair(TypeCategory::Real, 3);
  case CFI_type_float:
    return std::make_pair(TypeCategory::Real, 4);
  case CFI_type_double:
    return std::make_pair(TypeCategory::Real, 8);
  case CFI_type_extended_double:
    return std::make_pair(TypeCategory::Real, 10);
  case CFI_type_long_double:
    return std::make_pair(TypeCategory::Real, 16);
  case CFI_type_float128:
    return std::make_pair(TypeCategory::Real, 16);
  case CFI_type_half_float_Complex:
    return std::make_pair(TypeCategory::Complex, 2);
  case CFI_type_bfloat_Complex:
    return std::make_pair(TypeCategory::Complex, 3);
  case CFI_type_float_Complex:
    return std::make_pair(TypeCategory::Complex, 4);
  case CFI_type_double_Complex:
    return std::make_pair(TypeCategory::Complex, 8);
  case CFI_type_extended_double_Complex:
    return std::make_pair(TypeCategory::Complex, 10);
  case CFI_type_long_double_Complex:
    return std::make_pair(TypeCategory::Complex, 16);
  case CFI_type_float128_Complex:
    return std::make_pair(TypeCategory::Complex, 16);
  case CFI_type_Bool:
    return std::make_pair(TypeCategory::Logical, 1);
  case CFI_type_char:
    return std::make_pair(TypeCategory::Character, 1);
  case CFI_type_cptr:
    return std::make_pair(TypeCategory::Integer, sizeof(void *));
  case CFI_type_struct:
    return std::make_pair(TypeCategory::Derived, 0);
  case CFI_type_char16_t:
    return std::make_pair(TypeCategory::Character, 2);
  case CFI_type_char32_t:
    return std::make_pair(TypeCategory::Character, 4);
  default:
    return Fortran::common::nullopt;
  }
}

RT_OFFLOAD_API_GROUP_END

} // namespace Fortran::runtime
