Skip to content

Commit 5684273

Browse files
committed
Add deep_copy script and tests
1 parent fc9571e commit 5684273

File tree

8 files changed

+178
-5
lines changed

8 files changed

+178
-5
lines changed

DeepCopy/DeepCopy.yyp

Lines changed: 5 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
var array = [
2+
new Class1(),
3+
[ [0], [1], [2] ],
4+
{ hmm : "hmm", huh : "huh", class : new Class2() }
5+
];
6+
7+
var struct = new Class3(
8+
new Class2(),
9+
new Class4(
10+
new Class4(
11+
[0, 1, 2],
12+
{ three : 3, four : 4, five : 5 }
13+
)
14+
)
15+
);
16+
17+
var new_araay = deep_copy(array);
18+
var new_struct = deep_copy(struct);
19+
20+
// Both have identival values
21+
show_debug_message(array);
22+
show_debug_message(struct);
23+
show_debug_message(new_araay);
24+
show_debug_message(new_struct);
25+
26+
// But not holding the same references
27+
show_debug_message(array == new_araay); // false
28+
show_debug_message(array[0] == new_araay[0]); // false
29+
show_debug_message(array[1] == new_araay[1]); // false
30+
show_debug_message(array[2] == new_araay[2]); // false
31+
show_debug_message(struct == new_struct); // false
32+
show_debug_message(struct.thing == new_struct.thing); // false
33+
show_debug_message(struct.stuff == new_struct.stuff); // false
34+
show_debug_message(struct.stuff.thing == new_struct.stuff.thing); // false

DeepCopy/objects/obj_deep_copy_test/obj_deep_copy_test.yy

Lines changed: 33 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

DeepCopy/rooms/Room1/Room1.yy renamed to DeepCopy/rooms/rm_test/rm_test.yy

Lines changed: 7 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/// @function deep_copy(ref)
2+
/// @param {T} ref Thing to deep copy
3+
/// @returns {T} New array, or new struct, or new instance of class, anything else (real / string / etc.) will be returned as-is
4+
/// @description Returns a deep recursive copy of the provided array / struct / constructed struct
5+
function deep_copy(ref) {
6+
var ref_new;
7+
8+
if (is_array(ref)) {
9+
ref_new = array_create(array_length(ref));
10+
11+
var length = array_length(ref_new);
12+
13+
for (var i = 0; i < length; i++) {
14+
ref_new[i] = deep_copy(ref[i]);
15+
}
16+
17+
return ref_new;
18+
}
19+
else if (is_struct(ref)) {
20+
var base = instanceof(ref);
21+
22+
switch (base) {
23+
case "struct":
24+
case "weakref":
25+
ref_new = {};
26+
break;
27+
28+
default:
29+
var constr = method(undefined, asset_get_index(base));
30+
ref_new = new constr();
31+
}
32+
33+
var names = variable_struct_get_names(ref);
34+
var length = variable_struct_names_count(ref);
35+
36+
for (var i = 0; i < length; i++) {
37+
var name = names[i];
38+
39+
variable_struct_set(ref_new, name, deep_copy(variable_struct_get(ref, name)));
40+
}
41+
42+
return ref_new;
43+
} else {
44+
return ref;
45+
}
46+
}
47+
48+
// GMEdit hint
49+
/// @hint deep_copy(ref:T)->T Returns a deep recursive copy of the provided array / struct / constructed struct

DeepCopy/scripts/deep_copy/deep_copy.yy

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
function Class1() constructor {
2+
static val = "hello!";
3+
4+
static func = function() {
5+
show_debug_message(val);
6+
}
7+
}
8+
9+
function Class2() : Class1() constructor {
10+
a = 0;
11+
b = 1;
12+
c = 2;
13+
}
14+
15+
function Class3(_thing, _stuff)constructor {
16+
thing = _thing;
17+
stuff = _stuff;
18+
}
19+
20+
function Class4(_thing) constructor {
21+
thing = argument[0];
22+
23+
if (argument_count > 1) {
24+
stuff = argument[1];
25+
}
26+
}

DeepCopy/scripts/deep_copy_test/deep_copy_test.yy

Lines changed: 12 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)