Skip to content

Commit

Permalink
Auto merge of rust-lang#113747 - clarfonthey:ip_bitops, r=dtolnay
Browse files Browse the repository at this point in the history
impl Not, Bit{And,Or}{,Assign} for IP addresses

ACP: rust-lang/libs-team#235

Note: since these are insta-stable, these require an FCP.

Implements, where `N` is either `4` or `6`:

```rust
impl Not for IpvNAddr
impl Not for &IpvNAddr

impl BitAnd<IpvNAddr> for IpvNAddr
impl BitAnd<&IpvNAddr> for IpvNAddr
impl BitAnd<IpvNAddr> for &IpvNAddr
impl BitAnd<&IpvNAddr> for &IpvNAddr

impl BitAndAssign<IpvNAddr> for IpvNAddr
impl BitAndAssign<&IpvNAddr> for IpvNAddr

impl BitOr<IpvNAddr> for IpvNAddr
impl BitOr<&IpvNAddr> for IpvNAddr
impl BitOr<IpvNAddr> for &IpvNAddr
impl BitOr<&IpvNAddr> for &IpvNAddr

impl BitOrAssign<IpvNAddr> for IpvNAddr
impl BitOrAssign<&IpvNAddr> for IpvNAddr
```
  • Loading branch information
bors committed Oct 15, 2023
2 parents 42b1224 + 6b13950 commit 30d310c
Showing 1 changed file with 131 additions and 0 deletions.
131 changes: 131 additions & 0 deletions library/core/src/net/ip_addr.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
use crate::cmp::Ordering;
use crate::fmt::{self, Write};
use crate::iter;
use crate::mem::transmute;
use crate::ops::{BitAnd, BitAndAssign, BitOr, BitOrAssign, Not};

use super::display_buffer::DisplayBuffer;

Expand Down Expand Up @@ -2122,3 +2124,132 @@ impl From<[u16; 8]> for IpAddr {
IpAddr::V6(Ipv6Addr::from(segments))
}
}

#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl Not for Ipv4Addr {
type Output = Ipv4Addr;

#[inline]
fn not(mut self) -> Ipv4Addr {
for octet in &mut self.octets {
*octet = !*octet;
}
self
}
}

#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl Not for &'_ Ipv4Addr {
type Output = Ipv4Addr;

#[inline]
fn not(self) -> Ipv4Addr {
!*self
}
}

#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl Not for Ipv6Addr {
type Output = Ipv6Addr;

#[inline]
fn not(mut self) -> Ipv6Addr {
for octet in &mut self.octets {
*octet = !*octet;
}
self
}
}

#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl Not for &'_ Ipv6Addr {
type Output = Ipv6Addr;

#[inline]
fn not(self) -> Ipv6Addr {
!*self
}
}

macro_rules! bitop_impls {
($(
$(#[$attr:meta])*
impl ($BitOp:ident, $BitOpAssign:ident) for $ty:ty = ($bitop:ident, $bitop_assign:ident);
)*) => {
$(
$(#[$attr])*
impl $BitOpAssign for $ty {
fn $bitop_assign(&mut self, rhs: $ty) {
for (lhs, rhs) in iter::zip(&mut self.octets, rhs.octets) {
lhs.$bitop_assign(rhs);
}
}
}

$(#[$attr])*
impl $BitOpAssign<&'_ $ty> for $ty {
fn $bitop_assign(&mut self, rhs: &'_ $ty) {
self.$bitop_assign(*rhs);
}
}

$(#[$attr])*
impl $BitOp for $ty {
type Output = $ty;

#[inline]
fn $bitop(mut self, rhs: $ty) -> $ty {
self.$bitop_assign(rhs);
self
}
}

$(#[$attr])*
impl $BitOp<&'_ $ty> for $ty {
type Output = $ty;

#[inline]
fn $bitop(mut self, rhs: &'_ $ty) -> $ty {
self.$bitop_assign(*rhs);
self
}
}

$(#[$attr])*
impl $BitOp<$ty> for &'_ $ty {
type Output = $ty;

#[inline]
fn $bitop(self, rhs: $ty) -> $ty {
let mut lhs = *self;
lhs.$bitop_assign(rhs);
lhs
}
}

$(#[$attr])*
impl $BitOp<&'_ $ty> for &'_ $ty {
type Output = $ty;

#[inline]
fn $bitop(self, rhs: &'_ $ty) -> $ty {
let mut lhs = *self;
lhs.$bitop_assign(*rhs);
lhs
}
}
)*
};
}

bitop_impls! {
#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl (BitAnd, BitAndAssign) for Ipv4Addr = (bitand, bitand_assign);
#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl (BitOr, BitOrAssign) for Ipv4Addr = (bitor, bitor_assign);

#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl (BitAnd, BitAndAssign) for Ipv6Addr = (bitand, bitand_assign);
#[stable(feature = "ip_bitops", since = "CURRENT_RUSTC_VERSION")]
impl (BitOr, BitOrAssign) for Ipv6Addr = (bitor, bitor_assign);
}

0 comments on commit 30d310c

Please sign in to comment.