From 0559f257a9d9b6a9d40ed9230f13b753b1f7228f Mon Sep 17 00:00:00 2001 From: densmojd <93928435+densmojd@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:15:30 -0400 Subject: [PATCH 1/5] Added FunctionWrappersWrapper constructor for the case where type parameters are specified but only the function to be wrapped is provied as an argument. --- src/FunctionWrappersWrappers.jl | 6 ++++++ test/basictests.jl | 10 ++++++++++ 2 files changed, 16 insertions(+) diff --git a/src/FunctionWrappersWrappers.jl b/src/FunctionWrappersWrappers.jl index f358ee8..e05cb34 100644 --- a/src/FunctionWrappersWrappers.jl +++ b/src/FunctionWrappersWrappers.jl @@ -111,6 +111,12 @@ end TruncatedStacktraces.@truncate_stacktrace FunctionWrappersWrapper +function FunctionWrappersWrapper{FW, P, CS}(f) where {K, FW <: NTuple{K, Any}, P, CS} + fw = ntuple(i -> FW.parameters[i](f), Val(K)) + cs = CS() + return FunctionWrappersWrapper{FW, P, CS}(fw, cs) +end + """ FunctionWrappersWrapper(f, argtypes, rettypes; cache=SingleCache(), policy=AllowNonIsBits()) diff --git a/test/basictests.jl b/test/basictests.jl index 592049f..6ebe658 100644 --- a/test/basictests.jl +++ b/test/basictests.jl @@ -243,3 +243,13 @@ end # Float32 is isbits mismatch → errors @test_throws FunctionWrappersWrappers.NoFunctionWrapperFoundError fww(4.0f0, 8.0f0) end + +@testset "Conversion" begin + fww_exp = FunctionWrappersWrapper(exp, (Tuple{Float64}, Tuple{Int},), + (Float64, Int)) + FWW = typeof(fww_exp) + + fww_cos = FWW(cos) + @test typeof(fww_cos) == FWW + +end From ab451d403031a841be1fad586647758fe60e4495 Mon Sep 17 00:00:00 2001 From: densmojd <93928435+densmojd@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:33:06 -0400 Subject: [PATCH 2/5] Changed arguments types in test from Int to Float32 because calculating exp and cos of integer really doesn't make sense. Actually check the value of the wrapped cos. --- test/basictests.jl | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/basictests.jl b/test/basictests.jl index 6ebe658..0eeae1f 100644 --- a/test/basictests.jl +++ b/test/basictests.jl @@ -245,11 +245,12 @@ end end @testset "Conversion" begin - fww_exp = FunctionWrappersWrapper(exp, (Tuple{Float64}, Tuple{Int},), - (Float64, Int)) + fww_exp = FunctionWrappersWrapper(exp, (Tuple{Float64}, Tuple{Float32},), + (Float64, Float32)) FWW = typeof(fww_exp) fww_cos = FWW(cos) @test typeof(fww_cos) == FWW + @test fww_cos(0.5) == cos(0.5) end From 60befeb9d20698c127681ad62e3c201d62475bff Mon Sep 17 00:00:00 2001 From: densmojd <93928435+densmojd@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:34:10 -0400 Subject: [PATCH 3/5] Added specializations of Base.convert for FunctionWrappersWrapper based on new constructor. --- src/FunctionWrappersWrappers.jl | 2 ++ test/basictests.jl | 12 ++++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/FunctionWrappersWrappers.jl b/src/FunctionWrappersWrappers.jl index e05cb34..f45d01e 100644 --- a/src/FunctionWrappersWrappers.jl +++ b/src/FunctionWrappersWrappers.jl @@ -143,6 +143,8 @@ function FunctionWrappersWrapper( return FunctionWrappersWrapper{typeof(fwt), typeof(policy), typeof(cs)}(fwt, cs) end +Base.convert(::Type{T}, obj) where T <: FunctionWrappersWrapper = T(obj) +Base.convert(::Type{T}, obj::T) where T <: FunctionWrappersWrapper = obj # ============================================================================ # Call dispatch — entry point diff --git a/test/basictests.jl b/test/basictests.jl index 0eeae1f..d0df0b1 100644 --- a/test/basictests.jl +++ b/test/basictests.jl @@ -245,12 +245,20 @@ end end @testset "Conversion" begin - fww_exp = FunctionWrappersWrapper(exp, (Tuple{Float64}, Tuple{Float32},), - (Float64, Float32)) + fww_exp = FunctionWrappersWrapper( + exp, + (Tuple{Float64}, Tuple{Float32},), + (Float64, Float32) + ) FWW = typeof(fww_exp) fww_cos = FWW(cos) @test typeof(fww_cos) == FWW @test fww_cos(0.5) == cos(0.5) + fww_vector = FWW[sin, tan, log] + @test eltype(fww_vector) == FWW + fww_vector[1](0.5) == sin(0.5) + fww_vector[2](0.5) == tan(0.5) + fww_vector[3](0.5) == log(0.5) end From f3daa7bec544e299d70d4de22209a8239918bc7c Mon Sep 17 00:00:00 2001 From: densmojd <93928435+densmojd@users.noreply.github.com> Date: Sat, 6 Jun 2026 11:38:19 -0400 Subject: [PATCH 4/5] Added a docstring for new constructor --- src/FunctionWrappersWrappers.jl | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/FunctionWrappersWrappers.jl b/src/FunctionWrappersWrappers.jl index f45d01e..5e8730a 100644 --- a/src/FunctionWrappersWrappers.jl +++ b/src/FunctionWrappersWrappers.jl @@ -111,6 +111,19 @@ end TruncatedStacktraces.@truncate_stacktrace FunctionWrappersWrapper +""" + FunctionWrappersWrapper{FW, P, CS}(f) + +Create a `FunctionWrappersWrapper` when the type parameters are specified. + +# Arguments +- `f`: The function to wrap + +# Type parameters +- `FW`: Tuple type of `FunctionWrapper`s +- `P`: Fallback policy (`Strict`, `AllowAll`, or `AllowNonIsBits`) +- `CS`: Cache storage type (`NoCacheStorage`, `SingleCacheStorage`, `DictCacheStorage`) +""" function FunctionWrappersWrapper{FW, P, CS}(f) where {K, FW <: NTuple{K, Any}, P, CS} fw = ntuple(i -> FW.parameters[i](f), Val(K)) cs = CS() From de906c4e2679d6654ef05caccd927ef252d2dc97 Mon Sep 17 00:00:00 2001 From: densmojd <93928435+densmojd@users.noreply.github.com> Date: Tue, 23 Jun 2026 01:53:03 -0400 Subject: [PATCH 5/5] Fixed formatting --- src/FunctionWrappersWrappers.jl | 4 ++-- test/basictests.jl | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/FunctionWrappersWrappers.jl b/src/FunctionWrappersWrappers.jl index 5e8730a..8b5ef0a 100644 --- a/src/FunctionWrappersWrappers.jl +++ b/src/FunctionWrappersWrappers.jl @@ -156,8 +156,8 @@ function FunctionWrappersWrapper( return FunctionWrappersWrapper{typeof(fwt), typeof(policy), typeof(cs)}(fwt, cs) end -Base.convert(::Type{T}, obj) where T <: FunctionWrappersWrapper = T(obj) -Base.convert(::Type{T}, obj::T) where T <: FunctionWrappersWrapper = obj +Base.convert(::Type{T}, obj) where {T <: FunctionWrappersWrapper} = T(obj) +Base.convert(::Type{T}, obj::T) where {T <: FunctionWrappersWrapper} = obj # ============================================================================ # Call dispatch — entry point diff --git a/test/basictests.jl b/test/basictests.jl index d0df0b1..a469614 100644 --- a/test/basictests.jl +++ b/test/basictests.jl @@ -246,8 +246,8 @@ end @testset "Conversion" begin fww_exp = FunctionWrappersWrapper( - exp, - (Tuple{Float64}, Tuple{Float32},), + exp, + (Tuple{Float64}, Tuple{Float32}), (Float64, Float32) ) FWW = typeof(fww_exp)