4 releases
0.1.8 | Feb 15, 2021 |
---|---|
0.1.7 | Feb 4, 2021 |
0.1.6 | Feb 4, 2021 |
0.1.0 | Feb 4, 2021 |
#1344 in Data structures
14KB
245 lines
Deltastruct
A Rust library to define and serialize custom changes to a type.
Features an attribute macro to generate a delta type and implementation for any (most) of your own structs. Deltas can then be applied to it's respective struct type, it's fields, or serialized/deserialized for later use.
Example
use deltastruct::*;
#[deltastruct]
mod Vector3 {
#[derive(Clone, Copy)]
pub struct Vector3 {
pub x : f64,
pub y : f64,
pub z : f64,
}
impl Vector3 {
fn set(&mut self, other : Vector3) {
// Copy the given vec's components into our own.
self.x = other.x;
self.y = other.y;
self.z = other.z;
}
fn multiply_scalar(&mut self, n : f64) {
// Multiply each component by the given value
self.x *= n;
self.y *= n;
self.z *= n;
}
fn normalize(&mut self) {
// divide each component by the vector's magnitude
let magnitude = (
self.x.powf(2f64)
+ self.y.powf(2f64)
+ self.z.powf(2f64)
).sqrt();
self.x /= magnitude;
self.y /= magnitude;
self.z /= magnitude;
}
}
}
fn main() {
let mut v = Vector3 {
x: 3f64,
y: 6f64,
z: 6f64
};
let v_delta = Vector3Delta::MultiplyScalar(4f64);
v.apply(&v_delta);
v.apply(&v_delta);
assert_eq!(v.x, 48f64);
let v_delta = Vector3Delta::Normalize();
v.apply(&v_delta);
assert_eq!(v.z, 2f64/3f64)
let v_delta = Vector3Delta::X(f64Delta::Set(8f64));
v.apply(&v_delta);
assert_eq!(v.x, 8f64);
}
Dependencies
~1.5MB
~39K SLoC