// Copyright (C) 2026 Kiyotsugu Arai
// SPDX-License-Identifier: LGPL-3.0-or-later

// basic_types.hpp
// 基本型定義と前方宣言
//
// このファイルでは、他のヘッダーファイルで使用される基本的な型の定義を提供します。
// 循環参照を避けるため、このファイルは他のヘッダーファイルに依存しないようにします。

#ifndef CALX_BASIC_TYPES_HPP
#define CALX_BASIC_TYPES_HPP

#include <cstdint>
#include <utility> // std::pairのために追加
#include <stdexcept> // 例外クラスのために追加

namespace calx {

    // バージョン情報
    constexpr int VERSION_MAJOR = 2;
    constexpr int VERSION_MINOR = 0;
    constexpr int VERSION_PATCH = 0;

    /**
     * @brief 数値状態を表す列挙型
     * IEEE 754に準拠し、拡張された数値状態を表します
     */
    enum class NumericState : uint16_t {
        // 正常状態
        Normal = 0,                     ///< 通常の有効な数値

        // 特殊状態
        NaN = 1,                        ///< 非数
        PositiveInfinity = 100,         ///< +∞
        NegativeInfinity = 101,         ///< -∞
        ComplexInfinity = 102,          ///< 複素無限大
        Overflow = 103,                 ///< 数値が大きすぎる
        Underflow = 104,                ///< 数値が小さすぎる（精度喪失）
        Interrupted = 105,              ///< 計算が中断された
        PrecisionLimit = 106,           ///< 結果の精度に問題がある

        // ゼロ関連の状態
        PositiveZero = 201,      ///< +0
        NegativeZero = 202,      ///< -0

        // 特殊浮動小数点状態
        Subnormal = 300,         ///< 非正規化数

        // 収束状態
        NotConverged = 400,      ///< 収束しなかった
        Divergent = 401,         ///< 発散した
        Oscillating = 402,       ///< 振動している
        SlowConvergence = 403,   ///< 収束が遅い
        TruncatedConvergence = 404 ///< 収束計算が途中で打ち切られた
    };

    /**
     * @brief 数値エラーの原因を表す列挙型
     * 数値計算で発生するエラーの原因を示します
     */
    enum class NumericError : uint16_t {
        None = 0,                       ///< エラーなし
        DivideByZero = 1,               ///< 0による除算
        InfiniteIndeterminate = 2,      ///< ∞/∞, ∞-∞
        ZeroTimesInfinity = 3,          ///< 0×∞
        NegativeSqrt = 4,               ///< √負数
        ConversionError = 5,            ///< 表現範囲外の変換
        ExplicitNaN = 6,                ///< プログラム的に設定されたNaN
        Uninitialized = 7,              ///< 未初期化変数
        InvalidBitPattern = 8,          ///< IEEE 754で定義されたNaNビットパターン
        InvalidStringConversion = 9,    ///< 数値として解釈できない文字列からの変換
        OutOfRangeInput = 10,           ///< 処理系の制限を超えた値
        NaNPropagation = 11,            ///< NaNとの演算による伝搬
        IntegerConversionError = 12,    ///< 浮動小数点で表現できない整数からの変換
        FunctionDomainError = 13,       ///< 数学関数のドメイン外の値（asin(2)など）
        InvalidBitOperation = 14,       ///< 不適切なビット操作
        DivergenceError = 15            ///< 発散エラー
    };

    /**
     * @brief 発散の詳細を表す補助列挙型
     */
    enum class DivergenceDetail : uint8_t {
        None = 0,                   ///< 発散していない
        Diverging = 1,              ///< 単調に増加/減少して発散
        Oscillating = 2,            ///< 振動しながら振幅が増大
        Chaotic = 3,                ///< カオス的な挙動を示す
        SlowConvergence = 4,        ///< 収束するが極めて遅い
        TruncatedConvergence = 5,   ///< 収束過程が打ち切られた（最大反復回数到達など）
        ConditionalConvergenceViolation = 6,    ///< 条件付き収束が成立しない
        AlternatingSeriesDivergence = 7         ///< 交代級数が発散
    };

    // SIMD命令セットの検出
    enum class SimdInstructionSet {
        None,
        SSE2,
        SSE3,
        SSSE3,
        SSE4_1,
        SSE4_2,
        AVX,
        AVX2,
        AVX512,
        NEON
    };

    // 状態エラー処理オプション
    enum class StateErrorMode {
        Exception,     // エラー発生時に例外をスロー
        ReturnSpecial, // 特殊値（NaN、無限大など）を返す
        Silent         // エラーを無視（警告のみ）
    };

    // 前方宣言
    class Int;
    class Float;
    template<typename T> class Matrix;
    template<typename T> class Vector;

    // 数値状態特性クラスの前方宣言
    class NumericStateTraits;

    // UInt128型の前方宣言 (UInt128.hppのインクルードは削除)
    struct UInt128;

} // namespace calx

#endif // CALX_BASIC_TYPES_HPP