2 unstable releases

0.3.0 Feb 9, 2021
0.1.0 Dec 10, 2019

#1981 in Rust patterns

Download history 33490/week @ 2025-10-02 37525/week @ 2025-10-09 40219/week @ 2025-10-16 39603/week @ 2025-10-23 39950/week @ 2025-10-30 53863/week @ 2025-11-06 59267/week @ 2025-11-13 75531/week @ 2025-11-20 62315/week @ 2025-11-27 69942/week @ 2025-12-04 75430/week @ 2025-12-11 70807/week @ 2025-12-18 50718/week @ 2025-12-25 71393/week @ 2026-01-01 96155/week @ 2026-01-08 96394/week @ 2026-01-15

324,169 downloads per month
Used in 72 crates (29 directly)

MIT license

29KB
275 lines

auto_ops Build Status Latest Version

Macros for easy operator overloading.

Documentation

This library is forked from the original impl_ops by brianwp3000.

This library makes writing multiple impl std::ops::<op> blocks much faster, especially when you want operators defined for both owned and borrowed variants of the inputs.

To use, import the macros with use auto_ops::*;. Remember that you can only overload operators between one or more types defined in the current crate (respecting Rust orphan rules).

Examples

use auto_ops::*;

#[derive(Clone, Debug, PartialEq)]
struct DonkeyKong {
    pub bananas: i32,
}
impl DonkeyKong {
    pub fn new(bananas: i32) -> DonkeyKong {
        DonkeyKong { bananas: bananas }
    }
}

impl_op_ex!(+ |a: &DonkeyKong, b: &DonkeyKong| -> DonkeyKong { DonkeyKong::new(a.bananas + b.bananas) });
impl_op_ex!(+= |a: &mut DonkeyKong, b: &DonkeyKong| { a.bananas += b.bananas });

fn main() {
    assert_eq!(DonkeyKong::new(5), DonkeyKong::new(4) + DonkeyKong::new(1));
    assert_eq!(DonkeyKong::new(5), DonkeyKong::new(4) + &DonkeyKong::new(1));
    assert_eq!(DonkeyKong::new(5), &DonkeyKong::new(4) + DonkeyKong::new(1));
    assert_eq!(DonkeyKong::new(5), &DonkeyKong::new(4) + &DonkeyKong::new(1));

    let mut dk = DonkeyKong::new(4);
    dk += DonkeyKong::new(1);
    dk += &DonkeyKong::new(1);
    assert_eq!(DonkeyKong::new(6), dk);
}

Roadmap

With Rust lifetime inference changes, implementations for generic (over types and lifetimes) impls are being worked on.

No runtime deps