File: eventq2.mw

package info (click to toggle)
mwrap 1.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 1,548 kB
  • sloc: cpp: 3,315; python: 1,850; ansic: 856; makefile: 258; lex: 233; sh: 145
file content (61 lines) | stat: -rw-r--r-- 1,259 bytes parent folder | download | duplicates (8)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
% eventq_plain.mw
%   Simple event queue for use in MATLAB event-driven simulations.
%
% Copyright (c) 2007  David Bindel
% See the file COPYING for copying permissions

$[
#include <mex.h>
#include <queue>

typedef std::pair<double, mxArray*>                 Event;
typedef std::priority_queue< Event, 
                             std::vector<Event>, 
                             std::greater<Event> >  EventQueue;
$]


// ----
@function [q] = EventQ_new();
# EventQueue* q = new EventQueue();


// ----
@function EventQ_destroy(q);

while ~EventQ_empty(q)
  EventQ_pop(q)
end
# delete(EventQueue* q);


// ----
@function [e] = EventQ_empty(q)
# int e = q->EventQueue.empty();


// ----
@function [data, t] = EventQ_pop(q)
$[
mxArray* pop_event(EventQueue* q, double& t) {
    t = q->top().first;
    mxArray* data = mxDuplicateArray(q->top().second);
    mxDestroyArray(q->top().second);
    q->pop();
    return data;
}
$]
# mxArray data = pop_event(EventQueue* q, output double& t);


// ----
@function EventQ_push(q, data, t)
$[
void push_event(EventQueue* q, const mxArray* a, double t)
{
    mxArray* data = mxDuplicateArray(a);
    mexMakeArrayPersistent(data);
    q->push(Event(t, data));
}
$]
# push_event(EventQueue* q, mxArray data, double t);