1313--- @ignore
1414--- @generic T
1515--- @class atArray <T >
16- --- @field private m_address pointer
16+ --- @field protected m_ptr pointer
1717--- @field private m_data_ptr pointer
18+ --- @field private m_data array<pointer_ref<T>>
1819--- @field private m_size uint16_t
19- --- @field private m_count uint16_t
20- --- @field private m_data array<pointer>
20+ --- @field private m_capacity uint16_t
2121--- @field private m_data_type any
22- --- @field private m_last_update_time TimePoint
2322--- @overload fun ( address : pointer , data_type ?: any ): atArray
2423local atArray = {
2524 __type = " atArray" ,
@@ -35,46 +34,44 @@ setmetatable(atArray, {
3534})
3635
3736--- @generic T
38- --- @param address pointer
37+ --- @param ptr pointer
3938--- @param data_type optional<T>
4039--- @return atArray<T>
41- function atArray .new (address , data_type )
40+ function atArray .new (ptr , data_type )
4241 local instance = setmetatable ({
43- m_address = nullptr ,
42+ m_ptr = ptr ,
4443 m_data_ptr = nullptr ,
45- m_size = 0x0 ,
46- m_count = 0x0 ,
44+ m_size = 0 ,
45+ m_capacity = 0 ,
4746 m_data = {},
4847 m_data_type = nil
49- --- @diagnostic disable-next-line
48+ --- @diagnostic disable-next-line : param-type-mismatch
5049 }, atArray )
5150
52- if not ( IsInstance ( address , " pointer " ) and address : is_valid ()) then
51+ if ( ptr : is_null ()) then
5352 return instance
5453 end
5554
56- local array_size = address :add (0x8 ):get_word ()
55+ local array_size = ptr :add (0x8 ):get_word ()
5756 if (array_size == 0 ) then
5857 return instance
5958 end
6059
61- instance .m_address = address
62- instance .m_data_ptr = address :deref ()
63- instance .m_size = array_size
64- instance .m_count = address :add (0xA ):get_word ()
65- instance .m_data_type = data_type
66- instance .m_last_update_time = TimePoint :new ()
60+ instance .m_data_ptr = ptr :deref ()
61+ instance .m_size = array_size
62+ instance .m_capacity = ptr :add (0x10 ):get_word ()
63+ instance .m_data_type = data_type
6764
6865 for i = 0 , array_size - 1 do
69- instance .m_data [i + 1 ] = instance .m_data_ptr :add (i * 0x8 ): deref ()
66+ instance .m_data [i + 1 ] = instance .m_data_ptr :add (i * 0x8 )
7067 end
7168
7269 return instance
7370end
7471
7572--- @return boolean
7673function atArray :IsValid ()
77- return self .m_address :is_valid () and self .m_data_ptr :is_valid ()
74+ return self .m_ptr :is_valid () and self .m_data_ptr :is_valid ()
7875end
7976
8077--- @return boolean
8481
8582--- @return boolean
8683function atArray :IsEmpty ()
87- self :Update ()
8884 return self .m_size == 0
8985end
9086
9187function atArray :Clear ()
92- self .m_address = nullptr
88+ self .m_ptr = nullptr
9389 self .m_data_ptr = nullptr
90+ self .m_size = 0
91+ self .m_capacity = 0
9492 self .m_data = {}
95- self .m_size = 0x0
96- self .m_count = 0x0
9793 self .m_data_type = nil
98- self .m_last_update_time :Reset ()
99- end
100-
101- function atArray :Update ()
102- if not self :IsValid () then
103- return
104- end
105-
106- if not self .m_last_update_time :HasElapsed (250 ) then
107- return
108- end
109-
110- self .m_size = self .m_address :add (0x8 ):get_word ()
111- self .m_count = self .m_address :add (0xA ):get_word ()
112- if (self .m_size == 0 ) then
113- self .m_data = {}
114- self .m_last_update_time :Reset ()
115- return
116- end
117-
118- for i = 0 , self .m_size - 1 do
119- self .m_data [i + 1 ] = self .m_data_ptr :add (i * 0x8 ):deref ()
120- end
121-
122- self .m_last_update_time :Reset ()
12394end
12495
12596--- @return pointer | nil
12697function atArray :GetPointer ()
127- if not self :IsValid () then
98+ if ( not self :IsValid () ) then
12899 return
129100 end
130101
131- return self .m_address
102+ return self .m_ptr
132103end
133104
134105--- @return pointer | nil
135106function atArray :GetDataPointer ()
136- if not self :IsValid () then
107+ if ( not self :IsValid () ) then
137108 return
138109 end
139110
@@ -142,94 +113,72 @@ end
142113
143114--- @return uint64_t
144115function atArray :GetAddress ()
145- return self :IsValid () and self .m_address :get_address () or 0x0
116+ return self :IsValid () and self .m_ptr :get_address () or 0x0
146117end
147118
148119--- @return uint64_t
149120function atArray :GetDataAddress ()
150121 return self :IsValid () and self .m_data_ptr :get_address () or 0x0
151122end
152123
153- --- @return uint16_t
154- function atArray :Size ()
155- self :Update ()
156- return self .m_size
157- end
158-
159- --- @return uint16_t
160- function atArray :Count ()
161- self :Update ()
162- return self .m_count
163- end
164-
165- --- @return uint16_t
166- function atArray :DataSize ()
167- return SizeOf (self .m_data )
168- end
169-
170124--- @return string
171- function atArray :DataType ()
125+ function atArray :GetDataType ()
172126 local _t = " unknonwn"
173- if (self .m_data_type and IsInstance ( self .m_data_type .__type , " string " ) ) then
127+ if (type ( self .m_data_type ) == " table " and self .m_data_type .__type ) then
174128 _t = self .m_data_type .__type
175129 end
176130
177131 return _F (" pointer<%s>" , _t )
178132end
179133
180- --- @param i number
181- --- @return pointer
182- function atArray :Get (i )
183- self :Update ()
134+ --- @param i integer
135+ --- @return pointer<T>
136+ function atArray :At (i )
184137 assert (math .is_inrange (i , 1 , self .m_size ), " [atArray]: Index out of bounds!" )
185- return self .m_data [i ]
138+ return self .m_data [i ]: deref ()
186139end
187140
188- --- @param i number
189- --- @param v pointer
190- function atArray :Set (i , v )
191- self :Update ()
192- assert (math .is_inrange (i , 1 , self .m_size ), " [atArray]: Index out of bounds!" )
193- assert (IsInstance (v , " pointer" ), " [atArray]: Attempt to set array value to non-pointer value!" )
141+ --- @return uint16_t
142+ function atArray :Size ()
143+ return self .m_size
144+ end
194145
195- self .m_data [i ] = v
146+ --- @return uint16_t
147+ function atArray :Capacity ()
148+ return self .m_capacity
196149end
197150
198- --- @return fun (): integer , pointer Iterator
151+ -- NOTE: As opposed to the `At` method, you must dereference the pointers returned by this iterator.
152+ --- @return fun (): integer , pointer_ref<T> Iterator
199153function atArray :Iter ()
200- self :Update ()
201154 local i = 0
202-
203155 return function ()
204156 i = i + 1
205- if i <= self .m_size then
157+ if ( i <= self .m_size ) then
206158 return i , self .m_data [i ]
207159 --- @diagnostic disable-next-line : missing-return
208160 end
209161 end
210162end
211163
164+ --- @return fun (): integer , pointer<T> Iterator
212165function atArray :__pairs ()
213166 log .warning (" [atArray]: Use of pairs! Please use atArray:Iter() instead." )
214167 return self :Iter ()
215168end
216169
217170--- @return integer
218171function atArray :__len ()
219- self :Update ()
220172 return self .m_size
221173end
222174
223175--- @return string
224176function atArray :__tostring ()
225- self :Update ()
226177 local buffer = " "
227- local data_type = self :DataType ()
228-
178+ local __type = self :GetDataType ()
229179 for i , data in self :Iter () do
230- buffer = buffer .. _F (" \n [%d] %s @ 0x%X>" , i , data_type , data :get_address ())
180+ buffer = buffer .. _F (" \n [%d] %s* @ 0x%X>" , i , __type , data :get_address ())
231181 end
232-
233182 return buffer
234183end
235184
0 commit comments