/**
 * Author: dkanus
 * Home repo: https://www.insultplayers.ru/git/AcediaFramework/AcediaCore
 * License: GPL
 * Copyright 2020-2023 Anton Tarasenko
 *------------------------------------------------------------------------------
 * This file is part of Acedia.
 *
 * Acedia is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, version 3 of the License, or
 * (at your option) any later version.
 *
 * Acedia is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 */
class MathApi extends AcediaObject;

//! API for basic math methods and [`BigInt`] creation.

/// For storing result of integer division.
///
/// If we divide `number` by `divisor`, then `number = divisor/// quotient + remainder`.
struct IntegerDivisionResult
{
    var int quotient;
    var int remainder;
};

/// Converts given [`int`] value into [`BigInt`] value..
public function BigInt ToBigInt(int value)
{
    local BigInt result;

    result = BigInt(_.memory.Allocate(class'BigInt'));
    result.SetInt(value);
    return result;
}


/// Creates new `BigInt` value, based on the decimal number representation.
///
/// If (and only if) `none` or invalid decimal representation (digits only, possibly with
/// leading sign) is given as an argument, method will return `none`.
public function BigInt MakeBigInt(BaseText value)
{
    local BigInt result;

    result = BigInt(_.memory.Allocate(class'BigInt'));
    if (result.SetDecimal(value)) {
        return result;
    }
    result.FreeSelf();
    return none;
}

/// Creates new `BigInt` value, based on the decimal number representation.
///
/// If (and only if) invalid decimal representation (digits only, possibly with leading sign) is
/// given as an argument, method will return `none`.
public function BigInt MakeBigInt_S(string value)
{
    local BigInt result;

    result = BigInt(_.memory.Allocate(class'BigInt'));
    if (result.SetDecimal_S(value)) {
        return result;
    }
    result.FreeSelf();
    return none;
}

/// Computes remainder of the integer division of [`number`] by [`divisor`].
///
/// This method is necessary as a replacement for `%` module operator, since it is an operation on
/// `float`s in UnrealScript and does not have appropriate value range to work with big integer
// values.
public function int Remainder(int number, int divisor)
{
    local int quotient;

    quotient = number / divisor;
    return (number - quotient * divisor);
}

/// Computes quotient and remainder of the integer division of [`number`] by [`divisor`].
///
/// See `MathApi::Remainder()` method if you only need remainder.
public function IntegerDivisionResult IntegerDivision(int number, int divisor)
{
    local IntegerDivisionResult result;

    result.quotient = number / divisor;
    result.remainder = (number - result.quotient * divisor);
    return result;
}

defaultproperties
{
}