gen_ops
Rust macros for operator overloading of generic types.

Usage
The macros need four statements
- (Optional) Generic parameter names
- Type signature or extended type signature
- Callable expressions for each operator, and optionally, where clause for each operator
- (Optional) Where clause for generic parameters
Note
All statements end with a semicolon except the where clause.
Example
#[derive(Debug, Copy, Clone, PartialEq)]
struct Pair<T>(pub T, pub T);
#[inline]
fn sub_pair<T>(a: &Pair<T>, b: &Pair<T>) -> Pair<T>
where T: Sub<Output=T> + Copy {
Pair(a.0 - b.0, a.1 - b.1)
}
gen_ops!(
<T>; types Pair<T>, Pair<T> => Pair<T>;
for + call |a: &Pair<T>, b: &Pair<T>| {
Pair(a.0 + b.0, a.1 + b.1)
}; (where T: Add<Output=T>)
for - call sub_pair; (where T: Sub<Output=T>)
where T: Copy );
let a = Pair(2, 3);
let b = Pair(1, 8);
println!("a + b = {:?}", a + b); println!("a - b = {:?}", a - b);
gen_ops!
The primary macro for all operators.
#[derive(Debug, Copy, Clone, PartialEq)]
struct Pair<T>(pub T, pub T);
gen_ops!(
<T>;
types Pair<T>, Pair<T> => Pair<T>;
for + call |a: &Pair<T>, b: &Pair<T>| Pair(a.0 + b.0, a.1 + b.1);
(where T: Add<Output=T>)
for - call |a: &Pair<T>, b: &Pair<T>| Pair(a.0 - b.0, a.1 - b.1);
(where T: Sub<Output=T>)
where T: Copy
);
let a = Pair(10, 5);
let b = Pair(8, 9);
println!("a + b = {:?}", a + b); println!("a - b = {:?}", a - b);
gen_ops_comm!
Implements commutative operations.
#[derive(Debug, Copy, Clone, PartialEq)]
struct Pair<T>(pub T, pub T);
gen_ops_comm!(
<T>;
types Pair<T>, i32 => Pair<T>;
for * call |a: &Pair<T>, b:&i32| Pair(a.0 * *b, a.1 * *b);
(where T: Mul<i32, Output=T>)
for & call |a: &Pair<T>, b:&i32| Pair(a.0 & *b, a.1 & *b);
(where T: BitAnd<i32, Output=T>)
where T: Copy
);
let a = Pair(12, 3);
println!("a * 5 = {:?}", a * 5); println!("5 * a = {:?}", 5 * a); println!("a & 2 = {:?}", a & 2); println!("2 & a = {:?}", 2 & a);
gen_ops_ex!
Implements trait for borrowed types.
#[derive(Debug, Copy, Clone, PartialEq)]
struct Pair<T>(pub T, pub T);
gen_ops_ex!(
<T>;
types mut Pair<T>, T => Pair<T>;
for * call |a: &Pair<T>, b:&T| Pair(a.0 * *b, a.1 * *b);
where T: Mul<Output=T> + Copy
);
let mut a = Pair(12, 3);
{
let mut b = &mut a;
println!("&mut a * 2 = {:?}", b * 2);}
println!("&a * 2 = {:?}", &a * 2);println!("a * 2 = {:?}", a * 2);
gen_ops_comm_ex!
Implements commutative operations for borrowed types.
#[derive(Debug, Copy, Clone, PartialEq)]
struct Pair<T>(pub T, pub T);
gen_ops_comm_ex!(
<T>;
types ref Pair<T>, i32 => Pair<T>;
for * call |a: &Pair<T>, b:&i32| Pair(a.0 * *b, a.1 * *b);
where T: Mul<i32, Output=T> + Copy
);
let a = Pair(12, 3);
println!("a * 5 = {:?}", a * 5); println!("5 * a = {:?}", 5 * a); println!("5 * &a = {:?}", 5 * &a); println!("&a * 5 = {:?}", &a * 5);
Docs
For more details see docs.
Inspiration
This project is inspired by auto_ops