pub struct VecX<T, const N: usize>{
pub data: [T; N],
}
Expand description
A structure representing a fixed-length array of arbitrary elements and arbitrary length. Since it was created primarily to represent mathematical vectors and colors, it supports four arithmetic operations.
任意の要素、任意の長さの固定長配列を表す構造体です。 主に数学的なベクトルや色を表すために作成したため、四則演算をサポートしています。
use vec_x::{VecX};
let vec1 = VecX::new([1, 2, 3]);
let vec2 = VecX::new([4, 5, 6]);
// Add
assert_eq!(vec1 + vec2, VecX::new([5, 7, 9]));
// Sub
assert_eq!(vec1 - vec2, VecX::new([-3, -3, -3]));
// Mul
assert_eq!(vec1 * vec2, VecX::new([4, 10, 18]));
// Div
assert_eq!(vec1 / vec2, VecX::new([0, 0, 0]));
// Rem
assert_eq!(vec1 % vec2, VecX::new([1, 2, 3]));
// AddAssign
let mut vec = VecX::new([1, 2, 3]);
vec += VecX::new([4, 5, 6]);
assert_eq!(vec, VecX::new([5, 7, 9]));
// SubAssign
let mut vec = VecX::new([1, 2, 3]);
vec -= VecX::new([4, 5, 6]);
assert_eq!(vec, VecX::new([-3, -3, -3]));
// MulAssign
let mut vec = VecX::new([1, 2, 3]);
vec *= VecX::new([4, 5, 6]);
assert_eq!(vec, VecX::new([4, 10, 18]));
// DivAssign
let mut vec = VecX::new([1, 2, 3]);
vec /= VecX::new([4, 5, 6]);
assert_eq!(vec, VecX::new([0, 0, 0]));
// RemAssign
let mut vec = VecX::new([1, 2, 3]);
vec %= VecX::new([4, 5, 6]);
assert_eq!(vec, VecX::new([1, 2, 3]));
You can also perform arithmetic operations with numeric values.
数値型の値との演算も可能です。
use vec_x::{VecX};
let vec = VecX::new([1, 2, 3]);
// Add
assert_eq!(vec + 1, VecX::new([2, 3, 4]));
// Sub
assert_eq!(vec - 1, VecX::new([0, 1, 2]));
// Mul
assert_eq!(vec * 2, VecX::new([2, 4, 6]));
// Div
assert_eq!(vec / 2, VecX::new([0, 1, 1]));
// Rem
assert_eq!(vec % 2, VecX::new([1, 0, 1]));
// AddAssign
let mut vec = VecX::new([1, 2, 3]);
vec += 1;
assert_eq!(vec, VecX::new([2, 3, 4]));
// SubAssign
let mut vec = VecX::new([1, 2, 3]);
vec -= 1;
assert_eq!(vec, VecX::new([0, 1, 2]));
// MulAssign
let mut vec = VecX::new([1, 2, 3]);
vec *= 2;
assert_eq!(vec, VecX::new([2, 4, 6]));
// DivAssign
let mut vec = VecX::new([1, 2, 3]);
vec /= 2;
assert_eq!(vec, VecX::new([0, 1, 1]));
// RemAssign
let mut vec = VecX::new([1, 2, 3]);
vec %= 2;
assert_eq!(vec, VecX::new([1, 0, 1]));
In operations, arrays that implement From/Into traits are implicitly converted to the left-hand side type.
演算において、From/Intoトレイトが実装されている配列同士は暗黙的に左辺の型に変換されます。
use vec_x::{VecX};
use std::ops::Add;
let vec1:VecX<f32,3> = VecX::new([1., 2., 3.]);
let vec2:VecX<u8,3> = VecX::new([4, 5, 6]);
let vec3 = vec1 + vec2;
Arrays that do not implement From/Into trait will fail to compile together. Thus, there is no loss of precision due to implicit type conversion.
From/Intoトレイトが実装されていない配列同士はコンパイルエラーになります。 よって、暗黙的な型変換によって精度が失われることはありません。
use vec_x::{VecX};
use std::ops::Add;
let vec1:VecX<f32,3> = VecX::new([1., 2., 3.]);
let vec2:VecX<u8,3> = VecX::new([4, 5, 6]);
let vec3 = vec2 + vec1; // compile error! Cannot add `VecX<f32, 3>` to `VecX<u8, 3>`[E0369]
Element casts are also supported.
要素のキャストにも対応しています。
use vec_x::{VecX};
let vec = VecX::new([1, 2, 3]);
let vec_f64:VecX<f64,3> = vec.as_();
Non-numeric elements can also be array elements.
数値以外を配列要素にすることもできます。
use vec_x::{VecX};
let vec1 = VecX::new(["a", "b", "c"]);
use vec_x::{VecX};
let vec1 = VecX::new(["a", "b", "c"]);
let vec2 = VecX::new(["d", "e", "f"]);
vec1 + vec2; // compile error!
Using type aliases, as shown below, improves code readability.
以下のように型エイリアスを使用することで、コードの可読性が向上します。
use vec_x::{VecX};
type XYZ = VecX<f64, 3>;
type RGBA = VecX<u8, 4>;
struct Point {
position: XYZ,
color: RGBA,
}
let point = Point {
position: XYZ::new([1.0, 2.0, 3.0]),
color: RGBA::new([255, 0, 0, 255]),
};
Fields§
§data: [T; N]
Implementations§
Source§impl<T, const N: usize> VecX<T, N>
impl<T, const N: usize> VecX<T, N>
Sourcepub fn into<U>(self) -> VecX<U, N>
pub fn into<U>(self) -> VecX<U, N>
Convert VecX<T, N>
to VecX<U, N>
.
VecX<T, N>
をVecX<U, N>
に変換する。
§Examples
use vec_x::{VecX};
let vec:VecX<u8,3> = VecX::new([1, 2, 3]);
let vec_f64:VecX<f64,3> = vec.into();
Sourcepub fn as_<U>(&self) -> VecX<U, N>
pub fn as_<U>(&self) -> VecX<U, N>
Cast VecX<T, N>
to VecX<U, N>
.
Array elements are cast in the same way as numeric types.
VecX<T, N>
をVecX<U, N>
にキャストする。
配列の要素は数値型と同じ方法でキャストされる。
§Examples
use vec_x::{VecX};
let vec = VecX::new([1, 2, 3]);
let vec_f64:VecX<f64,3> = vec.as_();
Sourcepub fn fit<const M: usize>(&self) -> VecX<T, M>
pub fn fit<const M: usize>(&self) -> VecX<T, M>
Match the number of elements in VecX<T, N>
to M.
If M > T
, empty elements are filled with the value of T::default()
.
VecX<T, N>
の要素数をMに合わせる。
M > T
である場合、空の要素はT::default()
の値で満たされる。
§Examples
use vec_x::{VecX};
let vec = VecX::new([1, 2, 3]);
assert_eq!(vec.fit::<2>(), VecX::new([1, 2]));
let vec = VecX::new([1, 2, 3]);
assert_eq!(vec.fit::<5>(), VecX::new([1, 2, 3, 0, 0]));
Sourcepub fn batch<U, F>(self, callback: F) -> VecX<U, N>
pub fn batch<U, F>(self, callback: F) -> VecX<U, N>
Apply a function to each element of VecX<T, N>
.
VecX<T, N>
の各要素に関数を適用する。
§Examples
use vec_x::{VecX};
let do_something = |v:u32| v.abs_diff(1);
let vec = VecX::new([1, 2, 3]);
assert_eq!(vec.batch(do_something), VecX::new([0, 1, 2]));
Sourcepub fn batch_with<U, V, F>(self, other: VecX<U, N>, callback: F) -> VecX<V, N>
pub fn batch_with<U, V, F>(self, other: VecX<U, N>, callback: F) -> VecX<V, N>
Apply a function to each element of VecX<T, N>
and VecX<U, N>
.
VecX<T, N>
とVecX<U, N>
の各要素に関数を適用する。
§Examples
use vec_x::{VecX};
let vec1 = VecX::new([1, 5, 3]);
let vec2 = VecX::new([4, 2, 6]);
assert_eq!(vec1.batch_with(vec2, |a, b| a.min(b)), VecX::new([1, 2, 3]));
Trait Implementations§
Source§impl<T, U, const N: usize> AddAssign<U> for VecX<T, N>
impl<T, U, const N: usize> AddAssign<U> for VecX<T, N>
Source§fn add_assign(&mut self, rhs: U)
fn add_assign(&mut self, rhs: U)
+=
operation. Read moreSource§impl<T, U, const N: usize> AddAssign<VecX<U, N>> for VecX<T, N>
impl<T, U, const N: usize> AddAssign<VecX<U, N>> for VecX<T, N>
Source§fn add_assign(&mut self, rhs: VecX<U, N>)
fn add_assign(&mut self, rhs: VecX<U, N>)
+=
operation. Read moreSource§impl<T, U, const N: usize> DivAssign<U> for VecX<T, N>
impl<T, U, const N: usize> DivAssign<U> for VecX<T, N>
Source§fn div_assign(&mut self, rhs: U)
fn div_assign(&mut self, rhs: U)
/=
operation. Read moreSource§impl<T, U, const N: usize> DivAssign<VecX<U, N>> for VecX<T, N>
impl<T, U, const N: usize> DivAssign<VecX<U, N>> for VecX<T, N>
Source§fn div_assign(&mut self, rhs: VecX<U, N>)
fn div_assign(&mut self, rhs: VecX<U, N>)
/=
operation. Read moreSource§impl<T, const N: usize> From<[T; N]> for VecX<T, N>
Convert VecX<T, N>
from VecX<U, N>
.
impl<T, const N: usize> From<[T; N]> for VecX<T, N>
Convert VecX<T, N>
from VecX<U, N>
.
VecX<U, N>
からVecX<T, N>
に変換する。
§Examples
use vec_x::{VecX};
let vec = VecX::new([1, 2, 3]);
let vec_i32:VecX<i32,3> = VecX::from(vec);
Source§impl<T, const N: usize> From<T> for VecX<T, N>
§Examples
use vec_x::{VecX};
let vec:VecX<u32,3> = VecX::from(1);
assert_eq!(vec, VecX::new([1, 1, 1]));
impl<T, const N: usize> From<T> for VecX<T, N>
§Examples
use vec_x::{VecX};
let vec:VecX<u32,3> = VecX::from(1);
assert_eq!(vec, VecX::new([1, 1, 1]));
Source§impl<T, U, const N: usize> MulAssign<U> for VecX<T, N>
impl<T, U, const N: usize> MulAssign<U> for VecX<T, N>
Source§fn mul_assign(&mut self, rhs: U)
fn mul_assign(&mut self, rhs: U)
*=
operation. Read moreSource§impl<T, U, const N: usize> MulAssign<VecX<U, N>> for VecX<T, N>
impl<T, U, const N: usize> MulAssign<VecX<U, N>> for VecX<T, N>
Source§fn mul_assign(&mut self, rhs: VecX<U, N>)
fn mul_assign(&mut self, rhs: VecX<U, N>)
*=
operation. Read moreSource§impl<T, const N: usize> PartialOrd for VecX<T, N>
Compare all elements.
impl<T, const N: usize> PartialOrd for VecX<T, N>
Compare all elements.
全ての要素を比較する。
§Examples
use vec_x::{VecX};
let vec1 = VecX::new([1, 2, 3]);
let vec2 = VecX::new([1, 2, 3]);
assert_eq!(vec1, vec2);
assert!(vec1 <= vec2);
assert!(vec1 >= vec2);
let vec1 = VecX::new([1, 2, 3]);
let vec2 = VecX::new([4, 5, 6]);
assert!(vec1 < vec2);
let vec1 = VecX::new([1, 2, 3]);
let vec2 = VecX::new([1, 2, 2]);
assert_ne!(vec1, vec2);
assert!(vec1 > vec2);
use vec_x::{VecX};
let vec1 = VecX::new([1, 2, 3]);
let vec2 = VecX::new([4, 5, 6]);
assert!(vec1 > vec2); // panic!
use vec_x::{VecX};
let vec1 = VecX::new([1, 2, 1]);
let vec2 = VecX::new([2, 1, 2]);
assert!(vec1 < vec2|| vec1 == vec2 || vec1 > vec2); // panic!
Source§impl<T, U, const N: usize> RemAssign<U> for VecX<T, N>
impl<T, U, const N: usize> RemAssign<U> for VecX<T, N>
Source§fn rem_assign(&mut self, rhs: U)
fn rem_assign(&mut self, rhs: U)
%=
operation. Read moreSource§impl<T, U, const N: usize> RemAssign<VecX<U, N>> for VecX<T, N>
impl<T, U, const N: usize> RemAssign<VecX<U, N>> for VecX<T, N>
Source§fn rem_assign(&mut self, rhs: VecX<U, N>)
fn rem_assign(&mut self, rhs: VecX<U, N>)
%=
operation. Read moreSource§impl<T, U, const N: usize> SubAssign<U> for VecX<T, N>
impl<T, U, const N: usize> SubAssign<U> for VecX<T, N>
Source§fn sub_assign(&mut self, rhs: U)
fn sub_assign(&mut self, rhs: U)
-=
operation. Read moreSource§impl<T, U, const N: usize> SubAssign<VecX<U, N>> for VecX<T, N>
impl<T, U, const N: usize> SubAssign<VecX<U, N>> for VecX<T, N>
Source§fn sub_assign(&mut self, rhs: VecX<U, N>)
fn sub_assign(&mut self, rhs: VecX<U, N>)
-=
operation. Read moreimpl<T, const N: usize> Copy for VecX<T, N>
impl<T, const N: usize> Eq for VecX<T, N>
impl<T, const N: usize> StructuralPartialEq for VecX<T, N>
Auto Trait Implementations§
impl<T, const N: usize> Freeze for VecX<T, N>where
T: Freeze,
impl<T, const N: usize> RefUnwindSafe for VecX<T, N>where
T: RefUnwindSafe,
impl<T, const N: usize> Send for VecX<T, N>
impl<T, const N: usize> Sync for VecX<T, N>where
T: Sync,
impl<T, const N: usize> Unpin for VecX<T, N>where
T: Unpin,
impl<T, const N: usize> UnwindSafe for VecX<T, N>where
T: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key
and return true
if they are equal.