4 #include <string.h> /* for memmove() mostly */
5 #include <errno.h> /* errno values */
9 /* this typedef lets the standard T_PTROBJ typemap handle the
10 conversion between perl class and C type and back again */
11 typedef poe_queue *POE__XS__Queue__Array;
13 /* This gives us our new method and correct destruction */
14 #define pq_new(class) pq_create()
15 #define pq_DESTROY(pq) pq_delete(pq)
17 MODULE = POE::XS::Queue::Array PACKAGE = POE::XS::Queue::Array PREFIX = pq_
26 POE::XS::Queue::Array pq
29 pq_enqueue(pq, priority, payload)
30 POE::XS::Queue::Array pq
36 POE::XS::Queue::Array pq
38 pq_priority_t priority;
42 if (pq_dequeue_next(pq, &priority, &id, &payload)) {
44 PUSHs(sv_2mortal(newSVnv(priority)));
45 PUSHs(sv_2mortal(newSViv(id)));
46 PUSHs(sv_2mortal(payload));
50 pq_get_next_priority(pq)
51 POE::XS::Queue::Array pq
53 pq_priority_t priority;
55 if (pq_get_next_priority(pq, &priority)) {
56 RETVAL = newSVnv(priority); /* XS will mortalize this for us */
59 RETVAL = &PL_sv_undef;
66 POE::XS::Queue::Array pq
69 pq_remove_item(pq, id, filter)
70 POE::XS::Queue::Array pq
76 if (pq_remove_item(pq, id, filter, &removed)) {
78 PUSHs(sv_2mortal(newSVnv(removed.priority)));
79 PUSHs(sv_2mortal(newSViv(removed.id)));
80 PUSHs(sv_2mortal(removed.payload));
84 pq_remove_items(pq, filter, ...)
85 POE::XS::Queue::Array pq
89 pq_entry *removed_entries = NULL;
94 max_count = SvIV(ST(2));
96 max_count = pq_get_item_count(pq);
97 removed_count = pq_remove_items(pq, filter, max_count,
100 EXTEND(SP, removed_count);
101 for (i = 0; i < removed_count; ++i) {
102 pq_entry *entry = removed_entries + i;
106 av_store(av, 0, newSVnv(entry->priority));
107 av_store(av, 1, newSViv(entry->id));
108 av_store(av, 2, entry->payload);
109 rv = newRV_noinc((SV *)av);
110 PUSHs(sv_2mortal(rv));
114 myfree(removed_entries);
117 pq_adjust_priority(pq, id, filter, delta)
118 POE::XS::Queue::Array pq
123 pq_priority_t new_priority;
125 if (pq_adjust_priority(pq, id, filter, delta, &new_priority)) {
127 PUSHs(sv_2mortal(newSVnv(new_priority)));
131 pq_set_priority(pq, id, filter, new_priority)
132 POE::XS::Queue::Array pq
137 if (pq_set_priority(pq, id, filter, new_priority)) {
139 PUSHs(sv_2mortal(newSVnv(new_priority)));
143 pq_peek_items(pq, filter, ...)
144 POE::XS::Queue::Array pq
152 max_count = SvIV(ST(2));
154 max_count = pq_get_item_count(pq);
155 count = pq_peek_items(pq, filter, max_count, &ret_items);
158 for (i = 0; i < count; ++i) {
159 pq_entry *entry = ret_items + i;
163 av_store(av, 0, newSVnv(entry->priority));
164 av_store(av, 1, newSViv(entry->id));
165 av_store(av, 2, newSVsv(entry->payload));
166 rv = newRV_noinc((SV *)av);
167 PUSHs(sv_2mortal(rv));
174 POE::XS::Queue::Array pq
178 POE::XS::Queue::Array pq