Back
unchecked-dec (clj)
(source)function
(unchecked-dec x)
Returns a number one less than x, a long.
Note - uses a primitive operator subject to overflow.
Examples
typedclojure/typedclojure
(ns ^:no-doc typed.ann.clojure
"Type annotations for the base Clojure distribution."
#?(:cljs (:require-macros [typed.ann-macros.clojure :as macros]))
(:require [clojure.core :as cc]
[typed.clojure :as t]
#?(:clj [typed.ann-macros.clojure :as macros])
#?(:clj typed.ann.clojure.jvm) ;; jvm annotations
#?(:clj clojure.core.typed))
#?(:clj
(:import (clojure.lang PersistentHashSet PersistentList
APersistentMap #_IPersistentCollection
#_ITransientSet
IRef)
(java.util Comparator Collection))))
cc/unchecked-inc (t/IFn [t/AnyInteger :-> t/AnyInteger]
[t/Num :-> t/Num])
cc/unchecked-inc-int [t/Num :-> t/AnyInteger]
cc/unchecked-dec (t/IFn [t/AnyInteger :-> t/AnyInteger]
[t/Num :-> t/Num])
cc/unchecked-dec-int [t/Num :-> t/AnyInteger]
cc/unchecked-subtract (t/IFn [t/AnyInteger t/AnyInteger :-> t/AnyInteger]
[t/Num t/Num :-> t/Num])
cc/unchecked-subtract-int [t/Num t/Num :-> t/AnyInteger]
cc/unchecked-negate (t/IFn [t/AnyInteger :-> t/AnyInteger]
[t/Num :-> t/Num])
cc/unchecked-negate-int [t/Num :-> t/AnyInteger]
cc/unchecked-add (t/IFn [t/AnyInteger t/AnyInteger :-> t/AnyInteger]
[t/Num t/Num :-> t/Num])
cc/unchecked-add-int [t/Num t/Num :-> t/AnyInteger]
cc/unchecked-multiply (t/IFn [t/AnyInteger t/AnyInteger :-> t/AnyInteger]
[t/Num t/Num :-> t/Num])
cc/unchecked-multiply-int [t/Num t/Num :-> t/AnyInteger]
cc/unchecked-divide-int [t/Num t/Num :-> t/AnyInteger]
cc/unchecked-remainder-int [t/Num t/Num :-> t/AnyInteger]
cc/rem (t/IFn [t/AnyInteger t/AnyInteger :-> t/AnyInteger]
[t/Num t/Num :-> t/Num])
cc/inc (t/IFn #?(:clj [Long :-> Long])
#?(:clj [Double :-> Double])
[t/AnyInteger :-> t/AnyInteger]
[t/Num :-> t/Num])
cc/dec (t/IFn #?(:clj [Long :-> Long])
#?(:clj [Double :-> Double])
[t/AnyInteger :-> t/AnyInteger]
[t/Num :-> t/Num])
clojure/core.rrb-vector
(ns clojure.core.rrb-vector.transients
(:require [clojure.core.rrb-vector.parameters :as p]
[clojure.core.rrb-vector.nodes :refer [ranges last-range
overflow?]])
(:import (clojure.core.rrb_vector.nodes NodeManager)
(clojure.core ArrayManager)
(java.util.concurrent.atomic AtomicReference)))
;; Note 2: In the worst case, when the tree is nearly full,
;; calling overflow? here takes run time O(tree_depth^2) here.
;; That could be made O(tree_depth). One way would be to call
;; pushTail in hopes that it succeeds, but return some distinctive
;; value indicating a failure on the full condition, and create
;; the node via a .newPath call at most recent recursive pushTail
;; call that has an empty slot available.
(pushTail [this nm am shift cnt root-edit current-node tail-node]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(do (loop [n ret shift shift]
(let [arr (.array nm n)
subidx (bit-and (bit-shift-right (dec cnt) shift) 0x1f)]
(if (== shift 5)
(aset ^objects arr subidx tail-node)
(let [child (aget ^objects arr subidx)]
(if (nil? child)
(aset ^objects arr subidx
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift 5)
tail-node))
(let [editable-child
(.ensureEditable this nm am
root-edit
child
(unchecked-subtract-int
shift 5))]
(aset ^objects arr subidx editable-child)
(recur editable-child (- shift (int 5)))))))))
ret)
(let [arr (.array nm ret)
rngs (ranges nm ret)
li (unchecked-dec-int (aget rngs 32))
cret (if (== shift 5)
nil
(let [child (.ensureEditable this nm am
root-edit
(aget ^objects arr li)
(unchecked-subtract-int
shift 5))
ccnt (unchecked-add-int
(int (if (pos? li)
(unchecked-subtract-int
(aget rngs li)
(aget rngs (unchecked-dec-int li)))
(aget rngs 0)))
;; add 32 elems to account for the
;; new full tail we plan to add to
;; the subtree.
(int 32))]
;; See Note 2
(if-not (overflow? nm child
(unchecked-subtract-int shift 5)
ccnt)
(.pushTail this nm am
(unchecked-subtract-int shift 5)
ccnt
root-edit
child
tail-node))))]
(if cret
(do (aset ^objects arr li cret)
(aset rngs li (unchecked-add-int (aget rngs li) 32))
ret)
(do (when (>= li 31)
;; See Note 1
(let [msg (str "Assigning index " (inc li) " of vector"
" object array to become a node, when that"
" index should only be used for storing"
" range arrays.")
data {:shift shift, :cnd cnt,
:current-node current-node,
:tail-node tail-node, :rngs rngs, :li li,
:cret cret}]
(throw (ex-info msg data))))
(aset ^objects arr (inc li)
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift 5)
tail-node))
(aset rngs (unchecked-inc-int li)
(unchecked-add-int (aget rngs li) 32))
(aset rngs 32 (unchecked-inc-int (aget rngs 32)))
ret))))))
:else
(let [arr (.array nm ret)]
(aset ^objects arr subidx nil)
ret)))
(let [rngs (ranges nm ret)
subidx (unchecked-dec-int (aget rngs 32))]
(cond
(> shift 5)
(let [child (aget ^objects (.array nm ret) subidx)
child-cnt (if (zero? subidx)
(aget rngs 0)
(unchecked-subtract-int
(aget rngs subidx)
(aget rngs (unchecked-dec-int subidx))))
new-child (.popTail this nm am
(unchecked-subtract-int shift 5)
child-cnt
root-edit
child)]
(cond
(and (nil? new-child) (zero? subidx))
nil
(.regular nm child)
(let [arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) 32))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs 32 (unchecked-dec-int (aget rngs 32))))
ret)
:else
(let [rng (last-range nm child)
diff (unchecked-subtract-int
rng
(if new-child (last-range nm new-child) 0))
arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) diff))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs 32 (unchecked-dec-int (aget rngs 32))))
ret)))
:else
(let [arr (.array nm ret)
child (aget ^objects arr subidx)]
(aset ^objects arr subidx nil)
(aset rngs subidx 0)
(aset rngs 32 (unchecked-dec-int (aget rngs 32)))
ret))))))
(doAssoc [this nm am shift root-edit current-node i val]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(loop [shift shift
node ret]
(if (zero? shift)
(let [arr (.array nm node)]
(.aset am arr (bit-and i 0x1f) val))
(let [arr (.array nm node)
subidx (bit-and (bit-shift-right i shift) 0x1f)
next-shift (int (unchecked-subtract-int shift 5))
child (.ensureEditable this nm am
root-edit
(aget ^objects arr subidx)
next-shift)]
(aset ^objects arr subidx child)
(recur next-shift child))))
(let [arr (.array nm ret)
rngs (ranges nm ret)
subidx (bit-and (bit-shift-right i shift) 0x1f)
subidx (loop [subidx subidx]
(if (< i (aget rngs subidx))
subidx
(recur (unchecked-inc-int subidx))))
i (if (zero? subidx)
i
(unchecked-subtract-int
i (aget rngs (unchecked-dec-int subidx))))]
(aset ^objects arr subidx
(.doAssoc this nm am
(unchecked-subtract-int shift 5)
root-edit
(aget ^objects arr subidx)
i
val))))
ret))
clojure/core.rrb-vector
(ns clojure.core.rrb-vector.transients
(:require [clojure.core.rrb-vector.parameters :as p]
[clojure.core.rrb-vector.nodes :refer [ranges last-range
overflow?]])
(:import (clojure.core.rrb_vector.nodes NodeManager)
(clojure.core ArrayManager)
(java.util.concurrent.atomic AtomicReference)))
;; Note 2: In the worst case, when the tree is nearly full,
;; calling overflow? here takes run time O(tree_depth^2) here.
;; That could be made O(tree_depth). One way would be to call
;; pushTail in hopes that it succeeds, but return some distinctive
;; value indicating a failure on the full condition, and create
;; the node via a .newPath call at most recent recursive pushTail
;; call that has an empty slot available.
(pushTail [this nm am shift cnt root-edit current-node tail-node]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(do (loop [n ret shift shift]
(let [arr (.array nm n)
subidx (bit-and (bit-shift-right (dec cnt) shift) p/branch-mask)]
(if (== shift p/shift-increment)
(aset ^objects arr subidx tail-node)
(let [child (aget ^objects arr subidx)]
(if (nil? child)
(aset ^objects arr subidx
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift p/shift-increment)
tail-node))
(let [editable-child
(.ensureEditable this nm am
root-edit
child
(unchecked-subtract-int
shift p/shift-increment))]
(aset ^objects arr subidx editable-child)
(recur editable-child (- shift (int p/shift-increment)))))))))
ret)
(let [arr (.array nm ret)
rngs (ranges nm ret)
li (unchecked-dec-int (aget rngs p/max-branches))
cret (if (== shift p/shift-increment)
nil
(let [child (.ensureEditable this nm am
root-edit
(aget ^objects arr li)
(unchecked-subtract-int
shift p/shift-increment))
ccnt (unchecked-add-int
(int (if (pos? li)
(unchecked-subtract-int
(aget rngs li)
(aget rngs (unchecked-dec-int li)))
(aget rngs 0)))
;; add p/max-branches elems to account for the
;; new full tail we plan to add to
;; the subtree.
(int p/max-branches))]
;; See Note 2
(if-not (overflow? nm child
(unchecked-subtract-int shift p/shift-increment)
ccnt)
(.pushTail this nm am
(unchecked-subtract-int shift p/shift-increment)
ccnt
root-edit
child
tail-node))))]
(if cret
(do (aset ^objects arr li cret)
(aset rngs li (unchecked-add-int (aget rngs li) p/max-branches))
ret)
(do (when (>= li p/max-branches-minus-1)
;; See Note 1
(let [msg (str "Assigning index " (inc li) " of vector"
" object array to become a node, when that"
" index should only be used for storing"
" range arrays.")
data {:shift shift, :cnd cnt,
:current-node current-node,
:tail-node tail-node, :rngs rngs, :li li,
:cret cret}]
(throw (ex-info msg data))))
(aset ^objects arr (inc li)
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift p/shift-increment)
tail-node))
(aset rngs (unchecked-inc-int li)
(unchecked-add-int (aget rngs li) p/max-branches))
(aset rngs p/max-branches (unchecked-inc-int (aget rngs p/max-branches)))
ret))))))
:else
(let [arr (.array nm ret)]
(aset ^objects arr subidx nil)
ret)))
(let [rngs (ranges nm ret)
subidx (unchecked-dec-int (aget rngs p/max-branches))]
(cond
(> shift p/shift-increment)
(let [child (aget ^objects (.array nm ret) subidx)
child-cnt (if (zero? subidx)
(aget rngs 0)
(unchecked-subtract-int
(aget rngs subidx)
(aget rngs (unchecked-dec-int subidx))))
new-child (.popTail this nm am
(unchecked-subtract-int shift p/shift-increment)
child-cnt
root-edit
child)]
(cond
(and (nil? new-child) (zero? subidx))
nil
(.regular nm child)
(let [arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) p/max-branches))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs p/max-branches (unchecked-dec-int (aget rngs p/max-branches))))
ret)
:else
(let [rng (last-range nm child)
diff (unchecked-subtract-int
rng
(if new-child (last-range nm new-child) 0))
arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) diff))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs p/max-branches (unchecked-dec-int (aget rngs p/max-branches))))
ret)))
:else
(let [arr (.array nm ret)
child (aget ^objects arr subidx)]
(aset ^objects arr subidx nil)
(aset rngs subidx 0)
(aset rngs p/max-branches (unchecked-dec-int (aget rngs p/max-branches)))
ret))))))
(doAssoc [this nm am shift root-edit current-node i val]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(loop [shift shift
node ret]
(if (zero? shift)
(let [arr (.array nm node)]
(.aset am arr (bit-and i p/branch-mask) val))
(let [arr (.array nm node)
subidx (bit-and (bit-shift-right i shift) p/branch-mask)
next-shift (int (unchecked-subtract-int shift p/shift-increment))
child (.ensureEditable this nm am
root-edit
(aget ^objects arr subidx)
next-shift)]
(aset ^objects arr subidx child)
(recur next-shift child))))
(let [arr (.array nm ret)
rngs (ranges nm ret)
subidx (bit-and (bit-shift-right i shift) p/branch-mask)
subidx (loop [subidx subidx]
(if (< i (aget rngs subidx))
subidx
(recur (unchecked-inc-int subidx))))
i (if (zero? subidx)
i
(unchecked-subtract-int
i (aget rngs (unchecked-dec-int subidx))))]
(aset ^objects arr subidx
(.doAssoc this nm am
(unchecked-subtract-int shift p/shift-increment)
root-edit
(aget ^objects arr subidx)
i
val))))
ret))
datastax/fallout
(ns clojure.core.rrb-vector.transients
(:require [clojure.core.rrb-vector.nodes :refer [ranges last-range]])
(:import (clojure.core.rrb_vector.nodes NodeManager)
(clojure.core ArrayManager)
(java.util.concurrent.atomic AtomicReference)))
(pushTail [this nm am shift cnt root-edit current-node tail-node]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(do (loop [n ret shift shift]
(let [arr (.array nm n)
subidx (bit-and (bit-shift-right (dec cnt) shift) 0x1f)]
(if (== shift 5)
(aset ^objects arr subidx tail-node)
(let [child (aget ^objects arr subidx)]
(if (nil? child)
(aset ^objects arr subidx
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift 5)
tail-node))
(let [editable-child
(.ensureEditable this nm am
root-edit
child
(unchecked-subtract-int
shift 5))]
(aset ^objects arr subidx editable-child)
(recur editable-child (- shift 5))))))))
ret)
(let [arr (.array nm ret)
rngs (ranges nm ret)
li (unchecked-dec-int (aget rngs 32))
cret (if (== shift 5)
nil
(let [child (.ensureEditable this nm am
root-edit
(aget ^objects arr li)
(unchecked-subtract-int
shift 5))
ccnt (if (pos? li)
(unchecked-subtract-int
(aget rngs li)
(aget rngs (unchecked-dec-int li)))
(aget rngs 0))]
(if-not (== ccnt (bit-shift-left 1 shift))
(.pushTail this nm am
(unchecked-subtract-int shift 5)
(unchecked-inc-int ccnt)
root-edit
child
tail-node))))]
(if cret
(do (aset ^objects arr li cret)
(aset rngs li (unchecked-add-int (aget rngs li) 32))
ret)
(do (aset ^objects arr (inc li)
(.newPath this nm am
(.array nm tail-node)
root-edit
(unchecked-subtract-int shift 5)
tail-node))
(aset rngs (unchecked-inc-int li)
(unchecked-add-int (aget rngs li) 32))
(aset rngs 32 (unchecked-inc-int (aget rngs 32)))
ret))))))
(popTail [this nm am shift cnt root-edit current-node]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(let [subidx (bit-and
(bit-shift-right (unchecked-dec-int cnt) shift)
0x1f)]
(cond
(> shift 5)
(let [child (.popTail this nm am
(unchecked-subtract-int shift 5)
cnt
root-edit
(aget ^objects (.array nm ret) subidx))]
(if (and (nil? child) (zero? subidx))
nil
(let [arr (.array nm ret)]
(aset ^objects arr subidx child)
ret)))
:else
(let [arr (.array nm ret)]
(aset ^objects arr subidx nil)
ret)))
(let [rngs (ranges nm ret)
subidx (bit-and
(bit-shift-right (unchecked-dec-int cnt) shift)
0x1f)
subidx (loop [subidx subidx]
(if (or (zero? (aget rngs (unchecked-inc-int subidx)))
(== subidx 31))
subidx
(recur (unchecked-inc-int subidx))))]
(cond
(> shift 5)
(let [child (aget ^objects (.array nm ret) subidx)
child-cnt (if (zero? subidx)
(aget rngs 0)
(unchecked-subtract-int
(aget rngs subidx)
(aget rngs (unchecked-dec-int subidx))))
new-child (.popTail this nm am
(unchecked-subtract-int subidx 5)
child-cnt
root-edit
child)]
(cond
(and (nil? new-child) (zero? subidx))
nil
(.regular nm child)
(let [arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) 32))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs 32 (unchecked-dec-int (aget rngs 32))))
ret)
:else
(let [rng (last-range nm child)
diff (unchecked-subtract-int
rng
(if new-child (last-range nm new-child) 0))
arr (.array nm ret)]
(aset rngs subidx
(unchecked-subtract-int (aget rngs subidx) diff))
(aset ^objects arr subidx new-child)
(if (nil? new-child)
(aset rngs 32 (unchecked-dec-int (aget rngs 32))))
ret)))
:else
(let [arr (.array nm ret)
child (aget ^objects arr subidx)]
(aset ^objects arr subidx nil)
(aset rngs subidx 0)
(aset rngs 32 (unchecked-dec-int (aget rngs 32)))
ret))))))
(doAssoc [this nm am shift root-edit current-node i val]
(let [ret (.ensureEditable this nm am root-edit current-node shift)]
(if (.regular nm ret)
(loop [shift shift
node ret]
(if (zero? shift)
(let [arr (.array nm node)]
(.aset am arr (bit-and i 0x1f) val))
(let [arr (.array nm node)
subidx (bit-and (bit-shift-right i shift) 0x1f)
child (.ensureEditable this nm am
root-edit
(aget ^objects arr subidx)
shift)]
(aset ^objects arr subidx child)
(recur (unchecked-subtract-int shift 5) child))))
(let [arr (.array nm ret)
rngs (ranges nm ret)
subidx (bit-and (bit-shift-right i shift) 0x1f)
subidx (loop [subidx subidx]
(if (< i (aget rngs subidx))
subidx
(recur (unchecked-inc-int subidx))))
i (if (zero? subidx)
i
(unchecked-subtract-int
i (aget rngs (unchecked-dec-int subidx))))]
(aset ^objects arr subidx
(.doAssoc this nm am
(unchecked-subtract-int shift 5)
root-edit
(aget ^objects arr subidx)
i
val))))
ret))