diff options
author | Arne Döring <arne.doering@gmx.net> | 2019-08-27 23:18:46 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-08-27 23:18:46 +0200 |
commit | d564130a3b2596161847d695329ad009e693358a (patch) | |
tree | 14ced0de16093871d709b6170a2018bbee897d19 /lib | |
parent | eff0837ff40e4a5f5659ff02a56d9936bcbd7bcd (diff) | |
download | Nim-d564130a3b2596161847d695329ad009e693358a.tar.gz |
Fix to int to biggest int (#12066)
* fix to(Biggest)Int * kill toFloat magics as well
Diffstat (limited to 'lib')
-rw-r--r-- | lib/nimbase.h | 12 | ||||
-rw-r--r-- | lib/system.nim | 34 |
2 files changed, 17 insertions, 29 deletions
diff --git a/lib/nimbase.h b/lib/nimbase.h index a4bde0bd4..eadc34f66 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -374,18 +374,6 @@ typedef char* NCSTRING; # define NIM_IMAN 0 #endif -static N_INLINE(NI, float64ToInt32)(double x) { - /* nowadays no hack necessary anymore */ - return x >= 0 ? (NI)(x+0.5) : (NI)(x-0.5); -} - -static N_INLINE(NI32, float32ToInt32)(float x) { - /* nowadays no hack necessary anymore */ - return x >= 0 ? (NI32)(x+0.5) : (NI32)(x-0.5); -} - -#define float64ToInt64(x) ((NI64) (x)) - #define NIM_STRLIT_FLAG ((NU)(1) << ((NIM_INTBITS) - 2)) /* This has to be the same as system.strlitFlag! */ #define STRING_LITERAL(name, str, length) \ diff --git a/lib/system.nim b/lib/system.nim index 09280d607..974c39a67 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -1132,57 +1132,57 @@ proc chr*(u: range[0..255]): char {.magic: "Chr", noSideEffect.} # built-in operators when defined(nimNoZeroExtendMagic): - proc ze*(x: int8): int = + proc ze*(x: int8): int {.deprecated.} = ## zero extends a smaller integer type to ``int``. This treats `x` as ## unsigned. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int](uint(cast[uint8](x))) - proc ze*(x: int16): int = + proc ze*(x: int16): int {.deprecated.} = ## zero extends a smaller integer type to ``int``. This treats `x` as ## unsigned. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int](uint(cast[uint16](x))) - proc ze64*(x: int8): int64 = + proc ze64*(x: int8): int64 {.deprecated.} = ## zero extends a smaller integer type to ``int64``. This treats `x` as ## unsigned. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int64](uint64(cast[uint8](x))) - proc ze64*(x: int16): int64 = + proc ze64*(x: int16): int64 {.deprecated.} = ## zero extends a smaller integer type to ``int64``. This treats `x` as ## unsigned. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int64](uint64(cast[uint16](x))) - proc ze64*(x: int32): int64 = + proc ze64*(x: int32): int64 {.deprecated.} = ## zero extends a smaller integer type to ``int64``. This treats `x` as ## unsigned. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int64](uint64(cast[uint32](x))) - proc ze64*(x: int): int64 = + proc ze64*(x: int): int64 {.deprecated.} = ## zero extends a smaller integer type to ``int64``. This treats `x` as ## unsigned. Does nothing if the size of an ``int`` is the same as ``int64``. ## (This is the case on 64 bit processors.) ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int64](uint64(cast[uint](x))) - proc toU8*(x: int): int8 = + proc toU8*(x: int): int8 {.deprecated.} = ## treats `x` as unsigned and converts it to a byte by taking the last 8 bits ## from `x`. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int8](x) - proc toU16*(x: int): int16 = + proc toU16*(x: int): int16 {.deprecated.} = ## treats `x` as unsigned and converts it to an ``int16`` by taking the last ## 16 bits from `x`. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. cast[int16](x) - proc toU32*(x: int64): int32 = + proc toU32*(x: int64): int32 {.deprecated.} = ## treats `x` as unsigned and converts it to an ``int32`` by taking the ## last 32 bits from `x`. ## **Deprecated since version 0.19.9**: Use unsigned integers instead. @@ -2281,8 +2281,7 @@ type # these work for most platforms: PInt64* = ptr int64 ## An alias for ``ptr int64``. PInt32* = ptr int32 ## An alias for ``ptr int32``. -proc toFloat*(i: int): float {. - magic: "ToFloat", noSideEffect, importc: "toFloat".} +proc toFloat*(i: int): float {.noSideEffect, inline.} = ## Converts an integer `i` into a ``float``. ## ## If the conversion fails, `ValueError` is raised. @@ -2294,13 +2293,13 @@ proc toFloat*(i: int): float {. ## b = 3.7 ## ## echo a.toFloat + b # => 5.7 + float(i) -proc toBiggestFloat*(i: BiggestInt): BiggestFloat {. - magic: "ToBiggestFloat", noSideEffect, importc: "toBiggestFloat".} +proc toBiggestFloat*(i: BiggestInt): BiggestFloat {.noSideEffect, inline.} = ## Same as `toFloat <#toFloat,int>`_ but for ``BiggestInt`` to ``BiggestFloat``. + BiggestFloat(i) -proc toInt*(f: float): int {. - magic: "ToInt", noSideEffect, importc: "toInt".} +proc toInt*(f: float): int {.noSideEffect.} = ## Converts a floating point number `f` into an ``int``. ## ## Conversion rounds `f` half away from 0, see @@ -2314,10 +2313,11 @@ proc toInt*(f: float): int {. ## doAssert toInt(0.49) == 0 ## doAssert toInt(0.5) == 1 ## doAssert toInt(-0.5) == -1 # rounding is symmetrical + if f >= 0: int(f+0.5) else: int(f-0.5) -proc toBiggestInt*(f: BiggestFloat): BiggestInt {. - magic: "ToBiggestInt", noSideEffect, importc: "toBiggestInt".} +proc toBiggestInt*(f: BiggestFloat): BiggestInt {.noSideEffect.} = ## Same as `toInt <#toInt,float>`_ but for ``BiggestFloat`` to ``BiggestInt``. + if f >= 0: BiggestInt(f+0.5) else: BiggestInt(f-0.5) proc addQuitProc*(quitProc: proc() {.noconv.}) {. importc: "atexit", header: "<stdlib.h>".} |