@@ -38,6 +38,42 @@ impl<T: ?Sized + 'static> Clone for Ptr64<T> {
3838}
3939impl < 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+
4177impl < 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
80120impl < 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
94138impl < 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
108156impl < 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
122174impl < T : ?Sized , const N : usize > Deref for Ptr64 < dyn SizedArray < T , N > > {
0 commit comments