Skip to content

Commit 36419d4

Browse files
committed
feat: adding more utility methods to Ptr64 and Array
1 parent e14f103 commit 36419d4

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

raw_struct/src/builtins/array.rs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,9 @@ use crate::{
2424

2525
pub trait Array<T: ?Sized> {
2626
fn start_address(&self) -> u64;
27+
fn len(&self) -> Option<usize>;
2728
}
2829

29-
pub trait SizedArray<T: ?Sized, const N: usize>: Array<T> {}
30-
3130
impl<T: FromMemoryView> dyn Array<T> {
3231
pub fn element_at(&self, memory: &dyn MemoryView, index: usize) -> Result<T, AccessError> {
3332
let offset = (index * mem::size_of::<T>()) as u64;
@@ -146,3 +145,11 @@ where
146145
Ok(result.into_iter().map(Copy::<T>::new).collect::<Vec<_>>())
147146
}
148147
}
148+
149+
pub trait SizedArray<T: ?Sized, const N: usize>: Array<T> {}
150+
151+
impl<T: ?Sized, const N: usize> dyn SizedArray<T, N> {
152+
pub fn len(&self) -> usize {
153+
N
154+
}
155+
}

raw_struct/src/builtins/ptr.rs

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,42 @@ impl<T: ?Sized + 'static> Clone for Ptr64<T> {
3838
}
3939
impl<T: ?Sized + 'static> marker::Copy for Ptr64<T> {}
4040

41+
impl<T: ?Sized> Ptr64<T> {
42+
pub fn is_null(&self) -> bool {
43+
self.address == 0
44+
}
45+
46+
pub fn cast<V: ?Sized>(&self) -> Ptr64<V> {
47+
Ptr64::<V> {
48+
address: self.address,
49+
_dummy: Default::default(),
50+
}
51+
}
52+
}
53+
54+
impl<T: marker::Copy> Ptr64<T> {
55+
/// Create a copy of the value the pointer points to
56+
#[must_use = "copied result must be used"]
57+
pub fn read_value(&self, memory: &dyn MemoryView) -> Result<Option<T>, AccessError> {
58+
if self.address > 0 {
59+
let memory = T::read_object(memory, self.address).map_err(|err| AccessError {
60+
source: err,
61+
62+
member: None,
63+
object: "T".into(),
64+
mode: AccessMode::Read,
65+
66+
offset: self.address,
67+
size: mem::size_of::<T>(),
68+
})?;
69+
70+
Ok(Some(memory))
71+
} else {
72+
Ok(None)
73+
}
74+
}
75+
}
76+
4177
impl<T: ?Sized + Viewable<T>> Ptr64<T> {
4278
#[must_use]
4379
pub fn value_reference(&self, memory: Arc<dyn MemoryView>) -> Option<Reference<T>> {
@@ -75,6 +111,10 @@ impl<T> Array<T> for Ptr64<[T]> {
75111
fn start_address(&self) -> u64 {
76112
self.address
77113
}
114+
115+
fn len(&self) -> Option<usize> {
116+
None
117+
}
78118
}
79119

80120
impl<T> Deref for Ptr64<[T]> {
@@ -89,6 +129,10 @@ impl<T, const N: usize> Array<T> for Ptr64<[T; N]> {
89129
fn start_address(&self) -> u64 {
90130
self.address
91131
}
132+
133+
fn len(&self) -> Option<usize> {
134+
Some(N)
135+
}
92136
}
93137

94138
impl<T, const N: usize> Deref for Ptr64<[T; N]> {
@@ -103,6 +147,10 @@ impl<T: ?Sized> Array<T> for Ptr64<dyn Array<T>> {
103147
fn start_address(&self) -> u64 {
104148
self.address
105149
}
150+
151+
fn len(&self) -> Option<usize> {
152+
None
153+
}
106154
}
107155

108156
impl<T: ?Sized> Deref for Ptr64<dyn Array<T>> {
@@ -117,6 +165,10 @@ impl<T: ?Sized, const N: usize> Array<T> for Ptr64<dyn SizedArray<T, N>> {
117165
fn start_address(&self) -> u64 {
118166
self.address
119167
}
168+
169+
fn len(&self) -> Option<usize> {
170+
Some(N)
171+
}
120172
}
121173

122174
impl<T: ?Sized, const N: usize> Deref for Ptr64<dyn SizedArray<T, N>> {

0 commit comments

Comments
 (0)