Compare commits
8 Commits
d4a9e67a4a
...
master
Author | SHA1 | Date | |
---|---|---|---|
b1fdbeb3de | |||
07d01523d4 | |||
6cdd077577 | |||
59b1e2eea1 | |||
273a7c1699 | |||
f670beacef | |||
f38f21fe84 | |||
c3f2bb7a23 |
24
Cargo.toml
24
Cargo.toml
@ -1,20 +1,14 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "sigils"
|
name = "sigils"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Jason Travis Smith <Myrddin@CyberMagesLLC.com>"]
|
edition = "2024"
|
||||||
description = "A mathematics library."
|
description = "A mathematics library."
|
||||||
license = ""
|
keywords = ["sigils", "math"]
|
||||||
repository = "https://gitlab.com/CyberMages/Core/sigils.git"
|
repository = "https://workshop.cybermages.tech/CyberMages/sigils"
|
||||||
documentation = ""
|
authors = ["Jason Travis Smith <Myrddin@CyberMages.tech>"]
|
||||||
keywords = ["sigils"]
|
readme = "README.md"
|
||||||
edition = "2018"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
[dependencies.weave]
|
binding = { version = "0.1.0", registry = "cybermages" }
|
||||||
git = "ssh://git@gitlab.com/CyberMages/Core/weave"
|
pact = { version = "0.1.0", registry = "cybermages" }
|
||||||
|
|
||||||
[dependencies.binding]
|
|
||||||
git = "ssh://git@gitlab.com/CyberMages/Core/binding"
|
|
||||||
|
|
||||||
[dependencies.pact]
|
|
||||||
git = "ssh://git@gitlab.com/CyberMages/Core/pact"
|
|
||||||
|
174
LICENSE.md
Normal file
174
LICENSE.md
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
# Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
<http://www.apache.org/licenses/>
|
||||||
|
|
||||||
|
## TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
### 1. Definitions.
|
||||||
|
|
||||||
|
**"License"** shall mean the terms and conditions for use, reproduction,
|
||||||
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
**"Licensor"** shall mean the copyright owner or entity authorized by
|
||||||
|
the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
**"Legal Entity"** shall mean the union of the acting entity and all
|
||||||
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
|
direction or management of such entity, whether by contract or
|
||||||
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
**"You" (or "Your")** shall mean an individual or Legal Entity exercising
|
||||||
|
permissions granted by this License.
|
||||||
|
|
||||||
|
**"Source" form** shall mean the preferred form for making modifications,
|
||||||
|
including but not limited to software source code, documentation source,
|
||||||
|
and configuration files.
|
||||||
|
|
||||||
|
**"Object" form** shall mean any form resulting from mechanical
|
||||||
|
transformation or translation of a Source form, including but not
|
||||||
|
limited to compiled object code, generated documentation, and
|
||||||
|
conversions to other media types.
|
||||||
|
|
||||||
|
**"Work"** shall mean the work of authorship, whether in Source or
|
||||||
|
Object form, made available under the License, as indicated by a
|
||||||
|
copyright notice that is included in or attached to the work
|
||||||
|
(an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
**"Derivative Works"** shall mean any work, whether in Source or Object
|
||||||
|
form, that is based on (or derived from) the Work and for which the
|
||||||
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
|
of this License, Derivative Works shall not include works that remain
|
||||||
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
|
the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
**"Contribution"** shall mean any work of authorship, including the
|
||||||
|
original version of the Work and any modifications or additions to that
|
||||||
|
Work or Derivative Works thereof, that is intentionally submitted to
|
||||||
|
the Licensor for inclusion in the Work by the copyright owner or by an
|
||||||
|
individual or Legal Entity authorized to submit on behalf of the
|
||||||
|
copyright owner.
|
||||||
|
|
||||||
|
**"Contributor"** shall mean Licensor and any individual or Legal Entity
|
||||||
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
|
subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
### 2. Grant of Copyright License.
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor
|
||||||
|
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
|
||||||
|
royalty-free, irrevocable copyright license to reproduce, prepare
|
||||||
|
Derivative Works of, publicly display, publicly perform, sublicense,
|
||||||
|
and distribute the Work and such Derivative Works in Source or Object
|
||||||
|
form.
|
||||||
|
|
||||||
|
### 3. Grant of Patent License.
|
||||||
|
|
||||||
|
Subject to the terms and conditions of this License, each Contributor
|
||||||
|
hereby grants to You a perpetual, worldwide, non-exclusive, no-charge,
|
||||||
|
royalty-free, irrevocable (except as stated in this section) patent
|
||||||
|
license to make, have made, use, offer to sell, sell, import, and
|
||||||
|
otherwise transfer the Work, where such license applies only to those
|
||||||
|
patent claims licensable by such Contributor that are necessarily
|
||||||
|
infringed by their Contribution(s) alone or by combination of their
|
||||||
|
Contribution(s) with the Work to which such Contribution(s) was
|
||||||
|
submitted. If You institute patent litigation against any entity
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||||
|
the Work or a Contribution incorporated within the Work constitutes
|
||||||
|
direct or contributory patent infringement, then any patent licenses
|
||||||
|
granted to You under this License for that Work shall terminate as of
|
||||||
|
the date such litigation is filed.
|
||||||
|
|
||||||
|
### 4. Redistribution.
|
||||||
|
|
||||||
|
You may reproduce and distribute copies of the Work or Derivative Works
|
||||||
|
thereof in any medium, with or without modifications, and in Source or
|
||||||
|
Object form, provided that You meet the following conditions:
|
||||||
|
|
||||||
|
1. You must give any other recipients of the Work or Derivative Works a
|
||||||
|
copy of this License; and
|
||||||
|
|
||||||
|
2. You must cause any modified files to carry prominent notices stating
|
||||||
|
that You changed the files; and
|
||||||
|
|
||||||
|
3. You must retain, in the Source form of any Derivative Works that You
|
||||||
|
distribute, all copyright, patent, trademark, and attribution notices
|
||||||
|
from the Source form of the Work, excluding those notices that do not
|
||||||
|
pertain to any part of the Derivative Works; and
|
||||||
|
|
||||||
|
4. If the Work includes a "NOTICE" text file as part of its distribution,
|
||||||
|
then any Derivative Works that You distribute must include a readable
|
||||||
|
copy of the attribution notices contained within such NOTICE file,
|
||||||
|
excluding those notices that do not pertain to any part of the
|
||||||
|
Derivative Works, in at least one of the following places: within a
|
||||||
|
NOTICE text file distributed as part of the Derivative Works; within
|
||||||
|
the Source form or documentation, if provided along with the Derivative
|
||||||
|
Works; or, within a display generated by the Derivative Works, if and
|
||||||
|
wherever such third-party notices normally appear. The contents of the
|
||||||
|
NOTICE file are for informational purposes only and do not modify the
|
||||||
|
License. You may add Your own attribution notices within Derivative
|
||||||
|
Works that You distribute, alongside or as an addendum to the NOTICE
|
||||||
|
text from the Work, provided that such additional attribution notices
|
||||||
|
cannot be construed as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and may
|
||||||
|
provide additional or different license terms and conditions for use,
|
||||||
|
reproduction, or distribution of Your modifications, or for any such
|
||||||
|
Derivative Works as a whole, provided Your use, reproduction, and
|
||||||
|
distribution of the Work otherwise complies with the conditions stated
|
||||||
|
in this License.
|
||||||
|
|
||||||
|
### 5. Submission of Contributions.
|
||||||
|
|
||||||
|
Unless You explicitly state otherwise, any Contribution intentionally
|
||||||
|
submitted for inclusion in the Work by You to the Licensor shall be
|
||||||
|
under the terms and conditions of this License, without any additional
|
||||||
|
terms or conditions. Notwithstanding the above, nothing herein shall
|
||||||
|
supersede or modify the terms of any separate license agreement you
|
||||||
|
may have executed with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
### 6. Trademarks.
|
||||||
|
|
||||||
|
This License does not grant permission to use the trade names,
|
||||||
|
trademarks, service marks, or product names of the Licensor, except as
|
||||||
|
required for describing the origin of the Work and reproducing the
|
||||||
|
content of the NOTICE file.
|
||||||
|
|
||||||
|
### 7. Disclaimer of Warranty.
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, Licensor
|
||||||
|
provides the Work (and each Contributor provides its Contributions) on
|
||||||
|
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
|
||||||
|
express or implied, including, without limitation, any warranties or
|
||||||
|
conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR
|
||||||
|
A PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
### 8. Limitation of Liability.
|
||||||
|
|
||||||
|
In no event and under no legal theory, whether in tort (including
|
||||||
|
negligence), contract, or otherwise, unless required by applicable law
|
||||||
|
(such as deliberate and grossly negligent acts) or agreed to in writing,
|
||||||
|
shall any Contributor be liable to You for damages, including any direct,
|
||||||
|
indirect, special, incidental, or consequential damages of any character
|
||||||
|
arising as a result of this License or out of the use or inability to use
|
||||||
|
the Work (including but not limited to damages for loss of goodwill, work
|
||||||
|
stoppage, computer failure or malfunction, or any and all other commercial
|
||||||
|
damages or losses), even if such Contributor has been advised of the
|
||||||
|
possibility of such damages.
|
||||||
|
|
||||||
|
### 9. Accepting Warranty or Additional Liability.
|
||||||
|
|
||||||
|
While redistributing the Work or Derivative Works thereof, You may choose
|
||||||
|
to offer, and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
|
or other liability obligations and/or rights consistent with this License.
|
||||||
|
However, in accepting such obligations, You may act only on Your own behalf
|
||||||
|
and on Your sole responsibility, not on behalf of any other Contributor,
|
||||||
|
and only if You agree to indemnify, defend, and hold each Contributor
|
||||||
|
harmless for any liability incurred by, or claims asserted against, such
|
||||||
|
Contributor by reason of your accepting any such warranty or additional
|
||||||
|
liability.
|
88
README.md
88
README.md
@ -1,8 +1,94 @@
|
|||||||
# Sigils #
|
# Sigils #
|
||||||
A mathematics library.
|
**sigils** is a trait-driven Rust math library offering vector, quaternion, and
|
||||||
|
numeric abstractions for simulation, graphics, and systems-level development.
|
||||||
|
|
||||||
|
It focuses on performance, generic correctness, and ergonomic APIs without
|
||||||
|
sacrificing type safety or precision.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
- Generic `Vector` and `Quaternion` trait abstractions
|
||||||
|
- Implementation of common 2D and 3D types (`Vec2`, `Vec3`, `Quat`)
|
||||||
|
- Traits for scalar math operations on floats and integers
|
||||||
|
- Designed for zero-cost abstractions and compiler optimization
|
||||||
|
- Suited for simulation, embedded graphics, and procedural tools
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Motivation
|
||||||
|
|
||||||
|
Simulation, game, and physics systems often need mathematical primitives with
|
||||||
|
predictable behavior, performance, and strong type guarantees.
|
||||||
|
|
||||||
|
**sigils** exists to provide just that, core math abstractions without the
|
||||||
|
complexity or bloat of large game engines or math suites.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Getting Started
|
||||||
|
|
||||||
|
First, add the CyberMages registry to your Cargo config:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[registries.cybermages]
|
||||||
|
index = "sparse+https://workshop.cybermages.tech/api/packages/CyberMages/cargo/"
|
||||||
|
```
|
||||||
|
|
||||||
|
Then add `sigils` to your dependencies:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
sigils = { version = "0.1", registry = "cybermages" }
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example Usage
|
||||||
|
|
||||||
|
```rust
|
||||||
|
TODO: Rotate a Vector with a Quaternion.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation can be generated locally with:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cargo doc --open
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Design Highlights
|
||||||
|
|
||||||
|
- Uses traits to decouple math concepts from specific types
|
||||||
|
- Scalar math via trait constraints allows use of `f32`, `f64`, or custom types
|
||||||
|
- Encourages composability across simulation and rendering domains
|
||||||
|
- Small and dependency-free core, easy to embed or extend
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
The code in this library uses macros pretty heavily. As such,
|
The code in this library uses macros pretty heavily. As such,
|
||||||
please check the trait's documentation for a function since the
|
please check the trait's documentation for a function since the
|
||||||
macro definition will not really be documented. This was not
|
macro definition will not really be documented. This was not
|
||||||
done to make documentation difficult, but to make coding the
|
done to make documentation difficult, but to make coding the
|
||||||
library easier and to make it easier to maintain.
|
library easier and to make it easier to maintain.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Copyright & License
|
||||||
|
|
||||||
|
Copyright 2015 CyberMages LLC
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this library except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use sigils::quaternion::{Quaternion};
|
use sigils::quaternion::{Quaternion};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use sigils::{Constants, Degree, Radian, Trig};
|
use sigils::{Constants, Degree, Radian, Trig};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use sigils::vector::{EuclideanVector, Vector2, Vector3, Vector4};
|
use sigils::vector::{EuclideanVector, Vector2, Vector3, Vector4};
|
||||||
|
|
||||||
|
|
||||||
|
99
src/bounded.rs
Normal file
99
src/bounded.rs
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
/// Primitive types that have upper and lower bounds.
|
||||||
|
pub trait Bounded
|
||||||
|
{
|
||||||
|
/// The minimum value for this type.
|
||||||
|
const MIN: Self;
|
||||||
|
|
||||||
|
/// The maximum value for this type.
|
||||||
|
const MAX: Self;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/// A macro for making implementation of
|
||||||
|
/// the Bounded trait easier.
|
||||||
|
macro_rules! bounded_trait_impl
|
||||||
|
{
|
||||||
|
($T: ty, $minVal: expr, $maxVal: expr) =>
|
||||||
|
{
|
||||||
|
impl Bounded for $T
|
||||||
|
{
|
||||||
|
const MIN: $T = $minVal;
|
||||||
|
|
||||||
|
const MAX: $T = $maxVal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Implement the Bounded for all the primitive types.
|
||||||
|
bounded_trait_impl!(u8, 0u8, !0u8);
|
||||||
|
bounded_trait_impl!(u16, 0u16, !0u16);
|
||||||
|
bounded_trait_impl!(u32, 0u32, !0u32);
|
||||||
|
bounded_trait_impl!(u64, 0u64, !0u64);
|
||||||
|
bounded_trait_impl!(usize, 0usize, !0usize);
|
||||||
|
|
||||||
|
bounded_trait_impl!(i8, (!0i8 ^ (!0u8 >> 1u8) as i8),
|
||||||
|
!(!0i8 ^ (!0u8 >> 1u8) as i8));
|
||||||
|
bounded_trait_impl!(i16, (!0i16 ^ (!0u16 >> 1u16) as i16),
|
||||||
|
!(!0i16 ^ (!0u16 >> 1u16) as i16));
|
||||||
|
bounded_trait_impl!(i32, (!0i32 ^ (!0u32 >> 1u32) as i32),
|
||||||
|
!(!0i32 ^ (!0u32 >> 1u32) as i32));
|
||||||
|
bounded_trait_impl!(i64, (!0i64 ^ (!0u64 >> 1u64) as i64),
|
||||||
|
!(!0i64 ^ (!0u64 >> 1u64) as i64));
|
||||||
|
bounded_trait_impl!(isize, (!0isize ^ (!0usize >> 1usize) as isize),
|
||||||
|
!(!0isize ^ (!0usize >> 1usize) as isize));
|
||||||
|
|
||||||
|
bounded_trait_impl!(f32, -3.40282347e+38f32, 3.40282347e+38f32);
|
||||||
|
bounded_trait_impl!(f64, -1.7976931348623157e+308f64,
|
||||||
|
1.7976931348623157e+308f64);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests
|
||||||
|
{
|
||||||
|
macro_rules! bounds_test
|
||||||
|
{
|
||||||
|
($T: ident, $func_name: ident, $minVal: expr, $maxVal: expr) =>
|
||||||
|
{
|
||||||
|
#[test]
|
||||||
|
fn $func_name()
|
||||||
|
{
|
||||||
|
assert_eq!($T::MIN, $minVal);
|
||||||
|
assert_eq!($T::MAX, $maxVal);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bounds_test!(u8, min_max_u8, 0u8, !0u8);
|
||||||
|
bounds_test!(u16, min_max_u16, 0u16, !0u16);
|
||||||
|
bounds_test!(u32, min_max_u32, 0u32, !0u32);
|
||||||
|
bounds_test!(u64, min_max_u64, 0u64, !0u64);
|
||||||
|
bounds_test!(usize, min_max_usize, 0usize, !0usize);
|
||||||
|
|
||||||
|
bounds_test!(i8, min_max_i8,
|
||||||
|
-1i8 << (((::std::mem::size_of::<i8>() as i8)*8i8)-1i8),
|
||||||
|
!(-1i8 << (((::std::mem::size_of::<i8>() as i8)*8i8)-1i8)));
|
||||||
|
bounds_test!(i16, min_max_i16,
|
||||||
|
-1i16 << (((::std::mem::size_of::<i16>() as i16)*8i16)-1i16),
|
||||||
|
!(-1i16 << (((::std::mem::size_of::<i16>() as i16)*8i16)-1i16)));
|
||||||
|
bounds_test!(i32, min_max_i32,
|
||||||
|
-1i32 << (((::std::mem::size_of::<i32>() as i32)*8i32)-1i32),
|
||||||
|
!(-1i32 << (((::std::mem::size_of::<i32>() as i32)*8i32)-1i32)));
|
||||||
|
bounds_test!(i64, min_max_i64,
|
||||||
|
-1i64 << (((::std::mem::size_of::<i64>() as i64)*8i64)-1i64),
|
||||||
|
!(-1i64 << (((::std::mem::size_of::<i64>() as i64)*8i64)-1i64)));
|
||||||
|
bounds_test!(isize, min_max_isize,
|
||||||
|
-1isize << (((::std::mem::size_of::<isize>() as isize)*8isize)-1isize),
|
||||||
|
!(-1isize << (((::std::mem::size_of::<isize>() as isize)*8isize)-1isize)));
|
||||||
|
|
||||||
|
bounds_test!(f32, min_max_f32,
|
||||||
|
-3.40282347e+38f32, 3.40282347e+38f32);
|
||||||
|
bounds_test!(f64, min_max_f64,
|
||||||
|
-1.7976931348623157e+308f64,
|
||||||
|
1.7976931348623157e+308f64);
|
||||||
|
}
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::{f32, f64};
|
use std::{f32, f64};
|
||||||
|
|
||||||
|
|
||||||
@ -57,6 +60,7 @@ pub trait Constants
|
|||||||
const INVERSE_SQRT_3: Self;
|
const INVERSE_SQRT_3: Self;
|
||||||
|
|
||||||
/// The mathematical constant [E][1]. Also known as [Euler's number][1].
|
/// The mathematical constant [E][1]. Also known as [Euler's number][1].
|
||||||
|
///
|
||||||
/// [1]: https://en.wikipedia.org/wiki/E_(mathematical_constant)
|
/// [1]: https://en.wikipedia.org/wiki/E_(mathematical_constant)
|
||||||
///
|
///
|
||||||
///```
|
///```
|
||||||
@ -130,6 +134,7 @@ pub trait Constants
|
|||||||
const TWO_PI: Self;
|
const TWO_PI: Self;
|
||||||
|
|
||||||
/// [PI][1]. The ratio of a circles circumference to its diameter.
|
/// [PI][1]. The ratio of a circles circumference to its diameter.
|
||||||
|
///
|
||||||
/// [1]: https://en.wikipedia.org/wiki/Pi
|
/// [1]: https://en.wikipedia.org/wiki/Pi
|
||||||
///
|
///
|
||||||
///```
|
///```
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use crate::number::Number;
|
use crate::number::Number;
|
||||||
use crate::one::One;
|
use crate::one::One;
|
||||||
use crate::zero::Zero;
|
use crate::zero::Zero;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
//! A mathematical library.
|
//! A mathematical library.
|
||||||
//! License: Proprietary
|
//! License: Proprietary
|
||||||
//!
|
//!
|
||||||
@ -10,6 +13,8 @@ extern crate core as std;
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
mod macros;
|
mod macros;
|
||||||
|
|
||||||
|
mod bounded;
|
||||||
|
|
||||||
mod zero;
|
mod zero;
|
||||||
mod one;
|
mod one;
|
||||||
mod number;
|
mod number;
|
||||||
@ -26,9 +31,10 @@ pub mod quaternion;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
pub use self::bounded::Bounded;
|
||||||
pub use self::zero::Zero;
|
pub use self::zero::Zero;
|
||||||
pub use self::one::One;
|
pub use self::one::One;
|
||||||
pub use self::number::Number;
|
pub use self::number::{Number, FromNumber};
|
||||||
pub use self::whole::Whole;
|
pub use self::whole::Whole;
|
||||||
pub use self::integer::Integer;
|
pub use self::integer::Integer;
|
||||||
pub use self::real::Real;
|
pub use self::real::Real;
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
/// A macro that will define a binary operation for
|
/// A macro that will define a binary operation for
|
||||||
/// a structure and its components.
|
/// a structure and its components.
|
||||||
macro_rules! binary_operator_impl
|
macro_rules! binary_operator_impl
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
//! This module defines the 2x2, 3x3, and 4x4 Matrix structures.
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
//! This module defines the 2x2, 3x3, and 4x4 Matrix structures.
|
||||||
|
//use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
||||||
|
|
||||||
use crate::zero::Zero;
|
|
||||||
use crate::one::One;
|
|
||||||
use crate::number::Number;
|
use crate::number::Number;
|
||||||
use crate::vector::{Vector, Vector2, Vector3, Vector4};
|
use crate::vector::{Vector, Vector2, Vector3, Vector4};
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::cmp::{PartialEq, PartialOrd};
|
use std::cmp::{PartialEq, PartialOrd};
|
||||||
use std::fmt::{Debug, Display};
|
use std::fmt::{Debug, Display};
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
@ -5,8 +8,7 @@ use std::ops::{Add, Sub, Mul, Div, Rem};
|
|||||||
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
||||||
use std::str::FromStr;
|
use std::str::FromStr;
|
||||||
|
|
||||||
use weave::Bounded;
|
use crate::bounded::Bounded;
|
||||||
|
|
||||||
use crate::zero::Zero;
|
use crate::zero::Zero;
|
||||||
use crate::one::One;
|
use crate::one::One;
|
||||||
|
|
||||||
@ -900,8 +902,6 @@ float_number_trait_impl!(Number for f64, -1.7976931348623157e+308f64,
|
|||||||
1.7976931348623157e+308f64,
|
1.7976931348623157e+308f64,
|
||||||
fmin, fmax);
|
fmin, fmax);
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "8")]
|
|
||||||
int_number_trait_impl!(Number for usize, 0usize, 255usize);
|
|
||||||
#[cfg(target_pointer_width = "16")]
|
#[cfg(target_pointer_width = "16")]
|
||||||
int_number_trait_impl!(Number for usize, 0usize, 65535usize);
|
int_number_trait_impl!(Number for usize, 0usize, 65535usize);
|
||||||
#[cfg(target_pointer_width = "32")]
|
#[cfg(target_pointer_width = "32")]
|
||||||
@ -909,8 +909,6 @@ int_number_trait_impl!(Number for usize, 0usize, 4294967295usize);
|
|||||||
#[cfg(target_pointer_width = "64")]
|
#[cfg(target_pointer_width = "64")]
|
||||||
int_number_trait_impl!(Number for usize, 0usize, 18446744073709551615usize);
|
int_number_trait_impl!(Number for usize, 0usize, 18446744073709551615usize);
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "8")]
|
|
||||||
int_number_trait_impl!(Number for isize, -128isize, 127isize);
|
|
||||||
#[cfg(target_pointer_width = "16")]
|
#[cfg(target_pointer_width = "16")]
|
||||||
int_number_trait_impl!(Number for isize, -32768isize, 32767isize);
|
int_number_trait_impl!(Number for isize, -32768isize, 32767isize);
|
||||||
#[cfg(target_pointer_width = "32")]
|
#[cfg(target_pointer_width = "32")]
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::ops::Mul;
|
use std::ops::Mul;
|
||||||
|
|
||||||
/// Defines a multiplicative identity element for `Self`.
|
/// Defines a multiplicative identity element for `Self`.
|
||||||
@ -7,7 +10,7 @@ pub trait One: Sized + Mul<Self, Output=Self>
|
|||||||
///
|
///
|
||||||
/// # Laws
|
/// # Laws
|
||||||
///
|
///
|
||||||
/// ```{.text}
|
/// ```text
|
||||||
/// a * 1 = a ∀ a ∈ Self
|
/// a * 1 = a ∀ a ∈ Self
|
||||||
/// 1 * a = a ∀ a ∈ Self
|
/// 1 * a = a ∀ a ∈ Self
|
||||||
/// ```
|
/// ```
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
//! This module defines the [Quaternion][1] and
|
//! This module defines the [Quaternion][1] and
|
||||||
//! [DualQuaternion][2] structures.
|
//! [DualQuaternion][2] structures.
|
||||||
//!
|
//!
|
||||||
@ -8,10 +11,8 @@ use std::ops::{Add, Sub, Mul, Div, Neg};
|
|||||||
|
|
||||||
use crate::zero::Zero;
|
use crate::zero::Zero;
|
||||||
use crate::one::One;
|
use crate::one::One;
|
||||||
use crate::real::Real;
|
|
||||||
use crate::trig::Radian;
|
|
||||||
use crate::trig::Trig;
|
use crate::trig::Trig;
|
||||||
use crate::vector::{Vector, EuclideanVector, Vector3};
|
use crate::vector::{EuclideanVector, Vector3};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
|
39
src/real.rs
39
src/real.rs
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::num::FpCategory;
|
use std::num::FpCategory;
|
||||||
use std::ops::Neg;
|
use std::ops::Neg;
|
||||||
|
|
||||||
@ -159,22 +162,18 @@ pub trait Real : Number + Constants + Neg<Output=Self>
|
|||||||
/// use std::{f32, f64};
|
/// use std::{f32, f64};
|
||||||
/// use sigils::Real;
|
/// use sigils::Real;
|
||||||
///
|
///
|
||||||
/// let nan32: f32 = f32::NAN;
|
|
||||||
/// let f_val32 = 7.0f32;
|
/// let f_val32 = 7.0f32;
|
||||||
/// let g_val32 = -7.0f32;
|
/// let g_val32 = -7.0f32;
|
||||||
///
|
///
|
||||||
/// let nan64: f64 = f64::NAN;
|
|
||||||
/// let f_val64 = 7.0f64;
|
/// let f_val64 = 7.0f64;
|
||||||
/// let g_val64 = -7.0f64;
|
/// let g_val64 = -7.0f64;
|
||||||
///
|
///
|
||||||
/// // Requires both tests to determine if is `NaN`
|
/// // Requires both tests to determine if is `NaN`
|
||||||
/// assert!(!f_val32.is_sign_negative());
|
/// assert!(!f_val32.is_sign_negative());
|
||||||
/// assert!(g_val32.is_sign_negative());
|
/// assert!(g_val32.is_sign_negative());
|
||||||
/// assert!(!nan32.is_sign_positive() && !nan32.is_sign_negative());
|
|
||||||
///
|
///
|
||||||
/// assert!(!f_val64.is_sign_negative());
|
/// assert!(!f_val64.is_sign_negative());
|
||||||
/// assert!(g_val64.is_sign_negative());
|
/// assert!(g_val64.is_sign_negative());
|
||||||
/// assert!(!nan64.is_sign_positive() && !nan64.is_sign_negative());
|
|
||||||
/// ```
|
/// ```
|
||||||
fn is_sign_negative(self) -> bool;
|
fn is_sign_negative(self) -> bool;
|
||||||
|
|
||||||
@ -185,22 +184,18 @@ pub trait Real : Number + Constants + Neg<Output=Self>
|
|||||||
/// use std::{f32, f64};
|
/// use std::{f32, f64};
|
||||||
/// use sigils::Real;
|
/// use sigils::Real;
|
||||||
///
|
///
|
||||||
/// let nan32: f32 = f32::NAN;
|
|
||||||
/// let f_val32 = 7.0f32;
|
/// let f_val32 = 7.0f32;
|
||||||
/// let g_val32 = -7.0f32;
|
/// let g_val32 = -7.0f32;
|
||||||
///
|
///
|
||||||
/// let nan64: f64 = f64::NAN;
|
|
||||||
/// let f_val64 = 7.0f64;
|
/// let f_val64 = 7.0f64;
|
||||||
/// let g_val64 = -7.0f64;
|
/// let g_val64 = -7.0f64;
|
||||||
///
|
///
|
||||||
/// // Requires both tests to determine if is `NaN`
|
/// // Requires both tests to determine if is `NaN`
|
||||||
/// assert!(f_val32.is_sign_positive());
|
/// assert!(f_val32.is_sign_positive());
|
||||||
/// assert!(!g_val32.is_sign_positive());
|
/// assert!(!g_val32.is_sign_positive());
|
||||||
/// assert!(!nan32.is_sign_positive() && !nan32.is_sign_negative());
|
|
||||||
///
|
///
|
||||||
/// assert!(f_val64.is_sign_positive());
|
/// assert!(f_val64.is_sign_positive());
|
||||||
/// assert!(!g_val64.is_sign_positive());
|
/// assert!(!g_val64.is_sign_positive());
|
||||||
/// assert!(!nan64.is_sign_positive() && !nan64.is_sign_negative());
|
|
||||||
/// ```
|
/// ```
|
||||||
fn is_sign_positive(self) -> bool;
|
fn is_sign_positive(self) -> bool;
|
||||||
|
|
||||||
@ -228,8 +223,6 @@ pub trait Real : Number + Constants + Neg<Output=Self>
|
|||||||
/// ```
|
/// ```
|
||||||
fn get_signum(self) -> Self;
|
fn get_signum(self) -> Self;
|
||||||
|
|
||||||
/* TODO: Reimplement this when the error for 'use core::num::Float;'
|
|
||||||
goes away.
|
|
||||||
/// Returns the floating point category of the number.
|
/// Returns the floating point category of the number.
|
||||||
/// If only one property is going to be tested, it is
|
/// If only one property is going to be tested, it is
|
||||||
/// generally faster to use the specific predicate instead.
|
/// generally faster to use the specific predicate instead.
|
||||||
@ -252,9 +245,7 @@ pub trait Real : Number + Constants + Neg<Output=Self>
|
|||||||
/// assert_eq!(inf64.get_category(), FpCategory::Infinite);
|
/// assert_eq!(inf64.get_category(), FpCategory::Infinite);
|
||||||
/// ```
|
/// ```
|
||||||
fn get_category(self) -> FpCategory;
|
fn get_category(self) -> FpCategory;
|
||||||
*/
|
|
||||||
|
|
||||||
// TODO: Fix/check this example.
|
|
||||||
/// Returns the mantissa, base 2 exponent, and sign as
|
/// Returns the mantissa, base 2 exponent, and sign as
|
||||||
/// integers, respectively. The original number can be
|
/// integers, respectively. The original number can be
|
||||||
/// recovered by `sign * mantissa * 2 ^ exponent`.
|
/// recovered by `sign * mantissa * 2 ^ exponent`.
|
||||||
@ -265,7 +256,7 @@ pub trait Real : Number + Constants + Neg<Output=Self>
|
|||||||
/// let num = 2.0f32;
|
/// let num = 2.0f32;
|
||||||
///
|
///
|
||||||
/// // (8388608, -22, 1)
|
/// // (8388608, -22, 1)
|
||||||
/// let (mantissa, exponent, sign) = Real::integer_decode(num);
|
/// let (mantissa, exponent, sign) = Real::get_integer_decode(num);
|
||||||
/// let sign_f = sign as f32;
|
/// let sign_f = sign as f32;
|
||||||
/// let mantissa_f = mantissa as f32;
|
/// let mantissa_f = mantissa as f32;
|
||||||
/// let exponent_f = num.powf(exponent as f32);
|
/// let exponent_f = num.powf(exponent as f32);
|
||||||
@ -646,18 +637,18 @@ impl Real for f32
|
|||||||
const NEG_INFINITY: Self = -1.0f32 / 0.0f32;
|
const NEG_INFINITY: Self = -1.0f32 / 0.0f32;
|
||||||
|
|
||||||
///
|
///
|
||||||
const NAN: Self = 0.0f32 / 0.0f32;
|
const NAN: Self = f32::NAN;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn is_nan(self) -> bool
|
fn is_nan(self) -> bool
|
||||||
{
|
{
|
||||||
self == Self::NAN
|
self.is_nan()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_finite(self) -> bool
|
fn is_finite(self) -> bool
|
||||||
{
|
{
|
||||||
!self.is_infinite() && self != Self::NAN
|
!self.is_infinite() && !self.is_nan()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_infinite(self) -> bool
|
fn is_infinite(self) -> bool
|
||||||
@ -701,13 +692,10 @@ impl Real for f32
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Reimplement this when the error for 'use core::num::Float;'
|
|
||||||
goes away.
|
|
||||||
fn get_category(self) -> FpCategory
|
fn get_category(self) -> FpCategory
|
||||||
{
|
{
|
||||||
self.classify()
|
self.classify()
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
fn get_integer_decode(self) -> (u64, i16, i8)
|
fn get_integer_decode(self) -> (u64, i16, i8)
|
||||||
{
|
{
|
||||||
@ -716,7 +704,7 @@ impl Real for f32
|
|||||||
let mantissa: u32;
|
let mantissa: u32;
|
||||||
let mut exponent: i16;
|
let mut exponent: i16;
|
||||||
|
|
||||||
bits = unsafe { ::std::mem::transmute(self) };
|
bits = self.to_bits();
|
||||||
if bits >> 31 == 0
|
if bits >> 31 == 0
|
||||||
{
|
{
|
||||||
sign = 1;
|
sign = 1;
|
||||||
@ -908,18 +896,18 @@ impl Real for f64
|
|||||||
const NEG_INFINITY: Self = -1.0f64 / 0.0f64;
|
const NEG_INFINITY: Self = -1.0f64 / 0.0f64;
|
||||||
|
|
||||||
///
|
///
|
||||||
const NAN: Self = 0.0f64 / 0.0f64;
|
const NAN: Self = f64::NAN;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
fn is_nan(self) -> bool
|
fn is_nan(self) -> bool
|
||||||
{
|
{
|
||||||
self == Self::NAN
|
self.is_nan()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_finite(self) -> bool
|
fn is_finite(self) -> bool
|
||||||
{
|
{
|
||||||
!self.is_infinite() && self != Self::NAN
|
!self.is_infinite() && !self.is_nan()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn is_infinite(self) -> bool
|
fn is_infinite(self) -> bool
|
||||||
@ -963,13 +951,10 @@ impl Real for f64
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: Reimplement this when the error for 'use core::num::Float;'
|
|
||||||
goes away.
|
|
||||||
fn get_category(self) -> FpCategory
|
fn get_category(self) -> FpCategory
|
||||||
{
|
{
|
||||||
self.classify()
|
self.classify()
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
|
|
||||||
fn get_integer_decode(self) -> (u64, i16, i8)
|
fn get_integer_decode(self) -> (u64, i16, i8)
|
||||||
{
|
{
|
||||||
@ -978,7 +963,7 @@ impl Real for f64
|
|||||||
let mantissa: u64;
|
let mantissa: u64;
|
||||||
let mut exponent: i16;
|
let mut exponent: i16;
|
||||||
|
|
||||||
bits = unsafe { ::std::mem::transmute(self) };
|
bits = self.to_bits();
|
||||||
if bits >> 63 == 0
|
if bits >> 63 == 0
|
||||||
{
|
{
|
||||||
sign = 1;
|
sign = 1;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
//! This section of the library handles the branch of mathematics
|
//! This section of the library handles the branch of mathematics
|
||||||
//! that studies relationships involving lengths and angles of triangles.
|
//! that studies relationships involving lengths and angles of triangles.
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
||||||
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
||||||
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use binding::{CDouble, CFloat};
|
use binding::{CDouble, CFloat};
|
||||||
|
|
||||||
use crate::real::Real;
|
use crate::real::Real;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
//! This module defines 2, 3, and 4 component [Vector][1] structures.
|
//! This module defines 2, 3, and 4 component [Vector][1] structures.
|
||||||
//!
|
//!
|
||||||
//! [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics)
|
//! [1]: https://en.wikipedia.org/wiki/Vector_(mathematics_and_physics)
|
||||||
@ -5,12 +8,9 @@ use std::fmt::{Error, Formatter, Debug, Display};
|
|||||||
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
use std::ops::{Add, Sub, Mul, Div, Rem, Neg};
|
||||||
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
||||||
|
|
||||||
use weave::attempt;
|
|
||||||
|
|
||||||
use crate::zero::Zero;
|
use crate::zero::Zero;
|
||||||
use crate::one::One;
|
use crate::one::One;
|
||||||
use crate::number::Number;
|
use crate::number::Number;
|
||||||
use crate::real::Real;
|
|
||||||
use crate::trig::Radian;
|
use crate::trig::Radian;
|
||||||
use crate::trig::Trig;
|
use crate::trig::Trig;
|
||||||
|
|
||||||
@ -550,12 +550,12 @@ macro_rules! define_vector
|
|||||||
// pretty up the printing.
|
// pretty up the printing.
|
||||||
count = self.get_size();
|
count = self.get_size();
|
||||||
|
|
||||||
attempt!(write!(formatter, "<"));
|
write!(formatter, "<")?;
|
||||||
$(
|
$(
|
||||||
attempt!(write!(formatter, "{:?}", self.$field));
|
write!(formatter, "{:?}", self.$field)?;
|
||||||
if count > 0
|
if count > 0
|
||||||
{
|
{
|
||||||
attempt!(write!(formatter, ", "));
|
write!(formatter, ", ")?;
|
||||||
}
|
}
|
||||||
count -= 1;
|
count -= 1;
|
||||||
)*
|
)*
|
||||||
@ -575,12 +575,12 @@ macro_rules! define_vector
|
|||||||
// pretty up the printing.
|
// pretty up the printing.
|
||||||
count = self.get_size();
|
count = self.get_size();
|
||||||
|
|
||||||
attempt!(write!(formatter, "<"));
|
write!(formatter, "<")?;
|
||||||
$(
|
$(
|
||||||
attempt!(write!(formatter, "{}", self.$field));
|
write!(formatter, "{}", self.$field)?;
|
||||||
if count > 1
|
if count > 1
|
||||||
{
|
{
|
||||||
attempt!(write!(formatter, ", "));
|
write!(formatter, ", ")?;
|
||||||
}
|
}
|
||||||
count -= 1;
|
count -= 1;
|
||||||
)*
|
)*
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use super::number::Number;
|
use super::number::Number;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::ops::Add;
|
use std::ops::Add;
|
||||||
|
|
||||||
/// Defines an additive identity element for `Self`.
|
/// Defines an additive identity element for `Self`.
|
||||||
@ -7,7 +10,7 @@ pub trait Zero: Sized + Add<Self, Output=Self>
|
|||||||
///
|
///
|
||||||
/// # Laws
|
/// # Laws
|
||||||
///
|
///
|
||||||
/// ```{.text}
|
/// ```text
|
||||||
/// a + 0 = a ∀ a ∈ Self
|
/// a + 0 = a ∀ a ∈ Self
|
||||||
/// 0 + a = a ∀ a ∈ Self
|
/// 0 + a = a ∀ a ∈ Self
|
||||||
/// ```
|
/// ```
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::{f32, f64};
|
use std::{f32, f64};
|
||||||
use sigils::Constants;
|
use sigils::Constants;
|
||||||
|
|
||||||
|
@ -1,2 +1,5 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
mod constants;
|
mod constants;
|
||||||
mod vector;
|
mod vector;
|
||||||
|
@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-License-Identifier: Apache-2.0
|
||||||
|
// Sealed with Magistamp.
|
||||||
|
|
||||||
use std::ops::{Add, Sub, Mul, Div, Rem};
|
use std::ops::{Add, Sub, Mul, Div, Rem};
|
||||||
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
use std::ops::{AddAssign, SubAssign, MulAssign, DivAssign, RemAssign};
|
||||||
use sigils::vector::*;
|
use sigils::vector::*;
|
||||||
|
Reference in New Issue
Block a user