|
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