#operator #overload #automatic #implementation #macro

auto-impl-ops

二进制操作自动实现进程宏

5 个版本

0.2.1 2023年3月2日
0.2.0 2023年2月27日
0.1.2 2023年2月21日
0.1.1 2022年11月27日
0.1.0 2022年7月16日

#9#overload

Download history 123/week @ 2024-03-15 111/week @ 2024-03-22 133/week @ 2024-03-29 91/week @ 2024-04-05 93/week @ 2024-04-12 93/week @ 2024-04-19 110/week @ 2024-04-26 101/week @ 2024-05-03 97/week @ 2024-05-10 95/week @ 2024-05-17 93/week @ 2024-05-24 111/week @ 2024-05-31 109/week @ 2024-06-07 98/week @ 2024-06-14 92/week @ 2024-06-21 38/week @ 2024-06-28

357 每月下载量
用于 4 个软件包 (2 直接)

AGPL-3.0 或更高版本

43KB
1K SLoC

二进制操作自动实现进程宏

#[auto_ops] 使 T += UT + UT + &U&T + U&T + &UT += &U 的实现中自动实现。

支持列表 (@+-*/%&|^<<>>.)

  • T @= &U => T @= U&T @ &U&T @ UT @ &UT @ U
  • T @= U => T @= &U&T @ &U&T @ UT @ &UT @ U
  • &T @ &U => T @= &UT @= U&T @ UT @ &UT @ U
  • &T @ U => T @= &UT @= U&T @ &UT @ &UT @ U
  • T @ &U => T @= &UT @= U&T @ &U&T @ UT @ U
  • T @ U => T @= &UT @= U&T @ UT @ &UT @ U

示例

use std::ops::*;
# 
# #[derive(Clone, Default)]
# struct A<T>(T);

#[auto_impl_ops::auto_ops]
impl<M> AddAssign<&A<M>> for A<M>
where
    for<'x> &'x M: Add<Output = M>,
{
    fn add_assign(&mut self, other: &Self) {
        self.0 = &self.0 + &other.0;
    }
}

上述代码展开为以下代码。更多示例请参阅 examples/a.rs

use std::ops::*;
# 
# #[derive(Clone, Default)]
# struct A<T>(T);

impl<M> AddAssign<&A<M>> for A<M>
where
    for<'x> &'x M: Add<Output = M>,
{
    fn add_assign(&mut self, other: &Self) {
        self.0 = &self.0 + &other.0;
    }
}
#[allow(clippy::extra_unused_lifetimes)]
impl<M> AddAssign<A<M>> for A<M>
where
    for<'x> &'x M: Add<Output = M>,
{
    fn add_assign(&mut self, rhs: A<M>) {
        let rhs = &rhs;
        self.add_assign(rhs);
    }
}
impl<M> Add<&A<M>> for &A<M>
where
    for<'x> &'x M: Add<Output = M>,
    A<M>: Clone,
{
    type Output = A<M>;
    fn add(self, rhs: &A<M>) -> Self::Output {
        let mut lhs = self.clone();
        lhs.add_assign(rhs);
        lhs
    }
}
impl<M> Add<A<M>> for &A<M>
where
    for<'x> &'x M: Add<Output = M>,
    A<M>: Clone,
{
    type Output = A<M>;
    fn add(self, rhs: A<M>) -> Self::Output {
        let mut lhs = self.clone();
        let rhs = &rhs;
        lhs.add_assign(rhs);
        lhs
    }
}
impl<M> Add<&A<M>> for A<M>
where
    for<'x> &'x M: Add<Output = M>,
{
    type Output = A<M>;
    fn add(self, rhs: &A<M>) -> Self::Output {
        let mut lhs = self;
        lhs.add_assign(rhs);
        lhs
    }
}
#[allow(clippy::extra_unused_lifetimes)]
impl<M> Add<A<M>> for A<M>
where
    for<'x> &'x M: Add<Output = M>,
{
    type Output = A<M>;
    fn add(self, rhs: A<M>) -> Self::Output {
        let mut lhs = self;
        let rhs = &rhs;
        lhs.add_assign(rhs);
        lhs
    }
}

许可证

auto-impl-ops 是 AGPL-3.0-or-later。此过程宏生成的代码属于 AGPL 例外。您可以根据自己的喜好选择其许可证。

依赖关系

~1.5MB
~36K SLoC