/* Copyright (C) 2026 Apple Inc. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#pragma once

#if ENABLE(WEBASSEMBLY)

namespace JSC {
namespace B3 {
class Type;
enum TypeKind : uint32_t;
}

namespace Wasm {
enum class TypeKind : int8_t;

class AddressType {
public:
    enum class Kind : int8_t {
        I32,
        I64
    };
    using enum Kind;
    AddressType() = default;
    AddressType(TypeKind);
    AddressType(AddressType::Kind);
#if !PLATFORM(PLAYSTATION)
    AddressType(B3::Type);
#endif
    explicit AddressType(bool is64bit);

    AddressType::Kind type() const { return m_type; }
    TypeKind NODELETE asWasmTypeKind() const;
    B3::TypeKind NODELETE asB3TypeKind() const;

    friend bool NODELETE operator==(const AddressType& lhs, const AddressType& rhs);
    friend bool operator!=(const AddressType& lhs, const AddressType& rhs);
    bool is64Bit() const { return m_type == AddressType::I64; }

private:

    AddressType::Kind m_type { AddressType::I32 };
};

} } // namespace JSC::Wasm
    //
#endif // ENABLE(WEBASSEMBLY)
