mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
Make aliases able to use @deprecated. Prefer math::I and math::I_F for math::IMAGINARY and math::IMAGINARYF the latter is deprecated. Combination of += and [] overloads now properly handled in most cases.
This commit is contained in:
@@ -56,22 +56,6 @@ const DOUBLE_MAX_EXP = 1024;
|
||||
const DOUBLE_MIN_EXP = -1021;
|
||||
const DOUBLE_EPSILON = 2.22044604925031308085e-16;
|
||||
|
||||
const QUAD_MANT_DIG = 113;
|
||||
|
||||
/*
|
||||
Currently unsupported float128 constants
|
||||
const QUAD_MAX = 1.18973149535723176508575932662800702e+4932;
|
||||
const QUAD_MIN = 3.36210314311209350626267781732175260e-4932;
|
||||
const QUAD_DENORM_MIN = 6.47517511943802511092443895822764655e-4966;
|
||||
const QUAD_DIG = 33;
|
||||
const QUAD_DEC_DIGITS = 36;
|
||||
const QUAD_MAX_10_EXP = 4932;
|
||||
const QUAD_MIN_10_EXP = -4931;
|
||||
const QUAD_MAX_EXP = 16384;
|
||||
const QUAD_MIN_EXP = -16481;
|
||||
const QUAD_EPSILON = 1.92592994438723585305597794258492732e-34;
|
||||
*/
|
||||
|
||||
enum RoundingMode : int
|
||||
{
|
||||
TOWARD_ZERO,
|
||||
@@ -82,35 +66,6 @@ enum RoundingMode : int
|
||||
|
||||
faultdef OVERFLOW, MATRIX_INVERSE_DOESNT_EXIST;
|
||||
|
||||
alias Complexf = Complex {float};
|
||||
alias Complex = Complex {double};
|
||||
alias COMPLEX_IDENTITY @builtin = complex::IDENTITY {double};
|
||||
alias COMPLEXF_IDENTITY @builtin = complex::IDENTITY {float};
|
||||
|
||||
alias Quaternionf = Quaternion {float};
|
||||
alias Quaternion = Quaternion {double};
|
||||
alias QUATERNION_IDENTITY @builtin = quaternion::IDENTITY {double};
|
||||
alias QUATERNIONF_IDENTITY @builtin = quaternion::IDENTITY {float};
|
||||
|
||||
alias Matrix2f = Matrix2x2 {float};
|
||||
alias Matrix2 = Matrix2x2 {double};
|
||||
alias Matrix3f = Matrix3x3 {float};
|
||||
alias Matrix3 = Matrix3x3 {double};
|
||||
alias Matrix4f = Matrix4x4 {float};
|
||||
alias Matrix4 = Matrix4x4 {double};
|
||||
alias matrix4_ortho @builtin = matrix::ortho {double};
|
||||
alias matrix4f_ortho @builtin = matrix::ortho {float};
|
||||
alias matrix4_perspective @builtin = matrix::perspective {double};
|
||||
alias matrix4f_perspective @builtin = matrix::perspective {float};
|
||||
|
||||
alias MATRIX2_IDENTITY @builtin = matrix::IDENTITY2 {double};
|
||||
alias MATRIX2F_IDENTITY @builtin = matrix::IDENTITY2 {float};
|
||||
alias MATRIX3_IDENTITY @builtin = matrix::IDENTITY3 {double};
|
||||
alias MATRIX3F_IDENTITY @builtin = matrix::IDENTITY3 {float};
|
||||
alias MATRIX4_IDENTITY @builtin = matrix::IDENTITY4 {double};
|
||||
alias MATRIX4F_IDENTITY @builtin = matrix::IDENTITY4 {float};
|
||||
|
||||
|
||||
<*
|
||||
@require types::is_numerical($typeof(x)) : `The input must be a numerical value or numerical vector`
|
||||
*>
|
||||
|
||||
@@ -1,4 +1,22 @@
|
||||
module std::math::complex{Real};
|
||||
module std::math;
|
||||
|
||||
// Complex number aliases.
|
||||
|
||||
alias Complexf = Complex {float};
|
||||
alias Complex = Complex {double};
|
||||
alias COMPLEX_IDENTITY @builtin = complex::IDENTITY {double};
|
||||
alias COMPLEXF_IDENTITY @builtin = complex::IDENTITY {float};
|
||||
alias IMAGINARY @builtin @deprecated("Use I") = complex::IMAGINARY { double };
|
||||
alias IMAGINARYF @builtin @deprecated("Use I_F") = complex::IMAGINARY { float };
|
||||
alias I @builtin = complex::IMAGINARY { double };
|
||||
alias I_F @builtin = complex::IMAGINARY { float };
|
||||
|
||||
<*
|
||||
The generic complex number module, for float or double based complex number definitions.
|
||||
|
||||
@require Real.kindof == FLOAT : "A complex number must use a floating type"
|
||||
*>
|
||||
module std::math::complex {Real};
|
||||
import std::io;
|
||||
|
||||
union Complex (Printable)
|
||||
@@ -13,7 +31,6 @@ union Complex (Printable)
|
||||
const Complex IDENTITY = { 1, 0 };
|
||||
const Complex IMAGINARY = { 0, 1 };
|
||||
|
||||
|
||||
macro Complex Complex.add(self, Complex b) @operator(+) => { .v = self.v + b.v };
|
||||
macro Complex Complex.add_real(self, Real r) @operator_s(+) => { .v = self.v + (Real[<2>]) { r, 0 } };
|
||||
macro Complex Complex.add_each(self, Real b) => { .v = self.v + b };
|
||||
@@ -38,6 +55,7 @@ macro Complex Complex.inverse(self)
|
||||
macro Complex Complex.conjugate(self) => { .r = self.r, .c = -self.c };
|
||||
macro Complex Complex.negate(self) @operator(-) => { .v = -self.v };
|
||||
macro bool Complex.equals(self, Complex b) @operator(==) => self.v == b.v;
|
||||
macro bool Complex.equals_real(self, Real r) @operator_s(==) => self.v == { r, 0 };
|
||||
macro bool Complex.not_equals(self, Complex b) @operator(!=) => self.v != b.v;
|
||||
|
||||
fn usz? Complex.to_format(&self, Formatter* f) @dynamic
|
||||
|
||||
@@ -1,47 +0,0 @@
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_atan.c
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
/* atan(x)
|
||||
* Method
|
||||
* 1. Reduce x to positive by atan(x) = -atan(-x).
|
||||
* 2. According to the integer k=4t+0.25 chopped, t=x, the argument
|
||||
* is further reduced to one of the following intervals and the
|
||||
* arctangent of t is evaluated by the corresponding formula:
|
||||
*
|
||||
* [0,7/16] atan(x) = t-t^3*(a1+t^2*(a2+...(a10+t^2*a11)...)
|
||||
* [7/16,11/16] atan(x) = atan(1/2) + atan( (t-0.5)/(1+t/2) )
|
||||
* [11/16.19/16] atan(x) = atan( 1 ) + atan( (t-1)/(1+t) )
|
||||
* [19/16,39/16] atan(x) = atan(3/2) + atan( (t-1.5)/(1+1.5t) )
|
||||
* [39/16,INF] atan(x) = atan(INF) + atan( -1/t )
|
||||
*
|
||||
* Constants:
|
||||
* The hexadecimal values are the intended ones for the following
|
||||
* constants. The decimal values may be used, provided that the
|
||||
* compiler will convert from decimal to binary accurately enough
|
||||
* to produce the hexadecimal values shown.
|
||||
*/
|
||||
/* origin: FreeBSD /usr/src/lib/msun/src/s_atanf.c */
|
||||
/*
|
||||
* Conversion to float by Ian Lance Taylor, Cygnus Support, ian@cygnus.com.
|
||||
*/
|
||||
/*
|
||||
* ====================================================
|
||||
* Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved.
|
||||
*
|
||||
* Developed at SunPro, a Sun Microsystems, Inc. business.
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software is freely granted, provided that this notice
|
||||
* is preserved.
|
||||
* ====================================================
|
||||
*/
|
||||
module std::math;
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,32 @@
|
||||
module std::math::matrix{Real};
|
||||
module std::math;
|
||||
|
||||
// Predefined matrix types
|
||||
alias Matrix2f = Matrix2x2 {float};
|
||||
alias Matrix2 = Matrix2x2 {double};
|
||||
alias Matrix3f = Matrix3x3 {float};
|
||||
alias Matrix3 = Matrix3x3 {double};
|
||||
alias Matrix4f = Matrix4x4 {float};
|
||||
alias Matrix4 = Matrix4x4 {double};
|
||||
|
||||
// Predefined matrix functions
|
||||
alias matrix4_ortho @builtin = matrix::ortho {double};
|
||||
alias matrix4f_ortho @builtin = matrix::ortho {float};
|
||||
alias matrix4_perspective @builtin = matrix::perspective {double};
|
||||
alias matrix4f_perspective @builtin = matrix::perspective {float};
|
||||
|
||||
alias MATRIX2_IDENTITY @builtin = matrix::IDENTITY2 {double};
|
||||
alias MATRIX2F_IDENTITY @builtin = matrix::IDENTITY2 {float};
|
||||
alias MATRIX3_IDENTITY @builtin = matrix::IDENTITY3 {double};
|
||||
alias MATRIX3F_IDENTITY @builtin = matrix::IDENTITY3 {float};
|
||||
alias MATRIX4_IDENTITY @builtin = matrix::IDENTITY4 {double};
|
||||
alias MATRIX4F_IDENTITY @builtin = matrix::IDENTITY4 {float};
|
||||
|
||||
<*
|
||||
The generic matrix module, for float or double based matrix definitions.
|
||||
|
||||
@require Real.kindof == FLOAT : "A matrix must use a floating type"
|
||||
*>
|
||||
module std::math::matrix {Real};
|
||||
import std::math::vector;
|
||||
|
||||
struct Matrix2x2
|
||||
|
||||
@@ -1,4 +1,19 @@
|
||||
module std::math::quaternion{Real};
|
||||
module std::math;
|
||||
|
||||
// Predefined quaternion aliases.
|
||||
|
||||
alias Quaternionf = Quaternion {float};
|
||||
alias Quaternion = Quaternion {double};
|
||||
alias QUATERNION_IDENTITY @builtin = quaternion::IDENTITY {double};
|
||||
alias QUATERNIONF_IDENTITY @builtin = quaternion::IDENTITY {float};
|
||||
|
||||
<*
|
||||
The generic quaternion module, for float or double based quaternion definitions.
|
||||
|
||||
@require Real.kindof == FLOAT : "A quaternion must use a floating type"
|
||||
*>
|
||||
|
||||
module std::math::quaternion {Real};
|
||||
import std::math::vector;
|
||||
union Quaternion
|
||||
{
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
// Vector supplemental methods
|
||||
|
||||
module std::math::vector;
|
||||
import std::math;
|
||||
|
||||
@@ -51,6 +53,8 @@ fn double[<3>] double[<3>].unproject(self, Matrix4 projection, Matrix4 view) =>
|
||||
fn void ortho_normalize(float[<3>]* v1, float[<3>]* v2) => ortho_normalize3(v1, v2);
|
||||
fn void ortho_normalized(double[<3>]* v1, double[<3>]* v2) => ortho_normalize3(v1, v2);
|
||||
|
||||
// -- private helpers
|
||||
|
||||
macro towards(v, target, max_distance) @private
|
||||
{
|
||||
var delta = target - v;
|
||||
Reference in New Issue
Block a user