Skip to content

Commit 4f5758c

Browse files
feat: add support for inplace getp
1 parent 46070b2 commit 4f5758c

File tree

2 files changed

+26
-4
lines changed

2 files changed

+26
-4
lines changed

src/parameter_indexing.jl

+14-4
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,10 @@ end
5757

5858
function _getp(sys, ::ScalarSymbolic, ::SymbolicTypeTrait, p)
5959
idx = parameter_index(sys, p)
60-
return function getter(sol)
61-
return parameter_values(sol, idx)
60+
return let idx = idx
61+
function getter(sol)
62+
return parameter_values(sol, idx)
63+
end
6264
end
6365
end
6466

@@ -70,8 +72,16 @@ for (t1, t2) in [
7072
@eval function _getp(sys, ::NotSymbolic, ::$t1, p::$t2)
7173
getters = getp.((sys,), p)
7274

73-
return function getter(sol)
74-
map(g -> g(sol), getters)
75+
return let getters = getters
76+
function getter(sol)
77+
map(g -> g(sol), getters)
78+
end
79+
function getter(buffer, sol)
80+
for (i, g) in zip(eachindex(buffer), getters)
81+
buffer[i] = g(sol)
82+
end
83+
buffer
84+
end
7585
end
7686
end
7787
end

test/parameter_indexing_test.jl

+12
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,15 @@ for (sym, oldval, newval, check_inference) in [
5656
set!(p, oldval)
5757
@test get(p) == oldval
5858
end
59+
60+
for (sym, val) in [
61+
([:a, :b, :c], p),
62+
([:c, :a], p[[3, 1]]),
63+
((:b, :a), p[[2, 1]]),
64+
((1, :c), p[[1, 3]])
65+
]
66+
buffer = zeros(length(sym))
67+
get = getp(sys, sym)
68+
@inferred get(buffer, fi)
69+
@test buffer == val
70+
end

0 commit comments

Comments
 (0)