Parcourir la source

fixed hooks a bit

master
Felix Brendel il y a 5 ans
Parent
révision
524354075a
2 fichiers modifiés avec 49 ajouts et 12 suppressions
  1. +5
    -12
      hooks.hpp
  2. +44
    -0
      tests/main.cpp

+ 5
- 12
hooks.hpp Voir le fichier

@@ -49,7 +49,6 @@ struct Lambda<R(Args...)>
} }
}; };



struct Hook { struct Hook {
Array_List<Lambda<void()>> lambdas; Array_List<Lambda<void()>> lambdas;
Hook() { Hook() {
@@ -58,20 +57,14 @@ struct Hook {
~Hook () { ~Hook () {
lambdas.dealloc(); lambdas.dealloc();
} }
void operator<<(Lambda<void()> f) {
// FIXME(Felix): Why can I not call Array_List::append here??? Hallo?
if (lambdas.count == lambdas.length) {
lambdas.length *= 2;
lambdas.data = (Lambda<void()>*)realloc(lambdas.data, lambdas.length * sizeof(Lambda<void()>));
}
lambdas.data[lambdas.count] = f;
lambdas.count++;
void operator<<(Lambda<void()>&& f) {
lambdas.append(f);
} }
void operator()() { void operator()() {
while(lambdas.count --> 0) {
lambdas.data[lambdas.count]();
for (auto l : lambdas) {
l();
} }
lambdas.count = 0;
lambdas.clear();
} }
}; };




+ 44
- 0
tests/main.cpp Voir le fichier

@@ -560,6 +560,49 @@ auto test_array_list_sort_many() -> testresult {
return pass; return pass;
} }


auto test_hooks() -> testresult {
s32 a = 0;
s32 b = 0;
s32 c = 0;

Hook hook;
hook << [&]() {
a = 1;
};
hook << [&]() {
// NOTE(Felix): assert correct execution order
if (a == 1 && c == 0) {
b = 2;
}
};
hook << [&]() {
c = 3;
};

assert_equal_int(a, 0);
assert_equal_int(b, 0);
assert_equal_int(c, 0);

hook();

assert_equal_int(a, 1);
assert_equal_int(b, 2);
assert_equal_int(c, 3);

a = 0;
b = 0;
c = 0;

// NOTE(Felix): hook should be empty now
hook();

assert_equal_int(a, 0);
assert_equal_int(b, 0);
assert_equal_int(c, 0);

return pass;
}

s32 main(s32, char**) { s32 main(s32, char**) {
init_printer(); init_printer();
testresult result; testresult result;
@@ -571,6 +614,7 @@ s32 main(s32, char**) {
invoke_test(test_stack_array_lists); invoke_test(test_stack_array_lists);
invoke_test(test_bucket_allocator); invoke_test(test_bucket_allocator);
invoke_test(test_queue); invoke_test(test_queue);
invoke_test(test_hooks);


return 0; return 0;
} }

Chargement…
Annuler
Enregistrer