From 514c0304b8df80d5134765727d9b9e444f4bddcf Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Tue, 17 Jun 2025 22:11:10 +0200 Subject: [PATCH 1/3] clone and free with :: syntax --- src/commands/bitmap_command.rs | 4 ++-- src/commands/bitvec_command.rs | 4 ++-- src/commands/brightness_grid_command.rs | 4 ++-- src/commands/cc_only_commands.rs | 6 +++--- src/commands/char_grid_command.rs | 4 ++-- src/commands/cp437_grid_command.rs | 4 ++-- src/commands/global_brightness_command.rs | 4 ++-- src/containers/bitmap.rs | 16 ++++++++-------- src/containers/bitvec.rs | 16 ++++++++-------- src/containers/brightness_grid.rs | 16 ++++++++-------- src/containers/char_grid.rs | 14 +++++++------- src/containers/cp437_grid.rs | 16 ++++++++-------- src/macros.rs | 4 ++-- src/packet.rs | 4 ++-- src/udp.rs | 2 +- 15 files changed, 59 insertions(+), 59 deletions(-) diff --git a/src/commands/bitmap_command.rs b/src/commands/bitmap_command.rs index 6018b33..24400c7 100644 --- a/src/commands/bitmap_command.rs +++ b/src/commands/bitmap_command.rs @@ -45,8 +45,8 @@ pub unsafe extern "C" fn sp_cmd_bitmap_try_into_packet( heap_move_ok(unsafe { heap_remove(command) }.try_into()) } -wrap_clone!(BitmapCommand, sp_cmd_bitmap); -wrap_free!(BitmapCommand, sp_cmd_bitmap); +wrap_clone!(sp_cmd_bitmap::BitmapCommand); +wrap_free!(sp_cmd_bitmap::BitmapCommand); /// Returns a pointer to the provided `BitmapCommand`. /// diff --git a/src/commands/bitvec_command.rs b/src/commands/bitvec_command.rs index b3eb843..aeff1cd 100644 --- a/src/commands/bitvec_command.rs +++ b/src/commands/bitvec_command.rs @@ -45,8 +45,8 @@ pub unsafe extern "C" fn sp_cmd_bitvec_try_into_packet( heap_move_ok(unsafe { heap_remove(command) }.try_into()) } -wrap_clone!(BitVecCommand, sp_cmd_bitvec); -wrap_free!(BitVecCommand, sp_cmd_bitvec); +wrap_clone!(sp_cmd_bitvec::BitVecCommand); +wrap_free!(sp_cmd_bitvec::BitVecCommand); /// Returns a pointer to the [BitVec] contained in the [BitVecCommand]. #[no_mangle] diff --git a/src/commands/brightness_grid_command.rs b/src/commands/brightness_grid_command.rs index 7803486..9c5069e 100644 --- a/src/commands/brightness_grid_command.rs +++ b/src/commands/brightness_grid_command.rs @@ -41,8 +41,8 @@ pub unsafe extern "C" fn sp_cmd_brightness_grid_into_packet( heap_move_ok(unsafe { heap_remove(command) }.try_into()) } -wrap_clone!(BrightnessGridCommand, sp_cmd_brightness_grid); -wrap_free!(BrightnessGridCommand, sp_cmd_brightness_grid); +wrap_clone!(sp_cmd_brightness_grid::BrightnessGridCommand); +wrap_free!(sp_cmd_brightness_grid::BrightnessGridCommand); /// Moves the provided [BrightnessGrid] to be contained in the [BrightnessGridCommand]. #[no_mangle] diff --git a/src/commands/cc_only_commands.rs b/src/commands/cc_only_commands.rs index 0acfa68..fc73303 100644 --- a/src/commands/cc_only_commands.rs +++ b/src/commands/cc_only_commands.rs @@ -12,7 +12,7 @@ pub unsafe extern "C" fn sp_cmd_clear_new() -> NonNull { heap_move_nonnull(ClearCommand) } -wrap_free!(ClearCommand, sp_cmd_clear); +wrap_free!(sp_cmd_clear::ClearCommand); /// Kills the udp daemon on the display, which usually results in a restart. /// @@ -24,7 +24,7 @@ pub unsafe extern "C" fn sp_cmd_hard_reset_new() -> NonNull { heap_move_nonnull(HardResetCommand) } -wrap_free!(HardResetCommand, sp_cmd_hard_reset); +wrap_free!(sp_cmd_hard_reset::HardResetCommand); /// A yet-to-be-tested command. /// @@ -34,4 +34,4 @@ pub unsafe extern "C" fn sp_cmd_fade_out_new() -> NonNull { heap_move_nonnull(FadeOutCommand) } -wrap_free!(FadeOutCommand, sp_cmd_fade_out); +wrap_free!(sp_cmd_fade_out::FadeOutCommand); diff --git a/src/commands/char_grid_command.rs b/src/commands/char_grid_command.rs index 8a6c07c..b895718 100644 --- a/src/commands/char_grid_command.rs +++ b/src/commands/char_grid_command.rs @@ -41,8 +41,8 @@ pub unsafe extern "C" fn sp_cmd_char_grid_try_into_packet( heap_move_ok(unsafe { heap_remove(command) }.try_into()) } -wrap_clone!(CharGridCommand, sp_cmd_char_grid); -wrap_free!(CharGridCommand, sp_cmd_char_grid); +wrap_clone!(sp_cmd_char_grid::CharGridCommand); +wrap_free!(sp_cmd_char_grid::CharGridCommand); /// Moves the provided [CharGrid] to be contained in the [CharGridCommand]. #[no_mangle] diff --git a/src/commands/cp437_grid_command.rs b/src/commands/cp437_grid_command.rs index fc32f05..3f1fa9f 100644 --- a/src/commands/cp437_grid_command.rs +++ b/src/commands/cp437_grid_command.rs @@ -41,8 +41,8 @@ pub unsafe extern "C" fn sp_cmd_cp437_grid_try_into_packet( heap_move_ok(unsafe { heap_remove(command) }.try_into()) } -wrap_clone!(Cp437GridCommand, sp_cmd_cp437_grid); -wrap_free!(Cp437GridCommand, sp_cmd_cp437_grid); +wrap_clone!(sp_cmd_cp437_grid::Cp437GridCommand); +wrap_free!(sp_cmd_cp437_grid::Cp437GridCommand); /// Moves the provided bitmap into the provided command. /// diff --git a/src/commands/global_brightness_command.rs b/src/commands/global_brightness_command.rs index 48d21d7..20a350a 100644 --- a/src/commands/global_brightness_command.rs +++ b/src/commands/global_brightness_command.rs @@ -22,8 +22,8 @@ pub unsafe extern "C" fn sp_cmd_brightness_global_into_packet( heap_move_nonnull(unsafe { heap_remove(command) }.into()) } -wrap_clone!(GlobalBrightnessCommand, sp_cmd_brightness_global); -wrap_free!(GlobalBrightnessCommand, sp_cmd_brightness_global); +wrap_clone!(sp_cmd_brightness_global::GlobalBrightnessCommand); +wrap_free!(sp_cmd_brightness_global::GlobalBrightnessCommand); /// Moves the provided bitmap to be contained in the command. #[no_mangle] diff --git a/src/containers/bitmap.rs b/src/containers/bitmap.rs index ae97597..9b96d10 100644 --- a/src/containers/bitmap.rs +++ b/src/containers/bitmap.rs @@ -80,11 +80,11 @@ pub unsafe extern "C" fn sp_bitmap_from_bitvec( heap_move_ok(Bitmap::from_bitvec(width, bitvec)) } -wrap_clone!(Bitmap, sp_bitmap); -wrap_free!(Bitmap, sp_bitmap); +wrap_clone!(sp_bitmap::Bitmap); +wrap_free!(sp_bitmap::Bitmap); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Gets the current value at the specified position. /// /// # Arguments @@ -98,7 +98,7 @@ wrap_method!( ); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Sets the value of the specified position. /// /// # Arguments @@ -113,7 +113,7 @@ wrap_method!( ); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Sets the state of all pixels in the [Bitmap]. /// /// # Arguments @@ -123,19 +123,19 @@ wrap_method!( ); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Gets the width in pixels. ref fn width() -> usize; ); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Gets the height in pixels. ref fn height() -> usize; ); wrap_method!( - sp_bitmap :: Bitmap; + sp_bitmap::Bitmap; /// Gets an unsafe reference to the data of the [Bitmap] instance. /// /// The returned memory is valid for the lifetime of the bitmap. diff --git a/src/containers/bitvec.rs b/src/containers/bitvec.rs index ea0ca4b..aad2a88 100644 --- a/src/containers/bitvec.rs +++ b/src/containers/bitvec.rs @@ -35,11 +35,11 @@ pub unsafe extern "C" fn sp_bitvec_load( heap_move_nonnull(DisplayBitVec::from_slice(data)) } -wrap_clone!(DisplayBitVec, sp_bitvec); -wrap_free!(DisplayBitVec, sp_bitvec); +wrap_clone!(sp_bitvec::DisplayBitVec); +wrap_free!(sp_bitvec::DisplayBitVec); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Gets the value of a bit. /// /// # Arguments @@ -57,7 +57,7 @@ wrap_method!( ); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Sets the value of a bit. /// /// # Arguments @@ -72,7 +72,7 @@ wrap_method!( ); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Sets the value of all bits. /// /// # Arguments @@ -82,19 +82,19 @@ wrap_method!( ); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Gets the length in bits. ref fn len() -> usize; ); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Returns true if length is 0. ref fn is_empty() -> bool; ); wrap_method!( - sp_bitvec :: DisplayBitVec; + sp_bitvec::DisplayBitVec; /// Gets an unsafe reference to the data of the [DisplayBitVec] instance. /// /// The returned memory is valid for the lifetime of the bitvec. diff --git a/src/containers/brightness_grid.rs b/src/containers/brightness_grid.rs index a1a5e4e..54491c2 100644 --- a/src/containers/brightness_grid.rs +++ b/src/containers/brightness_grid.rs @@ -52,11 +52,11 @@ pub unsafe extern "C" fn sp_brightness_grid_load( ) } -wrap_clone!(BrightnessGrid, sp_brightness_grid); -wrap_free!(BrightnessGrid, sp_brightness_grid); +wrap_clone!(sp_brightness_grid::BrightnessGrid); +wrap_free!(sp_brightness_grid::BrightnessGrid); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Gets the current value at the specified position. /// /// # Arguments @@ -71,7 +71,7 @@ wrap_method!( ); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Sets the value of the specified position. /// /// # Arguments @@ -88,7 +88,7 @@ wrap_method!( ); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Sets the value of all cells. /// /// # Arguments @@ -98,19 +98,19 @@ wrap_method!( ); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Gets the width of the grid. ref fn width() -> usize; ); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Gets the height of the grid. ref fn height() -> usize; ); wrap_method!( - sp_brightness_grid :: BrightnessGrid; + sp_brightness_grid::BrightnessGrid; /// Gets an unsafe reference to the data of the instance. /// /// The returned memory is valid for the lifetime of the grid. diff --git a/src/containers/char_grid.rs b/src/containers/char_grid.rs index bc421b5..5db7897 100644 --- a/src/containers/char_grid.rs +++ b/src/containers/char_grid.rs @@ -39,11 +39,11 @@ pub unsafe extern "C" fn sp_char_grid_load( heap_move_ok(CharGrid::load_utf8(width, height, data.to_vec())) } -wrap_clone!(CharGrid, sp_char_grid); -wrap_free!(CharGrid, sp_char_grid); +wrap_clone!(sp_char_grid::CharGrid); +wrap_free!(sp_char_grid::CharGrid); wrap_method!( - sp_char_grid :: CharGrid; + sp_char_grid::CharGrid; /// Returns the current value at the specified position. /// /// # Arguments @@ -58,7 +58,7 @@ wrap_method!( ); wrap_method!( - sp_char_grid :: CharGrid; + sp_char_grid::CharGrid; /// Sets the value of the specified position in the grid. /// /// # Arguments @@ -77,7 +77,7 @@ wrap_method!( ); wrap_method!( - sp_char_grid :: CharGrid; + sp_char_grid::CharGrid; /// Sets the value of all cells in the grid. /// /// # Arguments @@ -89,13 +89,13 @@ wrap_method!( ); wrap_method!( - sp_char_grid :: CharGrid; + sp_char_grid::CharGrid; /// Gets the width of the grid. ref fn width() -> usize; ); wrap_method!( - sp_char_grid :: CharGrid; + sp_char_grid::CharGrid; /// Gets the height of the grid. ref fn height() -> usize; ); diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index 88fb2b0..ebf652e 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -30,11 +30,11 @@ pub unsafe extern "C" fn sp_cp437_grid_load( heap_move_some(Cp437Grid::load(width, height, data)) } -wrap_clone!(Cp437Grid, sp_cp437_grid); -wrap_free!(Cp437Grid, sp_cp437_grid); +wrap_clone!(sp_cp437_grid::Cp437Grid); +wrap_free!(sp_cp437_grid::Cp437Grid); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Gets the current value at the specified position. /// /// # Arguments @@ -48,7 +48,7 @@ wrap_method!( ); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Sets the value at the specified position. /// /// # Arguments @@ -65,7 +65,7 @@ wrap_method!( ); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Sets the value of all cells in the grid. /// /// # Arguments @@ -76,19 +76,19 @@ wrap_method!( ); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Gets the width of the grid. ref fn width() -> usize; ); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Gets the height of the grid. ref fn height() -> usize; ); wrap_method!( - sp_cp437 :: Cp437Grid; + sp_cp437::Cp437Grid; /// Gets an unsafe reference to the data of the grid. /// /// The returned memory is valid for the lifetime of the instance. diff --git a/src/macros.rs b/src/macros.rs index c91248e..80256dd 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -1,5 +1,5 @@ macro_rules! wrap_free { - ($typ:ty, $prefix:ident) => { + ($prefix:ident :: $typ:ty) => { paste::paste! { #[doc = concat!("Deallocates a [", stringify!($typ), "] instance.")] #[no_mangle] @@ -11,7 +11,7 @@ macro_rules! wrap_free { } macro_rules! wrap_clone { - ($typ:ty, $prefix:ident) => { + ($prefix:ident :: $typ:ty) => { paste::paste! { #[doc = concat!("Clones a [", stringify!($typ), "] instance.")] #[no_mangle] diff --git a/src/packet.rs b/src/packet.rs index 658265c..a9b347c 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -91,8 +91,8 @@ pub unsafe extern "C" fn sp_packet_serialize_to( } } -wrap_clone!(Packet, sp_packet); -wrap_free!(Packet, sp_packet); +wrap_clone!(sp_packet::Packet); +wrap_free!(sp_packet::Packet); /// Converts u16 into [CommandCode]. /// diff --git a/src/udp.rs b/src/udp.rs index eef82a8..e18476a 100644 --- a/src/udp.rs +++ b/src/udp.rs @@ -144,4 +144,4 @@ pub unsafe extern "C" fn sp_udp_send_header( .is_ok() } -wrap_free!(UdpSocket, sp_udp); +wrap_free!(sp_udp::UdpSocket); From 8296773779db74009770d85abd94aefa94ea8da9 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Tue, 17 Jun 2025 22:21:11 +0200 Subject: [PATCH 2/3] fix cp437 prefix, fix example --- example/src/brightness_tester.c | 2 +- include/servicepoint.h | 44 ++++++++++++++++----------------- src/containers/cp437_grid.rs | 12 ++++----- 3 files changed, 29 insertions(+), 29 deletions(-) diff --git a/example/src/brightness_tester.c b/example/src/brightness_tester.c index 51790cf..2257162 100644 --- a/example/src/brightness_tester.c +++ b/example/src/brightness_tester.c @@ -12,7 +12,7 @@ void enable_all_pixels(void) { } void make_brightness_pattern(BrightnessGrid *grid) { - ByteSlice slice = sp_brightness_grid_unsafe_data_ref(grid); + ByteSlice slice = sp_brightness_grid_data_ref_mut(grid); for (size_t index = 0; index < slice.length; index++) { slice.start[index] = (uint8_t)(index % ((size_t) Brightness_MAX)); } diff --git a/include/servicepoint.h b/include/servicepoint.h index 6d3b891..6c2da20 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -1588,6 +1588,11 @@ void sp_cmd_hard_reset_free(struct HardResetCommand */*notnull*/ instance); */ struct HardResetCommand */*notnull*/ sp_cmd_hard_reset_new(void); +/** + *Clones a [Cp437Grid] instance. + */ +Cp437Grid */*notnull*/ sp_cp437_grid_clone(Cp437Grid */*notnull*/ instance); + /** * Calls [`servicepoint::Cp437Grid::data_ref_mut`]. * @@ -1595,7 +1600,7 @@ struct HardResetCommand */*notnull*/ sp_cmd_hard_reset_new(void); * * The returned memory is valid for the lifetime of the instance. */ -struct ByteSlice sp_cp437_data_ref_mut(Cp437Grid */*notnull*/ instance); +struct ByteSlice sp_cp437_grid_data_ref_mut(Cp437Grid */*notnull*/ instance); /** * Calls [`servicepoint::Cp437Grid::fill`]. @@ -1607,7 +1612,12 @@ struct ByteSlice sp_cp437_data_ref_mut(Cp437Grid */*notnull*/ instance); * - `cp437_grid`: instance to write to * - `value`: the value to set all cells to */ -void sp_cp437_fill(Cp437Grid */*notnull*/ instance, uint8_t value); +void sp_cp437_grid_fill(Cp437Grid */*notnull*/ instance, uint8_t value); + +/** + *Deallocates a [Cp437Grid] instance. + */ +void sp_cp437_grid_free(Cp437Grid */*notnull*/ instance); /** * Calls [`servicepoint::Cp437Grid::get`]. @@ -1622,17 +1632,14 @@ void sp_cp437_fill(Cp437Grid */*notnull*/ instance, uint8_t value); * * - when accessing `x` or `y` out of bounds */ -uint8_t sp_cp437_get(Cp437Grid */*notnull*/ instance, size_t x, size_t y); +uint8_t sp_cp437_grid_get(Cp437Grid */*notnull*/ instance, size_t x, size_t y); /** - *Clones a [Cp437Grid] instance. + * Calls [`servicepoint::Cp437Grid::height`]. + * + * Gets the height of the grid. */ -Cp437Grid */*notnull*/ sp_cp437_grid_clone(Cp437Grid */*notnull*/ instance); - -/** - *Deallocates a [Cp437Grid] instance. - */ -void sp_cp437_grid_free(Cp437Grid */*notnull*/ instance); +size_t sp_cp437_grid_height(Cp437Grid */*notnull*/ instance); /** * Creates a [Cp437GridCommand] and immediately turns that into a [Packet]. @@ -1659,13 +1666,6 @@ Cp437Grid *sp_cp437_grid_load(size_t width, */ Cp437Grid */*notnull*/ sp_cp437_grid_new(size_t width, size_t height); -/** - * Calls [`servicepoint::Cp437Grid::height`]. - * - * Gets the height of the grid. - */ -size_t sp_cp437_height(Cp437Grid */*notnull*/ instance); - /** * Calls [`servicepoint::Cp437Grid::set`]. * @@ -1682,17 +1682,17 @@ size_t sp_cp437_height(Cp437Grid */*notnull*/ instance); * * - when accessing `x` or `y` out of bounds */ -void sp_cp437_set(Cp437Grid */*notnull*/ instance, - size_t x, - size_t y, - uint8_t value); +void sp_cp437_grid_set(Cp437Grid */*notnull*/ instance, + size_t x, + size_t y, + uint8_t value); /** * Calls [`servicepoint::Cp437Grid::width`]. * * Gets the width of the grid. */ -size_t sp_cp437_width(Cp437Grid */*notnull*/ instance); +size_t sp_cp437_grid_width(Cp437Grid */*notnull*/ instance); /** *Clones a [Packet] instance. diff --git a/src/containers/cp437_grid.rs b/src/containers/cp437_grid.rs index ebf652e..5d7b84f 100644 --- a/src/containers/cp437_grid.rs +++ b/src/containers/cp437_grid.rs @@ -34,7 +34,7 @@ wrap_clone!(sp_cp437_grid::Cp437Grid); wrap_free!(sp_cp437_grid::Cp437Grid); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Gets the current value at the specified position. /// /// # Arguments @@ -48,7 +48,7 @@ wrap_method!( ); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Sets the value at the specified position. /// /// # Arguments @@ -65,7 +65,7 @@ wrap_method!( ); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Sets the value of all cells in the grid. /// /// # Arguments @@ -76,19 +76,19 @@ wrap_method!( ); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Gets the width of the grid. ref fn width() -> usize; ); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Gets the height of the grid. ref fn height() -> usize; ); wrap_method!( - sp_cp437::Cp437Grid; + sp_cp437_grid::Cp437Grid; /// Gets an unsafe reference to the data of the grid. /// /// The returned memory is valid for the lifetime of the instance. From 75e2df41fec1c064b53e6daa730e445266d7b488 Mon Sep 17 00:00:00 2001 From: Vinzenz Schroeter Date: Tue, 17 Jun 2025 23:56:11 +0200 Subject: [PATCH 3/3] export value fields via macro --- include/servicepoint.h | 64 +++++++++++------- src/commands/bitmap_command.rs | 37 +++++------ src/commands/bitvec_command.rs | 75 +++++---------------- src/commands/global_brightness_command.rs | 26 +++----- src/macros.rs | 79 +++++++++++++++++++++-- src/packet.rs | 12 +++- 6 files changed, 165 insertions(+), 128 deletions(-) diff --git a/include/servicepoint.h b/include/servicepoint.h index 6c2da20..02d0688 100644 --- a/include/servicepoint.h +++ b/include/servicepoint.h @@ -1166,9 +1166,9 @@ struct BitmapCommand */*notnull*/ sp_cmd_bitmap_from_bitmap(struct Bitmap */*not struct Bitmap */*notnull*/ sp_cmd_bitmap_get(struct BitmapCommand */*notnull*/ command); /** - * Reads the compression kind of the [BitmapCommand]. + *Gets the value of field `compression` of the [`servicepoint::BitmapCommand`]. */ -CompressionCode sp_cmd_bitmap_get_compression(struct BitmapCommand */*notnull*/ command); +CompressionCode sp_cmd_bitmap_get_compression(struct BitmapCommand */*notnull*/ instance); /** * Reads the origin field of the [BitmapCommand]. @@ -1196,10 +1196,10 @@ void sp_cmd_bitmap_set(struct BitmapCommand */*notnull*/ command, struct Bitmap */*notnull*/ bitmap); /** - * Overwrites the compression kind of the [BitmapCommand]. + *Sets the value of field `compression` of the [`servicepoint::BitmapCommand`]. */ -void sp_cmd_bitmap_set_compression(struct BitmapCommand */*notnull*/ command, - CompressionCode compression); +void sp_cmd_bitmap_set_compression(struct BitmapCommand */*notnull*/ instance, + CompressionCode value); /** * Overwrites the origin field of the [BitmapCommand]. @@ -1231,19 +1231,19 @@ void sp_cmd_bitvec_free(struct BitVecCommand */*notnull*/ instance); BitVec *sp_cmd_bitvec_get(struct BitVecCommand */*notnull*/ command); /** - * Reads the compression kind of the [BitVecCommand]. + *Gets the value of field `compression` of the [`servicepoint::BitVecCommand`]. */ -CompressionCode sp_cmd_bitvec_get_compression(struct BitVecCommand */*notnull*/ command); +CompressionCode sp_cmd_bitvec_get_compression(struct BitVecCommand */*notnull*/ instance); /** - * Reads the offset field of the [BitVecCommand]. + *Gets the value of field `offset` of the [`servicepoint::BitVecCommand`]. */ -Offset sp_cmd_bitvec_get_offset(struct BitVecCommand */*notnull*/ command); +Offset sp_cmd_bitvec_get_offset(struct BitVecCommand */*notnull*/ instance); /** - * Returns the [BinaryOperation] of the command. + *Gets the value of field `operation` of the [`servicepoint::BitVecCommand`]. */ -BinaryOperation sp_cmd_bitvec_get_operation(struct BitVecCommand */*notnull*/ command); +BinaryOperation sp_cmd_bitvec_get_operation(struct BitVecCommand */*notnull*/ instance); /** * Set pixel data starting at the pixel offset on screen. @@ -1271,22 +1271,22 @@ void sp_cmd_bitvec_set(struct BitVecCommand */*notnull*/ command, BitVec */*notnull*/ bitvec); /** - * Overwrites the compression kind of the [BitVecCommand]. + *Sets the value of field `compression` of the [`servicepoint::BitVecCommand`]. */ -void sp_cmd_bitvec_set_compression(struct BitVecCommand */*notnull*/ command, - CompressionCode compression); +void sp_cmd_bitvec_set_compression(struct BitVecCommand */*notnull*/ instance, + CompressionCode value); /** - * Overwrites the offset field of the [BitVecCommand]. + *Sets the value of field `offset` of the [`servicepoint::BitVecCommand`]. */ -void sp_cmd_bitvec_set_offset(struct BitVecCommand */*notnull*/ command, - Offset offset); +void sp_cmd_bitvec_set_offset(struct BitVecCommand */*notnull*/ instance, + Offset value); /** - * Overwrites the [BinaryOperation] of the command. + *Sets the value of field `operation` of the [`servicepoint::BitVecCommand`]. */ -void sp_cmd_bitvec_set_operation(struct BitVecCommand */*notnull*/ command, - BinaryOperation operation); +void sp_cmd_bitvec_set_operation(struct BitVecCommand */*notnull*/ instance, + BinaryOperation value); /** * Tries to turn a [BitVecCommand] into a [Packet]. @@ -1305,7 +1305,10 @@ struct GlobalBrightnessCommand */*notnull*/ sp_cmd_brightness_global_clone(struc */ void sp_cmd_brightness_global_free(struct GlobalBrightnessCommand */*notnull*/ instance); -Brightness sp_cmd_brightness_global_get(struct GlobalBrightnessCommand */*notnull*/ command); +/** + *Gets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. + */ +Brightness sp_cmd_brightness_global_get_brightness(struct GlobalBrightnessCommand */*notnull*/ instance); struct Packet */*notnull*/ sp_cmd_brightness_global_into_packet(struct GlobalBrightnessCommand */*notnull*/ command); @@ -1317,10 +1320,10 @@ struct Packet */*notnull*/ sp_cmd_brightness_global_into_packet(struct GlobalBri struct GlobalBrightnessCommand */*notnull*/ sp_cmd_brightness_global_new(Brightness brightness); /** - * Moves the provided bitmap to be contained in the command. + *Sets the value of field `brightness` of the [`servicepoint::GlobalBrightnessCommand`]. */ -void sp_cmd_brightness_global_set(struct GlobalBrightnessCommand */*notnull*/ command, - Brightness brightness); +void sp_cmd_brightness_global_set_brightness(struct GlobalBrightnessCommand */*notnull*/ instance, + Brightness value); /** *Clones a [BrightnessGridCommand] instance. @@ -1712,12 +1715,17 @@ void sp_packet_free(struct Packet */*notnull*/ instance); struct Packet */*notnull*/ sp_packet_from_parts(struct Header header, struct ByteSlice payload); +/** + *Gets the value of field `header` of the [`servicepoint::Packet`]. + */ +struct Header sp_packet_get_header(struct Packet */*notnull*/ instance); + /** * Returns a pointer to the header field of the provided packet. * * The returned header can be changed and will be valid for the lifetime of the packet. */ -struct Header */*notnull*/ sp_packet_get_header(struct Packet */*notnull*/ packet); +struct Header */*notnull*/ sp_packet_get_header_mut(struct Packet */*notnull*/ packet); /** * Returns a pointer to the current payload of the provided packet. @@ -1738,6 +1746,12 @@ struct ByteSlice sp_packet_get_payload(struct Packet */*notnull*/ packet); void sp_packet_serialize_to(struct Packet */*notnull*/ packet, struct ByteSlice buffer); +/** + *Sets the value of field `header` of the [`servicepoint::Packet`]. + */ +void sp_packet_set_header(struct Packet */*notnull*/ instance, + struct Header value); + /** * Sets the payload of the provided packet to the provided data. * diff --git a/src/commands/bitmap_command.rs b/src/commands/bitmap_command.rs index 24400c7..3bfcf20 100644 --- a/src/commands/bitmap_command.rs +++ b/src/commands/bitmap_command.rs @@ -1,5 +1,5 @@ use crate::{ - macros::{wrap_clone, wrap_free}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{Bitmap, BitmapCommand, CompressionCode, Origin, Packet}; @@ -48,6 +48,22 @@ pub unsafe extern "C" fn sp_cmd_bitmap_try_into_packet( wrap_clone!(sp_cmd_bitmap::BitmapCommand); wrap_free!(sp_cmd_bitmap::BitmapCommand); +wrap_fields!( + sp_cmd_bitmap::BitmapCommand; + //prop bitmap: NonNull { + // get() { + // return NonNull::from(bitmap); + // }; + // set(value) { + // return unsafe { heap_remove(value) }; + // }; + //}; + prop compression: CompressionCode { + get(); + set(value); + }; +); + /// Returns a pointer to the provided `BitmapCommand`. /// /// # Safety @@ -97,22 +113,3 @@ pub unsafe extern "C" fn sp_cmd_bitmap_set_origin( command.as_mut().origin = Origin::new(origin_x, origin_y); } } - -/// Overwrites the compression kind of the [BitmapCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitmap_set_compression( - mut command: NonNull, - compression: CompressionCode, -) { - unsafe { - command.as_mut().compression = compression; - } -} - -/// Reads the compression kind of the [BitmapCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitmap_get_compression( - command: NonNull, -) -> CompressionCode { - unsafe { command.as_ref().compression } -} diff --git a/src/commands/bitvec_command.rs b/src/commands/bitvec_command.rs index aeff1cd..7ccbf31 100644 --- a/src/commands/bitvec_command.rs +++ b/src/commands/bitvec_command.rs @@ -1,5 +1,5 @@ use crate::{ - macros::{wrap_clone, wrap_free}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_move_ok, heap_remove}, }; use servicepoint::{ @@ -48,6 +48,22 @@ pub unsafe extern "C" fn sp_cmd_bitvec_try_into_packet( wrap_clone!(sp_cmd_bitvec::BitVecCommand); wrap_free!(sp_cmd_bitvec::BitVecCommand); +wrap_fields!( + sp_cmd_bitvec::BitVecCommand; + prop offset: Offset { + get(); + set(value); + }; + prop operation: BinaryOperation { + get(); + set(value); + }; + prop compression: CompressionCode { + get(); + set(value); + }; +); + /// Returns a pointer to the [BitVec] contained in the [BitVecCommand]. #[no_mangle] pub unsafe extern "C" fn sp_cmd_bitvec_get( @@ -66,60 +82,3 @@ pub unsafe extern "C" fn sp_cmd_bitvec_set( command.as_mut().bitvec = heap_remove(bitvec); } } - -/// Reads the offset field of the [BitVecCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_get_offset( - command: NonNull, -) -> Offset { - unsafe { command.as_ref().offset } -} - -/// Overwrites the offset field of the [BitVecCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_set_offset( - mut command: NonNull, - offset: Offset, -) { - unsafe { - command.as_mut().offset = offset; - } -} - -/// Returns the [BinaryOperation] of the command. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_get_operation( - command: NonNull, -) -> BinaryOperation { - unsafe { command.as_ref().operation } -} - -/// Overwrites the [BinaryOperation] of the command. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_set_operation( - mut command: NonNull, - operation: BinaryOperation, -) { - unsafe { - command.as_mut().operation = operation; - } -} - -/// Overwrites the compression kind of the [BitVecCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_set_compression( - mut command: NonNull, - compression: CompressionCode, -) { - unsafe { - command.as_mut().compression = compression; - } -} - -/// Reads the compression kind of the [BitVecCommand]. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_bitvec_get_compression( - command: NonNull, -) -> CompressionCode { - unsafe { command.as_ref().compression } -} diff --git a/src/commands/global_brightness_command.rs b/src/commands/global_brightness_command.rs index 20a350a..e695ef0 100644 --- a/src/commands/global_brightness_command.rs +++ b/src/commands/global_brightness_command.rs @@ -1,5 +1,5 @@ use crate::{ - macros::{wrap_clone, wrap_free}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_remove}, }; use servicepoint::{Brightness, GlobalBrightnessCommand, Packet}; @@ -25,20 +25,10 @@ pub unsafe extern "C" fn sp_cmd_brightness_global_into_packet( wrap_clone!(sp_cmd_brightness_global::GlobalBrightnessCommand); wrap_free!(sp_cmd_brightness_global::GlobalBrightnessCommand); -/// Moves the provided bitmap to be contained in the command. -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_brightness_global_set( - mut command: NonNull, - brightness: Brightness, -) { - unsafe { - command.as_mut().brightness = brightness; - } -} - -#[no_mangle] -pub unsafe extern "C" fn sp_cmd_brightness_global_get( - mut command: NonNull, -) -> Brightness { - unsafe { command.as_mut().brightness } -} +wrap_fields!( + sp_cmd_brightness_global::GlobalBrightnessCommand; + prop brightness: Brightness { + get(); + set(value); + }; +); diff --git a/src/macros.rs b/src/macros.rs index 80256dd..df21e23 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -54,7 +54,7 @@ macro_rules! wrap_method { instance: NonNull<$object_type>, $($param_name: $param_type),* ) $(-> $return_type)? { - let instance = unsafe {$crate::macros:: [< nonnull_as_ $ref_or_mut >] !(instance)}; + let instance = unsafe { $crate::macros:: [< nonnull_as_ $ref_or_mut >] !(instance) }; $(let $param_let_name = $param_let_expr;)* #[allow( unused_variables, @@ -62,16 +62,85 @@ macro_rules! wrap_method { let result = instance.$function($($param_name),*); $( $( - let $it = result; - let result = $return_expr; + let $it = result; + let result = $return_expr; )? - return result; + return result; )? } } }; } +macro_rules! wrap_fields { + ( + $prefix:ident :: $object_type:ty; + $( + prop $prop_name:ident : $prop_type:ty { + $( + get() $({ + $(#[$get_meta:meta])* + $(return $get_expr:expr;)? + })?; + )? + $( + set($value:ident) + $({ + $(#[$set_meta:meta])* + $(return $set_expr:expr;)? + })?; + )? + }; + )+ + ) => { + paste::paste! { + $( + $( + #[doc = concat!("Gets the value of field `", stringify!($prop_name), + "` of the [`servicepoint::",stringify!($object_type),"`].")] + $($( + #[doc = ""] + #[$get_meta] + )*)? + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _ get _ $prop_name>]( + instance: NonNull<$object_type> + ) -> $prop_type { + let instance = unsafe { $crate::macros::nonnull_as_ref!(instance) }; + let $prop_name = instance.$prop_name; + $($( + let $prop_name = $get_expr; + )?)? + return $prop_name; + } + )? + + $( + #[doc = concat!("Sets the value of field `", stringify!($prop_name), + "` of the [`servicepoint::",stringify!($object_type),"`].")] + $($( + #[doc = ""] + #[$set_meta] + )*)? + #[no_mangle] + pub unsafe extern "C" fn [<$prefix _ set _ $prop_name>]( + instance: NonNull<$object_type>, + value: $prop_type, + ) { + let instance = unsafe { $crate::macros::nonnull_as_mut!(instance) }; + $($( + let $value = value; + let value = $set_expr; + )?)? + instance.$prop_name = value; + } + )? + )+ + } + }; +} + pub(crate) use { - nonnull_as_mut, nonnull_as_ref, wrap_clone, wrap_free, wrap_method, + nonnull_as_mut, nonnull_as_ref, wrap_clone, wrap_fields, wrap_free, + wrap_method, }; diff --git a/src/packet.rs b/src/packet.rs index a9b347c..af49fc8 100644 --- a/src/packet.rs +++ b/src/packet.rs @@ -1,6 +1,6 @@ use crate::{ containers::ByteSlice, - macros::{wrap_clone, wrap_free}, + macros::{wrap_clone, wrap_fields, wrap_free}, mem::{heap_move_nonnull, heap_move_ok}, }; use servicepoint::{CommandCode, Header, Packet}; @@ -36,7 +36,7 @@ pub unsafe extern "C" fn sp_packet_from_parts( /// /// The returned header can be changed and will be valid for the lifetime of the packet. #[no_mangle] -pub unsafe extern "C" fn sp_packet_get_header( +pub unsafe extern "C" fn sp_packet_get_header_mut( packet: NonNull, ) -> NonNull
{ NonNull::from(unsafe { &mut (*packet.as_ptr()).header }) @@ -94,6 +94,14 @@ pub unsafe extern "C" fn sp_packet_serialize_to( wrap_clone!(sp_packet::Packet); wrap_free!(sp_packet::Packet); +wrap_fields!( + sp_packet::Packet; + prop header: Header { + get(); + set(value); + }; +); + /// Converts u16 into [CommandCode]. /// /// If the provided value is not valid, false is returned and result is not changed.