| Crates.io | vector-basis |
| lib.rs | vector-basis |
| version | 0.3.0 |
| created_at | 2022-01-09 09:56:36.943012+00 |
| updated_at | 2026-01-16 23:17:46.165814+00 |
| description | Access components of generic vector types |
| homepage | https://gitlab.com/porky11/vector-basis |
| repository | https://gitlab.com/porky11/vector-basis |
| max_upload_size | |
| id | 510737 |
| size | 7,922 |
Low-level traits for generic access to vector basis components (e.g., x, y, z). Builds directly on vector-space.
⚠️ Recommended for interop only (like FFI with render engines, serialization). Prefer vector-space traits for math operations—avoid direct component access in generic code.
use vector_basis::{Basis, Bases};
use vector_space::VectorSpace;
#[derive(Copy, Clone, Debug, PartialEq)]
struct Vec2(f32, f32);
impl VectorSpace for Vec2 {
type Scalar = f32;
}
impl Basis<0> for Vec2 {
fn basis(&self) -> f32 { self.0 }
fn basis_mut(&mut self) -> &mut f32 { &mut self.0 }
}
impl Basis<1> for Vec2 {
fn basis(&self) -> f32 { self.1 }
fn basis_mut(&mut self) -> &mut f32 { &mut self.1 }
}
// Convenience via Bases (auto-implemented)
let v = Vec2(1.0, 2.0);
assert_eq!(v.bases::<0>(), 1.0); // x-component
assert_eq!(v.bases::<1>(), 2.0); // y-component
let v2 = v.with_bases::<1>(3.0); // Set y to 3.0
assert_eq!(v2, Vec2(1.0, 3.0));
let unit_x = Vec2::unit_bases::<0>(); // (1.0, 0.0)
let scaled_x = Vec2::bases_of::<0>(5.0); // (5.0, 0.0)
Basis<I>: Const-generic index access (I=0 → x, I=1 → y, etc.) -> unit_basis(), basis_of(mag), basis(&self), basis_mut(&mut self), with_basis(self, mag)Bases: Blanket impl over Basis<I> for convenience (bases::<I>(), etc.)no_std: Full supportBasis<0> and Basis<1>, which makes it possible to use both 2D and 3D vectors for a 2D rendering engine using this cratev.bases::<2>() for GPU buffers or JSON serialization.InnerSpace::project() etc. from vector-space instead.