Skip to content

Commit 6e90f12

Browse files
committed
Try implementing backend via scopedvalues
1 parent 23f04cf commit 6e90f12

File tree

2 files changed

+15
-6
lines changed

2 files changed

+15
-6
lines changed

src/AbstractFFTs.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
module AbstractFFTs
22

3+
using Base.ScopedValues
4+
35
export fft, ifft, bfft, fft!, ifft!, bfft!,
46
plan_fft, plan_ifft, plan_bfft, plan_fft!, plan_ifft!, plan_bfft!,
57
rfft, irfft, brfft, plan_rfft, plan_irfft, plan_brfft,

src/definitions.jl

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -59,20 +59,27 @@ _to1(::Tuple{Base.OneTo,Vararg{Base.OneTo}}, x) = x
5959
_to1(::Tuple, x) = copy1(eltype(x), x)
6060

6161
# Abstract FFT Backend
62-
export AbstractFFTBackend
62+
export AbstractFFTBackend, fft_backend
6363
abstract type AbstractFFTBackend end
64-
const ACTIVE_BACKEND = Ref{Union{Missing, AbstractFFTBackend}}(missing)
64+
struct BackendReference
65+
ref::Ref{Union{Missing, AbstractFFTBackend}}
66+
BackendReference(val::Union{Missing, AbstractFFTBackend}) = new(Ref{Union{Missing, AbstractFFTBackend}}(val))
67+
end
68+
Base.setindex!(ref::BackendReference, val::Union{Missing, AbstractFFTBackend}) = ref.ref[] = val
69+
Base.setindex!(ref::BackendReference, val::Module) = setindex!(ref, val.backend())
70+
Base.getindex(ref::BackendReference) = getindex(ref.ref)
71+
Base.convert(BackendReference, val::AbstractFFTBackend) = BackendReference(val)
72+
const fft_backend = ScopedValue(BackendReference(missing))
6573

6674
"""
6775
set_active_backend!(back::Union{Missing, Module, AbstractFFTBackend})
6876
6977
Set the default FFT plan backend. A module `back` must implement `back.backend()`.
7078
"""
71-
set_active_backend!(back::Module) = set_active_backend!(back.backend())
72-
function set_active_backend!(back::Union{Missing, AbstractFFTBackend})
73-
ACTIVE_BACKEND[] = back
79+
function set_active_backend!(back::Union{Missing, AbstractFFTBackend, Module})
80+
fft_backend[][] = back
7481
end
75-
active_backend() = ACTIVE_BACKEND[]
82+
active_backend() = fft_backend[][]
7683
function no_backend_error()
7784
error(
7885
"""

0 commit comments

Comments
 (0)