Files
academy2/modules/meshops/queue.cpp
2021-07-31 03:37:28 +03:00

97 lines
2.3 KiB
C++

#include <cstdio>
#include "queue.h"
DelayedQueue::DelayedQueue()
{
default_func = "";
default_obj = NULL;
}
void DelayedQueue::_bind_methods()
{
ClassDB::bind_method(D_METHOD("push_back", "item"),
&DelayedQueue::push_back);
ClassDB::bind_method(D_METHOD("push_front", "item"),
&DelayedQueue::push_front);
ClassDB::bind_method(D_METHOD("pop_front"),
&DelayedQueue::pop_front);
ClassDB::bind_method(D_METHOD("push_back_delayed", "item"),
&DelayedQueue::push_back_delayed);
ClassDB::bind_method(D_METHOD("register_callback", "item_name", "obj", "func"),
&DelayedQueue::register_callback);
ClassDB::bind_method(D_METHOD("register_default_callback", "obj", "func"),
&DelayedQueue::register_default_callback);
ClassDB::bind_method(D_METHOD("unregister_callback", "item_name"),
&DelayedQueue::unregister_callback);
ClassDB::bind_method(D_METHOD("process"),
&DelayedQueue::process);
}
void DelayedQueue::push_back(const Dictionary &data)
{
queue.push_back(data);
}
void DelayedQueue::push_front(const Dictionary &data)
{
queue.push_front(data);
}
Dictionary DelayedQueue::pop_front()
{
Dictionary ret = queue[0];
queue.pop_front();
return ret;
}
void DelayedQueue::push_back_delayed(const Dictionary &data)
{
queue_delayed.push_back(data);
}
void DelayedQueue::register_callback(const StringName &item_name, Object *obj, const StringName &func)
{
struct _reg r;
r.name = item_name;
r.obj = obj;
r.func = func;
reg[item_name] = r;
}
void DelayedQueue::register_default_callback(Object *obj, const StringName &func)
{
default_obj = obj;
default_func = func;
}
void DelayedQueue::unregister_callback(const StringName &item_name)
{
reg.erase(item_name);
}
void DelayedQueue::process()
{
while (queue.size() > 0 || queue_delayed.size() > 0) {
if (queue.size() == 0) {
queue.push_back(queue_delayed[0]);
queue_delayed.pop_front();
}
const Dictionary &item = queue[0];
const String &name = item["name"];
if (callbacks.has(name)) {
functor<Object, const Dictionary &> f = callbacks[name];
f(item);
}
else if (reg.has(name))
reg[name].obj->call(reg[name].func, item);
else {
if (default_callback) {
functor<Object, const Dictionary &> f = default_callback;
f(item);
}
if (default_obj)
default_obj->call(default_func, item);
}
queue.pop_front();
}
}