Skip to content

Commit f5d0993

Browse files
aritkulovaArvolear
andauthored
ArrayConverter added (#50)
* ArrayConverter added Coverage 100% * Updated ArrayConverter Added assembly for better performance * Update ArrayConverter.sol * cleaned up --------- Co-authored-by: Artem Chystiakov <artem.ch31@gmail.com>
1 parent 40d2c81 commit f5d0993

File tree

3 files changed

+455
-0
lines changed

3 files changed

+455
-0
lines changed

contracts/libs/utils/TypeCaster.sol

Lines changed: 356 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,11 @@ library TypeCaster {
8383
array_[0] = from_;
8484
}
8585

86+
function asSingletonArray(bool from_) internal pure returns (bool[] memory array_) {
87+
array_ = new bool[](1);
88+
array_[0] = from_;
89+
}
90+
8691
function asSingletonArray(string memory from_) internal pure returns (string[] memory array_) {
8792
array_ = new string[](1);
8893
array_[0] = from_;
@@ -92,4 +97,355 @@ library TypeCaster {
9297
array_ = new bytes32[](1);
9398
array_[0] = from_;
9499
}
100+
101+
/**
102+
* @notice The function to convert static array to dynamic
103+
* @param static_ the static array to convert
104+
* @return dynamic_ the converted dynamic array
105+
*/
106+
function asDynamic(
107+
uint256[1] memory static_
108+
) internal pure returns (uint256[] memory dynamic_) {
109+
return asSingletonArray(static_[0]);
110+
}
111+
112+
function asDynamic(
113+
uint256[2] memory static_
114+
) internal pure returns (uint256[] memory dynamic_) {
115+
dynamic_ = new uint256[](2);
116+
117+
uint256 pointerS_;
118+
uint256 pointerD_;
119+
120+
assembly {
121+
pointerS_ := static_
122+
pointerD_ := dynamic_
123+
}
124+
125+
_copy(pointerS_, pointerD_, 2);
126+
}
127+
128+
function asDynamic(
129+
uint256[3] memory static_
130+
) internal pure returns (uint256[] memory dynamic_) {
131+
dynamic_ = new uint256[](3);
132+
133+
uint256 pointerS_;
134+
uint256 pointerD_;
135+
136+
assembly {
137+
pointerS_ := static_
138+
pointerD_ := dynamic_
139+
}
140+
141+
_copy(pointerS_, pointerD_, 3);
142+
}
143+
144+
function asDynamic(
145+
uint256[4] memory static_
146+
) internal pure returns (uint256[] memory dynamic_) {
147+
dynamic_ = new uint256[](4);
148+
149+
uint256 pointerS_;
150+
uint256 pointerD_;
151+
152+
assembly {
153+
pointerS_ := static_
154+
pointerD_ := dynamic_
155+
}
156+
157+
_copy(pointerS_, pointerD_, 4);
158+
}
159+
160+
function asDynamic(
161+
uint256[5] memory static_
162+
) internal pure returns (uint256[] memory dynamic_) {
163+
dynamic_ = new uint256[](5);
164+
165+
uint256 pointerS_;
166+
uint256 pointerD_;
167+
168+
assembly {
169+
pointerS_ := static_
170+
pointerD_ := dynamic_
171+
}
172+
173+
_copy(pointerS_, pointerD_, 5);
174+
}
175+
176+
function asDynamic(
177+
address[1] memory static_
178+
) internal pure returns (address[] memory dynamic_) {
179+
return asSingletonArray(static_[0]);
180+
}
181+
182+
function asDynamic(
183+
address[2] memory static_
184+
) internal pure returns (address[] memory dynamic_) {
185+
dynamic_ = new address[](2);
186+
187+
uint256 pointerS_;
188+
uint256 pointerD_;
189+
190+
assembly {
191+
pointerS_ := static_
192+
pointerD_ := dynamic_
193+
}
194+
195+
_copy(pointerS_, pointerD_, 2);
196+
}
197+
198+
function asDynamic(
199+
address[3] memory static_
200+
) internal pure returns (address[] memory dynamic_) {
201+
dynamic_ = new address[](3);
202+
203+
uint256 pointerS_;
204+
uint256 pointerD_;
205+
206+
assembly {
207+
pointerS_ := static_
208+
pointerD_ := dynamic_
209+
}
210+
211+
_copy(pointerS_, pointerD_, 3);
212+
}
213+
214+
function asDynamic(
215+
address[4] memory static_
216+
) internal pure returns (address[] memory dynamic_) {
217+
dynamic_ = new address[](4);
218+
219+
uint256 pointerS_;
220+
uint256 pointerD_;
221+
222+
assembly {
223+
pointerS_ := static_
224+
pointerD_ := dynamic_
225+
}
226+
227+
_copy(pointerS_, pointerD_, 4);
228+
}
229+
230+
function asDynamic(
231+
address[5] memory static_
232+
) internal pure returns (address[] memory dynamic_) {
233+
dynamic_ = new address[](5);
234+
235+
uint256 pointerS_;
236+
uint256 pointerD_;
237+
238+
assembly {
239+
pointerS_ := static_
240+
pointerD_ := dynamic_
241+
}
242+
243+
_copy(pointerS_, pointerD_, 5);
244+
}
245+
246+
function asDynamic(bool[1] memory static_) internal pure returns (bool[] memory dynamic_) {
247+
return asSingletonArray(static_[0]);
248+
}
249+
250+
function asDynamic(bool[2] memory static_) internal pure returns (bool[] memory dynamic_) {
251+
dynamic_ = new bool[](2);
252+
253+
uint256 pointerS_;
254+
uint256 pointerD_;
255+
256+
assembly {
257+
pointerS_ := static_
258+
pointerD_ := dynamic_
259+
}
260+
261+
_copy(pointerS_, pointerD_, 2);
262+
}
263+
264+
function asDynamic(bool[3] memory static_) internal pure returns (bool[] memory dynamic_) {
265+
dynamic_ = new bool[](3);
266+
267+
uint256 pointerS_;
268+
uint256 pointerD_;
269+
270+
assembly {
271+
pointerS_ := static_
272+
pointerD_ := dynamic_
273+
}
274+
275+
_copy(pointerS_, pointerD_, 3);
276+
}
277+
278+
function asDynamic(bool[4] memory static_) internal pure returns (bool[] memory dynamic_) {
279+
dynamic_ = new bool[](4);
280+
281+
uint256 pointerS_;
282+
uint256 pointerD_;
283+
284+
assembly {
285+
pointerS_ := static_
286+
pointerD_ := dynamic_
287+
}
288+
289+
_copy(pointerS_, pointerD_, 4);
290+
}
291+
292+
function asDynamic(bool[5] memory static_) internal pure returns (bool[] memory dynamic_) {
293+
dynamic_ = new bool[](5);
294+
295+
uint256 pointerS_;
296+
uint256 pointerD_;
297+
298+
assembly {
299+
pointerS_ := static_
300+
pointerD_ := dynamic_
301+
}
302+
303+
_copy(pointerS_, pointerD_, 5);
304+
}
305+
306+
function asDynamic(string[1] memory static_) internal pure returns (string[] memory dynamic_) {
307+
return asSingletonArray(static_[0]);
308+
}
309+
310+
function asDynamic(string[2] memory static_) internal pure returns (string[] memory dynamic_) {
311+
dynamic_ = new string[](2);
312+
313+
uint256 pointerS_;
314+
uint256 pointerD_;
315+
316+
assembly {
317+
pointerS_ := static_
318+
pointerD_ := dynamic_
319+
}
320+
321+
_copy(pointerS_, pointerD_, 2);
322+
}
323+
324+
function asDynamic(string[3] memory static_) internal pure returns (string[] memory dynamic_) {
325+
dynamic_ = new string[](3);
326+
327+
uint256 pointerS_;
328+
uint256 pointerD_;
329+
330+
assembly {
331+
pointerS_ := static_
332+
pointerD_ := dynamic_
333+
}
334+
335+
_copy(pointerS_, pointerD_, 3);
336+
}
337+
338+
function asDynamic(string[4] memory static_) internal pure returns (string[] memory dynamic_) {
339+
dynamic_ = new string[](4);
340+
341+
uint256 pointerS_;
342+
uint256 pointerD_;
343+
344+
assembly {
345+
pointerS_ := static_
346+
pointerD_ := dynamic_
347+
}
348+
349+
_copy(pointerS_, pointerD_, 4);
350+
}
351+
352+
function asDynamic(string[5] memory static_) internal pure returns (string[] memory dynamic_) {
353+
dynamic_ = new string[](5);
354+
355+
uint256 pointerS_;
356+
uint256 pointerD_;
357+
358+
assembly {
359+
pointerS_ := static_
360+
pointerD_ := dynamic_
361+
}
362+
363+
_copy(pointerS_, pointerD_, 5);
364+
}
365+
366+
function asDynamic(
367+
bytes32[1] memory static_
368+
) internal pure returns (bytes32[] memory dynamic_) {
369+
return asSingletonArray(static_[0]);
370+
}
371+
372+
function asDynamic(
373+
bytes32[2] memory static_
374+
) internal pure returns (bytes32[] memory dynamic_) {
375+
dynamic_ = new bytes32[](2);
376+
377+
uint256 pointerS_;
378+
uint256 pointerD_;
379+
380+
assembly {
381+
pointerS_ := static_
382+
pointerD_ := dynamic_
383+
}
384+
385+
_copy(pointerS_, pointerD_, 2);
386+
}
387+
388+
function asDynamic(
389+
bytes32[3] memory static_
390+
) internal pure returns (bytes32[] memory dynamic_) {
391+
dynamic_ = new bytes32[](3);
392+
393+
uint256 pointerS_;
394+
uint256 pointerD_;
395+
396+
assembly {
397+
pointerS_ := static_
398+
pointerD_ := dynamic_
399+
}
400+
401+
_copy(pointerS_, pointerD_, 3);
402+
}
403+
404+
function asDynamic(
405+
bytes32[4] memory static_
406+
) internal pure returns (bytes32[] memory dynamic_) {
407+
dynamic_ = new bytes32[](4);
408+
409+
uint256 pointerS_;
410+
uint256 pointerD_;
411+
412+
assembly {
413+
pointerS_ := static_
414+
pointerD_ := dynamic_
415+
}
416+
417+
_copy(pointerS_, pointerD_, 4);
418+
}
419+
420+
function asDynamic(
421+
bytes32[5] memory static_
422+
) internal pure returns (bytes32[] memory dynamic_) {
423+
dynamic_ = new bytes32[](5);
424+
425+
uint256 pointerS_;
426+
uint256 pointerD_;
427+
428+
assembly {
429+
pointerS_ := static_
430+
pointerD_ := dynamic_
431+
}
432+
433+
_copy(pointerS_, pointerD_, 5);
434+
}
435+
436+
function _copy(uint256 locationS_, uint256 locationD_, uint256 length_) private pure {
437+
assembly {
438+
for {
439+
let i := 0
440+
} lt(i, length_) {
441+
i := add(i, 1)
442+
} {
443+
locationD_ := add(locationD_, 0x20)
444+
445+
mstore(locationD_, mload(locationS_))
446+
447+
locationS_ := add(locationS_, 0x20)
448+
}
449+
}
450+
}
95451
}

0 commit comments

Comments
 (0)