use crate::{ containers::{wrap_grid, ByteSlice}, macros::{derive_clone, derive_free, wrap_functions, wrap_methods}, mem::{heap_move_nonnull, heap_move_ok, heap_move_some, heap_remove}, }; use servicepoint::{ Cp437Grid, Cp437GridCommand, DataRef, Grid, Origin, Packet, }; use std::ptr::NonNull; wrap_grid!(Cp437Grid, u8); wrap_functions!(cp437grid; /// Creates a new [Cp437Grid] with the specified dimensions. /// /// returns: [Cp437Grid] initialized to 0. fn new( width: usize, height: usize, ) -> NonNull { heap_move_nonnull(Cp437Grid::new(width, height)) } /// Loads a [Cp437Grid] with the specified dimensions from the provided data. fn load( width: usize, height: usize, data: ByteSlice, ) -> *mut Cp437Grid { let data = unsafe { data.as_slice() }; heap_move_some(Cp437Grid::load(width, height, data)) } /// Creates a [Cp437GridCommand] and immediately turns that into a [Packet]. /// /// The provided [Cp437Grid] gets consumed. /// /// Returns NULL in case of an error. fn try_into_packet( grid: NonNull, x: usize, y: usize, ) -> *mut Packet { let grid = unsafe { heap_remove(grid) }; heap_move_ok(Packet::try_from(Cp437GridCommand { grid, origin: Origin::new(x, y), })) } ); wrap_methods!(Cp437Grid; /// Gets an unsafe reference to the data of the grid. /// /// The returned memory is valid for the lifetime of the instance. mut fn data_ref_mut(instance) -> ByteSlice { unsafe { ByteSlice::from_slice(instance.data_ref_mut()) } }; );