mirror of
https://git.proxmox.com/git/rustc
synced 2026-03-27 01:57:00 +00:00
| .. | ||
| src | ||
| tests | ||
| .cargo-checksum.json | ||
| Cargo.toml | ||
| LICENSE | ||
| logo.png | ||
| README.md | ||

Provides a macro to simplify operator overloading. See the documentation for details and supported operators.
Example
extern crate overload;
use overload::overload;
use std::ops; // <- don't forget this or you'll get nasty errors
#[derive(PartialEq, Debug)]
struct Val {
v: i32
}
overload!((a: ?Val) + (b: ?Val) -> Val { Val { v: a.v + b.v } });
The macro call in the snippet above generates the following code:
impl ops::Add<Val> for Val {
type Output = Val;
fn add(self, b: Val) -> Self::Output {
let a = self;
Val { v: a.v + b.v }
}
}
impl ops::Add<&Val> for Val {
type Output = Val;
fn add(self, b: &Val) -> Self::Output {
let a = self;
Val { v: a.v + b.v }
}
}
impl ops::Add<Val> for &Val {
type Output = Val;
fn add(self, b: Val) -> Self::Output {
let a = self;
Val { v: a.v + b.v }
}
}
impl ops::Add<&Val> for &Val {
type Output = Val;
fn add(self, b: &Val) -> Self::Output {
let a = self;
Val { v: a.v + b.v }
}
}
We are now able to add Vals and &Vals in any combination:
assert_eq!(Val{v:3} + Val{v:5}, Val{v:8});
assert_eq!(Val{v:3} + &Val{v:5}, Val{v:8});
assert_eq!(&Val{v:3} + Val{v:5}, Val{v:8});
assert_eq!(&Val{v:3} + &Val{v:5}, Val{v:8});