[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <112d971f-20c8-4598-86c9-6822d9c24001@nvidia.com>
Date: Fri, 2 May 2025 23:02:20 -0400
From: Joel Fernandes <joelagnelf@...dia.com>
To: Alexandre Courbot <acourbot@...dia.com>, Miguel Ojeda <ojeda@...nel.org>,
Alex Gaynor <alex.gaynor@...il.com>, Boqun Feng <boqun.feng@...il.com>,
Gary Guo <gary@...yguo.net>, Björn Roy Baron
<bjorn3_gh@...tonmail.com>, Benno Lossin <benno.lossin@...ton.me>,
Andreas Hindborg <a.hindborg@...nel.org>, Alice Ryhl <aliceryhl@...gle.com>,
Trevor Gross <tmgross@...ch.edu>, Danilo Krummrich <dakr@...nel.org>,
David Airlie <airlied@...il.com>, Simona Vetter <simona@...ll.ch>,
Maarten Lankhorst <maarten.lankhorst@...ux.intel.com>,
Maxime Ripard <mripard@...nel.org>, Thomas Zimmermann <tzimmermann@...e.de>,
Jonathan Corbet <corbet@....net>
Cc: John Hubbard <jhubbard@...dia.com>, Ben Skeggs <bskeggs@...dia.com>,
Timur Tabi <ttabi@...dia.com>, Alistair Popple <apopple@...dia.com>,
linux-kernel@...r.kernel.org, rust-for-linux@...r.kernel.org,
nouveau@...ts.freedesktop.org, dri-devel@...ts.freedesktop.org
Subject: Re: [PATCH v2 17/21] rust: num: Add an upward alignment helper for
usize
On 5/2/2025 9:59 PM, Alexandre Courbot wrote:
>> pub trait AlignUp {
>> fn align_up(self, alignment: Self) -> Self;
>> }
>>
>> macro_rules! align_up_impl {
>> ($($t:ty),+) => {
>> $(
>> impl AlignUp for $t {
>> fn align_up(self, alignment: Self) -> Self {
>> (self + alignment - 1) & !(alignment - 1)
>> }
>> }
>> )+
>> }
>> }
>>
>> align_up_impl!(usize, u8, u16, u32, u64, u128);
>>
>> Or, we can even combine the 2 approaches. Use macros for the "impl Alignable"
>> and use generics on the Alignable trait.
>>
>> macro_rules! impl_alignable {
>> ($($t:ty),+) => {
>> $(
>> impl Alignable for $t {}
>> )+
>> };
>> }
>>
>> impl_alignable!(usize, u8, u16, u32, u64, u128);
>>
>> pub trait AlignUp {
>> fn align_up(self, alignment: Self) -> Self;
>> }
>>
>> impl<T> AlignUp for T
>> where
>> T: Alignable,
>> {
>> fn align_up(self, alignment: Self) -> Self {
>> let one = T::from(1u8);
>> (self + alignment - one) & !(alignment - one)
>> }
>> }
>>
>> Thoughts?
> I think that's the correct way to do it and am fully on board with this
> approach.
>
> The only thing this doesn't solve is that it doesn't provide `const`
> functions. But maybe for that purpose we can use a single macro that
> nicely panics at build-time should an overflow occur.
Great, thanks. I split the traits as follows and it is cleaner and works. I will
look into the build-time overflow check and the returning of Result change on
Monday. Let me know if any objections. I added the #[inline] and hopefully that
gives similar benefits to const that you're seeking:
use core::ops::{BitAnd, BitOr, Not, Add, Sub};
pub trait BitOps:
Copy
+ BitAnd<Output = Self>
+ BitOr<Output = Self>
+ Not<Output = Self>
{
}
pub trait Unsigned:
Copy
+ Add<Output = Self>
+ Sub<Output = Self>
+ From<u8>
{
}
macro_rules! impl_unsigned_traits {
($($t:ty),+) => {
$(
impl Unsigned for $t {}
impl BitOps for $t {}
)+
};
}
impl_unsigned_traits!(usize, u8, u16, u32, u64, u128);
pub trait AlignUp {
fn align_up(self, alignment: Self) -> Self;
}
impl<T> AlignUp for T
where
T: BitOps + Unsigned,
{
#[inline]
fn align_up(self, alignment: Self) -> Self {
let one = T::from(1u8);
(self + alignment - one) & !(alignment - one)
}
}
Thanks.
Powered by blists - more mailing lists