Skip to content

Commit 6b7ce5f

Browse files
committed
feat: rewored implementation details for improved performance and developer experiance
1 parent 0b6dd5a commit 6b7ce5f

File tree

21 files changed

+598
-505
lines changed

21 files changed

+598
-505
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ members = [
88
]
99

1010
[workspace.package]
11-
version = "0.1.3"
11+
version = "0.2.0"
1212
edition = "2021"
1313
authors = ["Markus Hadenfeldt <[email protected]>"]
1414
description = "raw_struct is a Rust procedural macro for easily declaring C-style structs that reference local or external memory, based on your memory implementation. It generates appropiate getter methods for easy access."

README.MD

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,13 +28,13 @@ To reference the declared struct in memory you can ether do so by `Reference` or
2828
```rust
2929
let memory = [0u8; 0x10];
3030
{
31-
let object = Reference::<dyn MyStruct>::new(0x00, Arc::new(memory.clone()));
31+
let object = Reference::<MyStruct>::new(0x00, Arc::new(memory.clone()));
3232
println!("field_a = {}", object.field_a()?);
3333
println!("field_b = {}", object.field_b()?);
3434
}
3535

3636
{
37-
let object = Copy::<dyn MyStruct>::new(memory);
37+
let object = Copy::<MyStruct>::new(memory);
3838
println!("field_a = {}", object.field_a()?);
3939
println!("field_b = {}", object.field_b()?);
4040
}

examples/dyn_memory/src/main.rs

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,17 @@ use std::{
77
use raw_struct::{
88
raw_struct,
99
Copy,
10-
FromMemoryView,
11-
Viewable,
10+
CopyMemory,
11+
SizedViewable,
1212
};
1313

1414
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
15-
let buffer = [0x1122u64, 0x8877, 0x9988];
16-
let object = Copy::<dyn Container<u64>>::read_object(&buffer, 0x00)?;
15+
let buffer = CopyMemory([0x1122u64, 0x8877, 0x9988]);
16+
let object = Copy::<Container<u64>>::read_from_memory(&buffer, 0x00)?;
1717

1818
println!(
1919
"Memory size: 0x{:X}",
20-
<dyn Container::<u64> as Viewable<_>>::MEMORY_SIZE
20+
<Container::<u64> as SizedViewable>::memory_size()
2121
);
2222
println!("Vat a = 0x{:X}", object.var_a()?);
2323
println!("Inner = 0x{:X}", object.inner()?);
@@ -26,10 +26,7 @@ fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
2626
}
2727

2828
#[raw_struct(memory = "([u8; 0x10], T)")]
29-
struct Container<T>
30-
where
31-
T: marker::Copy + Send + Sync + 'static,
32-
{
29+
struct Container<T: marker::Copy + Send + Sync + 'static> {
3330
#[field(offset = 0x00)]
3431
pub var_a: u64,
3532

examples/minimal/src/main.rs

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,43 +1,36 @@
11
use std::{
22
self,
33
error::Error,
4-
sync::Arc,
54
};
65

76
use raw_struct::{
8-
builtins::{
9-
Array,
10-
Ptr64,
11-
SizedArray,
12-
},
7+
builtins::Ptr64,
138
raw_struct,
149
Copy,
15-
FromMemoryView,
1610
Reference,
17-
Viewable,
11+
SizedViewable,
1812
};
1913

2014
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
21-
let mut memory = [0u8; 0x20];
15+
let mut memory = [0u8; 0x40];
2216
memory[0..4].copy_from_slice(&0x6Fu32.to_le_bytes());
2317
memory[4..8].copy_from_slice(&0x99u32.to_le_bytes());
2418

2519
println!(
26-
"{}",
27-
<dyn MyStruct as Viewable::<dyn MyStruct>>::MEMORY_SIZE
20+
"MyStruct size = 0x{:X}",
21+
<MyStruct as SizedViewable>::memory_size()
2822
);
2923

30-
let memory = Arc::new(memory);
3124
{
32-
let object = Reference::<dyn MyStruct>::new(memory.clone(), 0x00);
33-
println!("field_a = {}", object.field_a()?);
34-
println!("field_b = {}", object.field_b()?);
25+
let object = Reference::<MyStruct, _>::new(memory.as_slice(), 0x00);
26+
println!("field_a = {:X}", object.field_a()?);
27+
println!("field_b = {:X}", object.field_b()?);
3528
}
3629

3730
{
38-
let object = Copy::<dyn MyStruct>::read_object(&*memory, 0x00)?;
39-
println!("field_a = {}", object.field_a()?);
40-
println!("field_b = {}", object.field_b()?);
31+
let object = Copy::<MyStruct>::read_from_memory(&memory.as_slice(), 0x00)?;
32+
println!("field_a = {:X}", object.field_a()?);
33+
println!("field_b = {:X}", object.field_b()?);
4134
}
4235

4336
Ok(())
@@ -62,27 +55,26 @@ struct MyStruct {
6255

6356
/// Sized array of other raw_structs
6457
#[field(offset = 0x10)]
65-
pub field_d: Ptr64<dyn SizedArray<dyn MyArrayElement, 0x20>>,
58+
pub field_d: Ptr64<[Copy<MyArrayElement>; 0x20]>,
6659

6760
/// Array to another copyable
6861
#[field(offset = 0x10)]
6962
pub field_e: Ptr64<[u8]>,
7063

7164
/// Advanced array to other raw_structs
7265
#[field(offset = 0x18)]
73-
pub field_f: Ptr64<dyn Array<dyn MyStruct>>,
66+
pub field_f: Ptr64<[Copy<MyStruct>]>,
7467

7568
/// Advanced array to other raw_structs
7669
#[field(offset = 0x18)]
77-
pub field_fb: Ptr64<dyn Array<u64>>,
70+
pub field_fb: Ptr64<[u64]>,
7871

7972
#[field(offset = 0x20)]
8073
pub field_g: [u8; 0x20],
8174
}
8275

8376
#[raw_struct(size = 0x44)]
84-
struct MyStructExt {
77+
struct MyStructExt /* : MyStruct */ {
8578
#[field(offset = 0x40)]
8679
pub ext_field_a: u32,
8780
}
88-
impl MyStruct for dyn MyStructExt {}

raw_struct/src/builtins/array.rs

Lines changed: 37 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -1,156 +1,106 @@
1-
use alloc::{
2-
format,
3-
sync::Arc,
4-
vec::Vec,
5-
};
1+
use alloc::vec::Vec;
62
use core::{
7-
marker::{
8-
self,
9-
},
3+
self,
104
mem,
115
ops::Range,
126
slice,
137
};
148

159
use crate::{
16-
AccessError,
17-
AccessMode,
1810
Copy,
1911
FromMemoryView,
12+
MemoryDecodeError,
2013
MemoryView,
2114
Reference,
22-
Viewable,
15+
SizedViewable,
2316
};
2417

2518
#[allow(clippy::len_without_is_empty)]
26-
pub trait Array<T: ?Sized> {
19+
pub trait Array<T> {
2720
fn start_address(&self) -> u64;
2821

2922
fn len(&self) -> Option<usize>;
3023
}
3124

3225
impl<T: FromMemoryView> dyn Array<T> {
33-
pub fn element_at(&self, memory: &dyn MemoryView, index: usize) -> Result<T, AccessError> {
26+
pub fn element_at<M: MemoryView>(
27+
&self,
28+
memory: &M,
29+
index: usize,
30+
) -> Result<T, MemoryDecodeError<M::AccessError, T::DecodeError>> {
3431
let offset = (index * mem::size_of::<T>()) as u64;
35-
T::read_object(memory, self.start_address() + offset).map_err(|err| AccessError {
36-
source: err,
37-
offset: self.start_address() + offset,
38-
size: mem::size_of::<T>(),
39-
mode: AccessMode::Read,
40-
object: "[..]".into(),
41-
member: Some(format!("[{}]", index).into()),
42-
})
32+
T::read_object(memory, self.start_address() + offset)
4333
}
4434

45-
pub fn elements(
35+
pub fn elements<M: MemoryView>(
4636
&self,
47-
memory: &dyn MemoryView,
37+
memory: &M,
4838
range: Range<usize>,
49-
) -> Result<Vec<T>, AccessError> {
39+
) -> Result<Vec<T>, MemoryDecodeError<M::AccessError, T::DecodeError>> {
5040
let element_count = range.end - range.start;
5141
let mut result = Vec::with_capacity(element_count);
5242

53-
unsafe {
54-
let buffer = slice::from_raw_parts_mut(
55-
result.as_mut_ptr() as *mut u8,
56-
element_count * mem::size_of::<T>(),
57-
);
58-
let offset = self.start_address() + (range.start * mem::size_of::<T>()) as u64;
59-
60-
memory
61-
.read_memory(offset, buffer)
62-
.map_err(|err| AccessError {
63-
source: err,
64-
offset,
65-
size: buffer.len(),
66-
mode: AccessMode::Read,
67-
object: "[..]".into(),
68-
member: Some(format!("[{:#?}]", range).into()),
69-
})?;
70-
71-
result.set_len(element_count);
72-
};
43+
for index in range {
44+
result.push(self.element_at(memory, index)?);
45+
}
7346

7447
Ok(result)
7548
}
7649
}
7750

78-
impl<T: ?Sized + Viewable<T>> dyn Array<T> {
79-
pub fn element_reference(&self, memory: Arc<dyn MemoryView>, index: usize) -> Reference<T> {
80-
let offset = (index * T::MEMORY_SIZE) as u64;
51+
impl<T: SizedViewable> dyn Array<T> {
52+
pub fn element_reference<M: MemoryView>(&self, memory: M, index: usize) -> Reference<T, M> {
53+
let offset = (index * T::memory_size()) as u64;
8154
Reference::new(memory, self.start_address() + offset)
8255
}
8356

84-
pub fn elements_reference(
57+
pub fn elements_reference<M: MemoryView + Clone>(
8558
&self,
86-
memory: Arc<dyn MemoryView>,
59+
memory: M,
8760
range: Range<usize>,
88-
) -> Vec<Reference<T>> {
61+
) -> Vec<Reference<T, M>> {
8962
Vec::from_iter(range.map(|index| {
9063
Reference::new(
9164
memory.clone(),
92-
self.start_address() + (index * T::MEMORY_SIZE) as u64,
65+
self.start_address() + (index * T::memory_size()) as u64,
9366
)
9467
}))
9568
}
96-
}
9769

98-
impl<T: ?Sized + Viewable<T>> dyn Array<T>
99-
where
100-
T::Implementation<T::Memory>: marker::Copy,
101-
{
102-
pub fn element_copy(
70+
pub fn element_copy<M: MemoryView>(
10371
&self,
104-
memory: &dyn MemoryView,
72+
memory: &M,
10573
index: usize,
106-
) -> Result<Copy<T>, AccessError> {
107-
let offset = (index * T::MEMORY_SIZE) as u64;
108-
Copy::read_object(memory, self.start_address() + offset).map_err(|err| AccessError {
109-
source: err,
110-
offset: self.start_address() + offset,
111-
size: T::MEMORY_SIZE,
112-
mode: AccessMode::Read,
113-
object: format!("[{}]", T::name()).into(),
114-
member: Some(format!("[{}]", index).into()),
115-
})
74+
) -> Result<Copy<T>, M::AccessError> {
75+
let offset = (index * T::memory_size()) as u64;
76+
Copy::read_from_memory(memory, self.start_address() + offset)
11677
}
11778

118-
pub fn elements_copy(
79+
pub fn elements_copy<M: MemoryView>(
11980
&self,
120-
memory: &dyn MemoryView,
81+
memory: &M,
12182
range: Range<usize>,
122-
) -> Result<Vec<Copy<T>>, AccessError> {
83+
) -> Result<Vec<Copy<T>>, M::AccessError> {
12384
let element_count = range.end - range.start;
12485
let mut result = Vec::<T::Memory>::with_capacity(element_count);
12586

12687
unsafe {
12788
let buffer = slice::from_raw_parts_mut(
12889
result.as_mut_ptr() as *mut u8,
129-
element_count * T::MEMORY_SIZE,
90+
element_count * T::memory_size(),
13091
);
131-
let offset = self.start_address() + (range.start * T::MEMORY_SIZE) as u64;
132-
133-
memory
134-
.read_memory(offset, buffer)
135-
.map_err(|err| AccessError {
136-
source: err,
137-
offset,
138-
size: buffer.len(),
139-
mode: AccessMode::Read,
140-
object: "[..]".into(),
141-
member: Some(format!("[{:#?}]", range).into()),
142-
})?;
143-
92+
let offset = self.start_address() + (range.start * T::memory_size()) as u64;
93+
memory.read_memory(offset, buffer)?;
14494
result.set_len(element_count);
14595
};
14696

14797
Ok(result.into_iter().map(Copy::<T>::new).collect::<Vec<_>>())
14898
}
14999
}
150100

151-
pub trait SizedArray<T: ?Sized, const N: usize>: Array<T> {}
101+
pub trait SizedArray<T, const N: usize>: Array<T> {}
152102

153-
impl<T: ?Sized, const N: usize> dyn SizedArray<T, N> {
103+
impl<T, const N: usize> dyn SizedArray<T, N> {
154104
pub fn len(&self) -> usize {
155105
N
156106
}

raw_struct/src/builtins/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
mod array;
2-
mod ptr;
3-
42
pub use array::{
53
Array,
64
SizedArray,
75
};
6+
7+
mod ptr;
88
pub use ptr::Ptr64;

0 commit comments

Comments
 (0)