When deserializing, zeroes should become the default value in the array to make sure it's sparse.
diff --git a/src/hyper.erl b/src/hyper.erl
index fcfbe46..a6d5181 100644
--- a/src/hyper.erl
+++ b/src/hyper.erl
@@ -120,11 +120,16 @@
from_json({Struct}) ->
P = proplists:get_value(<<"p">>, Struct),
M = trunc(math:pow(2, P)),
- Registers = array:fix(
- array:resize(
- M, array:from_list(
- decode_registers(proplists:get_value(<<"registers">>, Struct)),
- 0))),
+
+ EmptyArray = array:new([{size, M}, {fixed, true}, {default, 0}]),
+ {_, Registers} = lists:foldl(fun (0, {I, A}) ->
+ {I+1, A};
+ (V, {I, A}) ->
+ {I+1, array:set(I, V, A)}
+ end,
+ {0, EmptyArray},
+ decode_registers(
+ proplists:get_value(<<"registers">>, Struct))),
#hyper{p = P, registers = Registers}.
@@ -197,8 +202,9 @@
serialization_test() ->
- Hyper = insert_many(generate_unique(1024), new(14)),
- ?assertEqual(trunc(card(Hyper)), trunc(card(from_json(to_json(Hyper))))).
+ Hyper = insert_many(generate_unique(10), new(14)),
+ ?assertEqual(trunc(card(Hyper)), trunc(card(from_json(to_json(Hyper))))),
+ ?assertEqual(Hyper, from_json(to_json(Hyper))).
encoding_test() ->
Hyper = insert_many(generate_unique(100000), new(14)),