7070
7171# ############################################################################
7272
73- const rounding = Ref {Ptr{Cuint}} ()
73+ @enum DecFPRoundingMode begin
74+ DecFPRoundNearest
75+ DecFPRoundDown
76+ DecFPRoundUp
77+ DecFPRoundToZero
78+ DecFPRoundFromZero
79+ end
7480
75- # rounding modes, from bid_functions.h
76- const rounding_c2j = [RoundNearest, RoundDown, RoundUp, RoundToZero, RoundFromZero]
77- const rounding_j2c = Dict {RoundingMode, UInt32} ([(rounding_c2j[i], Cuint (i- 1 )) for i in 1 : length (rounding_c2j)])
81+ Base. convert (:: Type{DecFPRoundingMode} , :: RoundingMode{:Nearest} ) = DecFPRoundNearest
82+ Base. convert (:: Type{DecFPRoundingMode} , :: RoundingMode{:Down} ) = DecFPRoundDown
83+ Base. convert (:: Type{DecFPRoundingMode} , :: RoundingMode{:Up} ) = DecFPRoundUp
84+ Base. convert (:: Type{DecFPRoundingMode} , :: RoundingMode{:ToZero} ) = DecFPRoundToZero
85+ Base. convert (:: Type{DecFPRoundingMode} , :: RoundingMode{:FromZero} ) = DecFPRoundFromZero
86+
87+ function Base. convert (:: Type{RoundingMode} , r:: DecFPRoundingMode )
88+ if r == DecFPRoundNearest
89+ return RoundNearest
90+ elseif r == DecFPRRoundDown
91+ return RoundDown
92+ elseif r == DecFPRRoundUp
93+ return RoundUp
94+ elseif r == DecFPRRoundToZero
95+ return RoundToZero
96+ elseif r == DecFPRRoundFromZero
97+ return RoundFromZero
98+ else
99+ throw (ArgumentError (" invalid DecFP rounding mode code: $c " ))
100+ end
101+ end
102+
103+ const ROUNDING_PTR = Ref {Ptr{DecFPRoundingMode}} ()
78104
79105# global pointers and dicts must be initialized at runtime (via __init__)
80106function __init__ ()
81- global rounding [] = cglobal ((:__bid_IDEC_glbround , libbid), Cuint ) # rounding mode
107+ global ROUNDING_PTR [] = cglobal ((:__bid_IDEC_glbround , libbid), DecFPRoundingMode ) # rounding mode
82108 global flags[] = cglobal ((:__bid_IDEC_glbflags , libbid), Cuint) # exception status
83109 unsafe_store! (flags[], 0 )
84110end
@@ -94,8 +120,16 @@ const INEXACT = 0x20
94120bidsym (w,s... ) = string (" __bid" , w, " _" , s... )
95121
96122abstract type DecimalFloatingPoint <: AbstractFloat end
97- Base. rounding (:: Type{T} ) where {T<: DecimalFloatingPoint } = rounding_c2j[unsafe_load (rounding[])+ 1 ]
98- Base. setrounding (:: Type{T} , r:: RoundingMode ) where {T<: DecimalFloatingPoint } = unsafe_store! (rounding[], rounding_j2c[r])
123+
124+ Base. Rounding. rounding_raw (:: Type{T} ) where {T<: DecimalFloatingPoint } =
125+ unsafe_load (ROUNDING_PTR[])
126+ Base. Rounding. setrounding_raw (:: Type{T} , r:: DecFPRoundingMode ) where {T<: DecimalFloatingPoint } =
127+ unsafe_store! (ROUNDING_PTR[],r)
128+
129+ Base. Rounding. rounding (:: Type{T} ) where {T<: DecimalFloatingPoint } =
130+ convert (RoundingMode, Base. Rounding. rounding_raw (T))
131+ Base. Rounding. setrounding (:: Type{T} , r:: RoundingMode ) where {T<: DecimalFloatingPoint } =
132+ Base. Rounding. setrounding_raw (T, convert (DecFPRoundingMode, r))
99133
100134for w in (32 ,64 ,128 )
101135 BID = Symbol (string (" Dec" ,w))
0 commit comments