Multiton: Difference between revisions
Content added Content deleted
m (→{{header|Wren}}: Correction to preamble.) |
(julia example) |
||
Line 13: | Line 13: | ||
* [[Singleton]] |
* [[Singleton]] |
||
<br><br> |
<br><br> |
||
=={{header|Julia}}== |
|||
A registry (just in memory, not on disk) is used below instead of an enum. The registry is protected by a lock on the Multiton constructor, to prevent two threads creating the same object at the same time. |
|||
<lang julia>struct Multiton{T} |
|||
data::T |
|||
function Multiton(registry, refnum, data) |
|||
if 0 < refnum <= registry.max_instances && registry.instances[refnum] isa Nothing |
|||
lock(registry.spinlock) |
|||
multiton = new{typeof(data)}(data) |
|||
registry.instances[refnum] = multiton |
|||
unlock(registry.spinlock) |
|||
return multiton |
|||
else |
|||
error("Cannot create instance with instance reference number $refnum") |
|||
end |
|||
end |
|||
function Multiton(registry, refnum) |
|||
if 0 < refnum <= registry.max_instances && registry.instances[refnum] isa Multiton |
|||
return registry.instances[refnum] |
|||
else |
|||
error("Cannot find a Multiton in registry with instance reference number $refnum") |
|||
end |
|||
end |
|||
end |
|||
struct Registry |
|||
spinlock::Threads.SpinLock |
|||
max_instances::Int |
|||
instances::Vector{Union{Nothing, Multiton}} |
|||
Registry(maxnum) = new(Threads.SpinLock(), maxnum, fill(nothing, maxnum)) |
|||
end |
|||
reg = Registry(3) |
|||
m0 = Multiton(reg, 1, "zero") |
|||
m1 = Multiton(reg, 2, 1.0) |
|||
m2 = Multiton(reg, 3, [2]) |
|||
m3 = Multiton(reg, 1) |
|||
m4 = Multiton(reg, 2) |
|||
for m in [m0, m1, m2, m3, m4] |
|||
println("Multiton is $m") |
|||
end |
|||
# produce error |
|||
# m3 = Multiton(reg, 4, "three") |
|||
# produce error |
|||
m5 = Multiton(reg, 5) |
|||
</lang>{{out}} |
|||
<pre> |
|||
Multiton is Multiton{String}("zero") |
|||
Multiton is Multiton{Float64}(1.0) |
|||
Multiton is Multiton{Vector{Int64}}([2]) |
|||
Multiton is Multiton{String}("zero") |
|||
Multiton is Multiton{Float64}(1.0) |
|||
ERROR: LoadError: Cannot find a Multiton in registry with instance reference number 5 |
|||
</pre> |
|||
=={{header|Wren}}== |
=={{header|Wren}}== |
||
{{libheader|Wren-dynamic}} |
{{libheader|Wren-dynamic}} |