|
1 | | -struct ContainerKey{N<:Number} <: ResourceKey |
| 1 | +struct ContainerKey{N<:Real} <: ResourceKey |
2 | 2 | priority :: Int |
3 | 3 | id :: UInt |
4 | 4 | amount :: N |
5 | 5 | end |
6 | 6 |
|
7 | | -mutable struct Container{N<:Number} <: AbstractResource |
| 7 | +mutable struct Container{N<:Real} <: AbstractResource |
8 | 8 | env :: Environment |
9 | 9 | capacity :: N |
10 | 10 | level :: N |
11 | 11 | seid :: UInt |
12 | 12 | put_queue :: DataStructures.PriorityQueue{Put, ContainerKey{N}} |
13 | 13 | get_queue :: DataStructures.PriorityQueue{Get, ContainerKey{N}} |
14 | | - function Container{N}(env::Environment, capacity::N=one(N); level::N=zero(N)) where {N<:Number} |
| 14 | + function Container{N}(env::Environment, capacity::N=one(N); level::N=zero(N)) where {N<:Real} |
15 | 15 | new(env, capacity, level, zero(UInt), DataStructures.PriorityQueue{Put, ContainerKey{N}}(), DataStructures.PriorityQueue{Get, ContainerKey{N}}()) |
16 | 16 | end |
17 | 17 | end |
18 | 18 |
|
19 | | -function Container(env::Environment, capacity::N=one(N); level::N=zero(N)) where N<:Number |
| 19 | +function Container(env::Environment, capacity::N=one(N); level::N=zero(N)) where N<:Real |
20 | 20 | Container{N}(env, capacity, level=level) |
21 | 21 | end |
22 | 22 |
|
23 | 23 | const Resource = Container{Int} |
24 | 24 |
|
25 | | -function put(con::Container{N}, amount::N; priority::Int=0) where N<:Number |
| 25 | +function put(con::Container{N}, amount::N; priority::Int=0) where N<:Real |
26 | 26 | put_ev = Put(con.env) |
27 | 27 | con.put_queue[put_ev] = ContainerKey(priority, con.seid+=one(UInt), amount) |
28 | 28 | @callback trigger_get(put_ev, con) |
|
32 | 32 |
|
33 | 33 | request(res::Resource; priority::Int=0) = put(res, 1; priority=priority) |
34 | 34 |
|
35 | | -function get(con::Container{N}, amount::N; priority::Int=0) where N<:Number |
| 35 | +function get(con::Container{N}, amount::N; priority::Int=0) where N<:Real |
36 | 36 | get_ev = Get(con.env) |
37 | 37 | con.get_queue[get_ev] = ContainerKey(priority, con.seid+=one(UInt), amount) |
38 | 38 | @callback trigger_put(get_ev, con) |
|
42 | 42 |
|
43 | 43 | release(res::Resource; priority::Int=0) = get(res, 1; priority=priority) |
44 | 44 |
|
45 | | -function do_put(con::Container{N}, put_ev::Put, key::ContainerKey{N}) where N<:Number |
| 45 | +function do_put(con::Container{N}, put_ev::Put, key::ContainerKey{N}) where N<:Real |
46 | 46 | con.level + key.amount > con.capacity && return false |
47 | 47 | schedule(put_ev) |
48 | 48 | con.level += key.amount |
49 | 49 | true |
50 | 50 | end |
51 | 51 |
|
52 | | -function do_get(con::Container{N}, get_ev::Get, key::ContainerKey{N}) where N<:Number |
| 52 | +function do_get(con::Container{N}, get_ev::Get, key::ContainerKey{N}) where N<:Real |
53 | 53 | con.level - key.amount < zero(N) && return false |
54 | 54 | schedule(get_ev) |
55 | 55 | con.level -= key.amount |
|
0 commit comments