rust-brotli icon indicating copy to clipboard operation
rust-brotli copied to clipboard

Use macro for wrapping += and -=

Open nyurik opened this issue 1 year ago • 5 comments

Use macro for wrapping += and -=

The current auto-generated += and -= implementation is hard to read, and should be replaced with += where possible. That said, we cannot auto-replace it just yet because Rust behaves differently in debug mode, therefore we should use second best approach - a macro that clearly shows intention without all the boilerplate code.

The only manual code are two macros in the src/enc/mod.rs

Use this replacement file as described in other recent PRs to replace boilerplate code.

replacement file content
@@
expression cond, expr;
@@
if cond
{
-   let _rhs = 1;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as u32);
+::wrapping_add!(expr, 1);
}

@@
expression expr;
@@
-{
-   let _rhs = 1;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as u32);
+::wrapping_add!(expr, 1);
-}

@@
expression expr;
@@
-{
-   let _rhs = 1u32;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs);
+::wrapping_add!(expr, 1);
-}

@@
expression expr;
@@
-{
-   let _rhs = 1i32;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as u32);
+::wrapping_add!(expr, 1);
-}

@@
expression expr;
@@
-{
-   let _rhs = 1;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as usize);
+::wrapping_add!(expr, 1);
-}

@@
expression inc, expr;
@@
-{
-   let _rhs = inc;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as u32);
+::wrapping_add!(expr, inc as u32);
-}

@@
expression inc, expr;
@@
-{
-   let _rhs = inc;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs);
+::wrapping_add!(expr, inc);
-}

@@
expression inc, expr;
@@
-{
-   let _rhs = inc;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as u32);
+::wrapping_add!(expr, inc as u32);
-}

@@
expression inc, expr;
@@
-{
-   let _rhs = inc;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_add(_rhs as usize);
+::wrapping_add!(expr, inc as usize);
-}

@@
expression expr;
@@
-{
-   let _rhs = 1;
-   let _lhs = &mut expr;
-   *_lhs = (*_lhs).wrapping_sub(_rhs as usize);
+::wrapping_sub!(expr, 1);
-}

nyurik avatar Mar 15 '24 23:03 nyurik

i just updated the repl file content above - it was in the git log message, but not here

nyurik avatar Mar 16 '24 06:03 nyurik

I don't think a macro is the right approach here. You could have a function that takes in a mut ref, but I'm not sure it's more readable than the wrapping add inline expr.

danielrh avatar Mar 17 '24 18:03 danielrh

I can change it to a function, but having one line is much easier to read than 5, and does not hide intentional logic

nyurik avatar Mar 17 '24 18:03 nyurik

@danielrh wrapping_add is not a trait method, so we would have to have several separate functions like wrapping_add_usize, wrapping_add_i32, etc. Moreovere, I suspect that in some of these, we can replace them with += because we can deduce that the number will never wrap, and was simply auto-generated by cross-compiler. What do you think?

nyurik avatar Mar 17 '24 20:03 nyurik

I removed some changes from this PR that were not related to the wrapping - moved to #160

nyurik avatar Mar 17 '24 20:03 nyurik