1010 Any , Generic , Iterator , Optional , Tuple , Type , TypeVar , Union
1111)
1212
13- from _pointers import add_ref , remove_ref
13+ from typing_extensions import final
14+
15+ from _pointers import add_ref , handle , remove_ref
1416
1517from ._utils import deref , force_set_attr , move_to_mem
1618from .constants import NULL , Nullable
@@ -54,19 +56,22 @@ def __repr__(self) -> str:
5456 def __rich__ (self ):
5557 ...
5658
59+ @final
5760 def __str__ (self ) -> str :
5861 return hex (self .address or 0 )
5962
6063 @abstractmethod
6164 def _cleanup (self ) -> None :
6265 ...
6366
67+ @final
6468 def __eq__ (self , data : object ) -> bool :
6569 if not isinstance (data , BasePointer ):
6670 return False
6771
6872 return data .address == self .address
6973
74+ @final
7075 def ensure (self ) -> int :
7176 """Ensure that the pointer is not null.
7277
@@ -91,20 +96,23 @@ def ensure(self) -> int:
9196
9297class Movable (ABC , Generic [T , A ]):
9398 @abstractmethod
94- def move (
99+ def _move (
95100 self ,
96101 data : Union [A , T ],
97102 * ,
98103 unsafe : bool = False ,
99104 ) -> None :
100- """Move data to the target address.
101-
102- Args:
103- data: Pointer or object to move into the current data.
104- unsafe: Should buffer overflows be allowed.
105- """
106105 ...
107106
107+ @final
108+ def move (
109+ self ,
110+ data : Union [A , T ],
111+ * ,
112+ unsafe : bool = False ,
113+ ) -> None :
114+ handle (self ._move , (data ,), {"unsafe" : unsafe })
115+
108116 def __ilshift__ (self , data : Union [A , T ]):
109117 self .move (data )
110118 return self
@@ -118,13 +126,18 @@ class Dereferencable(ABC, Generic[T]):
118126 """Abstract class for an object that may be dereferenced."""
119127
120128 @abstractmethod
129+ def _dereference (self ) -> T :
130+ ...
131+
132+ @final
121133 def dereference (self ) -> T :
122134 """Dereference the pointer.
123135
124136 Returns:
125137 Value at the pointers address."""
126- ...
138+ return handle ( self . _dereference )
127139
140+ @final
128141 def __invert__ (self ) -> T :
129142 """Dereference the pointer."""
130143 return self .dereference ()
@@ -163,19 +176,10 @@ def __repr__(self) -> str:
163176 def __rich__ (self ):
164177 ...
165178
166- def __str__ (self ) -> str :
167- return hex (self .address or 0 )
168-
169179 @abstractmethod
170180 def _cleanup (self ) -> None :
171181 ...
172182
173- def __eq__ (self , data : object ) -> bool :
174- if not isinstance (data , BasePointer ):
175- return False
176-
177- return data .address == self .address
178-
179183
180184class Typed (ABC , Generic [T ]):
181185 """Base class for a pointer that has a type attribute."""
@@ -295,7 +299,7 @@ def assign(
295299 def address (self ) -> Optional [int ]:
296300 return self ._address
297301
298- def dereference (self ) -> T :
302+ def _dereference (self ) -> T :
299303 return deref (self .ensure ())
300304
301305 def __irshift__ (
@@ -362,7 +366,7 @@ def _make_stream_and_ptr(
362366 bytes_a = (ctypes .c_ubyte * size ).from_address (address )
363367 return self .make_ct_pointer (), bytes (bytes_a )
364368
365- def move (
369+ def _move (
366370 self ,
367371 data : Union ["BaseCPointer[T]" , T ],
368372 * ,
@@ -432,7 +436,7 @@ def assigned(self) -> bool:
432436 def assigned (self , value : bool ) -> None :
433437 self ._assigned = value
434438
435- def move (
439+ def _move (
436440 self ,
437441 data : Union [BasePointer [T ], T ],
438442 unsafe : bool = False ,
@@ -452,7 +456,7 @@ def move(
452456 self .assigned = True
453457 remove_ref (data )
454458
455- def dereference (self ) -> T :
459+ def _dereference (self ) -> T :
456460 if self .freed :
457461 raise FreedMemoryError (
458462 "cannot dereference memory that has been freed" ,
0 commit comments