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

// FloatOps.hpp
// 多倍長浮動小数点数の3引数演算 (GMP mpf_add/sub/mul/div 相当)
// result のバッファを再利用し、オブジェクト生成オーバーヘッドを回避する。

#ifndef CALX_FLOAT_OPS_HPP
#define CALX_FLOAT_OPS_HPP

#include <math/core/mp/Float.hpp>

namespace calx {

    /**
     * @brief 多倍長浮動小数点数の3引数演算ユーティリティ
     *
     * GMP/MPFR の mpfr_add(r, a, b, rnd) 相当の API を提供。
     * result のバッファを再利用することで、operator+/- 等の値返却に伴う
     * Float 構築・normalize・move のオーバーヘッドを回避する。
     *
     * result は lhs, rhs と同一オブジェクトでも可 (エイリアシング安全)。
     */
    class FloatOps {
    public:
        // 3引数版 add/sub/mul/div: result のバッファを再利用
        static void add(const Float& lhs, const Float& rhs, Float& result);
        static void sub(const Float& lhs, const Float& rhs, Float& result);
        static void mul(const Float& lhs, const Float& rhs, Float& result);
        static void sqr(const Float& x, Float& result);
        static void div(const Float& lhs, const Float& rhs, Float& result);
    };

} // namespace calx

#endif // CALX_FLOAT_OPS_HPP
