From 908d84a01496cc2451fa90ad63c785a7532ea7db Mon Sep 17 00:00:00 2001 From: Brandon Flores Date: Tue, 27 Feb 2024 19:53:14 -0600 Subject: [PATCH] Fixed semantics of `oneunit` for `AbstractCliffordNumber` --- src/abstract.jl | 7 ++++++- src/kvector.jl | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/abstract.jl b/src/abstract.jl index 0dd69e0..8202f71 100644 --- a/src/abstract.jl +++ b/src/abstract.jl @@ -58,12 +58,17 @@ numeric_type(x) = numeric_type(typeof(x)) Base.Tuple(x::AbstractCliffordNumber) = getfield(x, :data)::Tuple #---Zero multivectors------------------------------------------------------------------------------# -import Base: zero +import Base: zero, oneunit zero(C::Type{<:AbstractCliffordNumber{Q,T}}) where {Q,T} = C(_ -> ntuple(zero(T), Val(length(C)))) zero(C::Type{<:AbstractCliffordNumber}) = C(ntuple(_ -> zero(Bool), Val(length(C)))) zero(x::AbstractCliffordNumber) = zero(typeof(x)) +# The default defintion assumes oneunit(T) = T(one(x)) +# But this doesn't work here, because T(one(x)) doesn't do any error checking +# Only the explicit conversion does the error checking +oneunit(::Union{T,Type{T}}) where T<:AbstractCliffordNumber = convert(T, one(T)) + #---Construct similar types------------------------------------------------------------------------# import Base.similar diff --git a/src/kvector.jl b/src/kvector.jl index 99dfbdd..f25cfa1 100644 --- a/src/kvector.jl +++ b/src/kvector.jl @@ -60,7 +60,6 @@ end #---Generating multiplicative identities for arbitrary types---------------------------------------# -Base.oneunit(C::Type{<:AbstractCliffordNumber{Q}}) where Q = KVector{0,Q}(numeric_type(C)(true)) Base.one(C::Type{<:AbstractCliffordNumber{Q}}) where Q = KVector{0,Q}(numeric_type(C)(true)) #---Similar types----------------------------------------------------------------------------------#