// Copyright 2021 The Tint Authors.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

////////////////////////////////////////////////////////////////////////////////
// File generated by tools/intrinsic-gen
// using the template:
//   src/tint/resolver/ctor_conv_intrinsic.h.tmpl
// and the intrinsic defintion file:
//   src/tint/intrinsics.def
//
// Do not modify this file directly
////////////////////////////////////////////////////////////////////////////////

#ifndef SRC_TINT_RESOLVER_CTOR_CONV_INTRINSIC_H_
#define SRC_TINT_RESOLVER_CTOR_CONV_INTRINSIC_H_

#include <cstdint>

namespace tint::resolver {

/// CtorConvIntrinsic is an enumerator of types that have a constructor or converter overload
/// declared in the intrinsic table.
enum class CtorConvIntrinsic {
    kNone = -1,
    kI32,
    kU32,
    kF32,
    kF16,
    kBool,
    kVec2,
    kVec3,
    kVec4,
    kMat2x2,
    kMat2x3,
    kMat2x4,
    kMat3x2,
    kMat3x3,
    kMat3x4,
    kMat4x2,
    kMat4x3,
    kMat4x4,
};

/// @returns the name of the type.
const char* str(CtorConvIntrinsic i);

/// @param n the width of the vector
/// @return the CtorConvIntrinsic for a vector of width `n`
inline CtorConvIntrinsic VectorCtorConvIntrinsic(uint32_t n) {
    switch (n) {
        case 2:
            return CtorConvIntrinsic::kVec2;
        case 3:
            return CtorConvIntrinsic::kVec3;
        case 4:
            return CtorConvIntrinsic::kVec4;
    }
    return CtorConvIntrinsic::kNone;
}

/// @param c the number of columns in the matrix
/// @param r the number of rows in the matrix
/// @return the CtorConvIntrinsic for a matrix with `c` columns and `r` rows
inline CtorConvIntrinsic MatrixCtorConvIntrinsic(uint32_t c, uint32_t r) {
    switch ((c - 2) * 3 + (r - 2)) {
        case 0:
            return CtorConvIntrinsic::kMat2x2;
        case 1:
            return CtorConvIntrinsic::kMat2x3;
        case 2:
            return CtorConvIntrinsic::kMat2x4;
        case 3:
            return CtorConvIntrinsic::kMat3x2;
        case 4:
            return CtorConvIntrinsic::kMat3x3;
        case 5:
            return CtorConvIntrinsic::kMat3x4;
        case 6:
            return CtorConvIntrinsic::kMat4x2;
        case 7:
            return CtorConvIntrinsic::kMat4x3;
        case 8:
            return CtorConvIntrinsic::kMat4x4;
    }
    return CtorConvIntrinsic::kNone;
}

}  // namespace tint::resolver

#endif  // SRC_TINT_RESOLVER_CTOR_CONV_INTRINSIC_H_
