4 #include <string.h> /* for memmove() mostly */
5 #include <errno.h> /* errno values */
8 /* this typedef lets the standard T_PTROBJ typemap handle the
9 conversion between perl class and C type and back again */
10 typedef poe_queue *POE__XS__Queue__Array;
12 /* This gives us our new method and correct destruction */
13 #define pq_new(class) pq_create()
14 #define pq_DESTROY(pq) pq_delete(pq)
16 MODULE = POE::XS::Queue::Array PACKAGE = POE::XS::Queue::Array PREFIX = pq_
25 POE::XS::Queue::Array pq
28 pq_enqueue(pq, priority, payload)
29 POE::XS::Queue::Array pq
35 POE::XS::Queue::Array pq
37 pq_priority_t priority;
41 if (pq_dequeue_next(pq, &priority, &id, &payload)) {
43 PUSHs(sv_2mortal(newSVnv(priority)));
44 PUSHs(sv_2mortal(newSViv(id)));
45 PUSHs(sv_2mortal(payload));
49 pq_get_next_priority(pq)
50 POE::XS::Queue::Array pq
52 pq_priority_t priority;
54 if (pq_get_next_priority(pq, &priority)) {
55 RETVAL = newSVnv(priority); /* XS will mortalize this for us */
58 RETVAL = &PL_sv_undef;
65 POE::XS::Queue::Array pq
68 pq_remove_item(pq, id, filter)
69 POE::XS::Queue::Array pq
75 if (pq_remove_item(pq, id, filter, &removed)) {
77 PUSHs(sv_2mortal(newSVnv(removed.priority)));
78 PUSHs(sv_2mortal(newSViv(removed.id)));
79 PUSHs(sv_2mortal(removed.payload));
83 pq_remove_items(pq, filter, ...)
84 POE::XS::Queue::Array pq
88 pq_entry *removed_entries = NULL;
93 max_count = SvIV(ST(2));
95 max_count = pq_get_item_count(pq);
96 removed_count = pq_remove_items(pq, filter, max_count,
99 EXTEND(SP, removed_count);
100 for (i = 0; i < removed_count; ++i) {
101 pq_entry *entry = removed_entries + i;
105 av_store(av, 0, newSVnv(entry->priority));
106 av_store(av, 1, newSViv(entry->id));
107 av_store(av, 2, entry->payload);
108 rv = newRV_noinc((SV *)av);
109 PUSHs(sv_2mortal(rv));
113 free(removed_entries);
116 pq_adjust_priority(pq, id, filter, delta)
117 POE::XS::Queue::Array pq
122 pq_priority_t new_priority;
124 if (pq_adjust_priority(pq, id, filter, delta, &new_priority)) {
126 PUSHs(sv_2mortal(newSVnv(new_priority)));
130 pq_set_priority(pq, id, filter, new_priority)
131 POE::XS::Queue::Array pq
136 if (pq_set_priority(pq, id, filter, new_priority)) {
138 PUSHs(sv_2mortal(newSVnv(new_priority)));
142 pq_peek_items(pq, filter, ...)
143 POE::XS::Queue::Array pq
151 max_count = SvIV(ST(2));
153 max_count = pq_get_item_count(pq);
154 count = pq_peek_items(pq, filter, max_count, &ret_items);
157 for (i = 0; i < count; ++i) {
158 pq_entry *entry = ret_items + i;
162 av_store(av, 0, newSVnv(entry->priority));
163 av_store(av, 1, newSViv(entry->id));
164 av_store(av, 2, newSVsv(entry->payload));
165 rv = newRV_noinc((SV *)av);
166 PUSHs(sv_2mortal(rv));
173 POE::XS::Queue::Array pq