Function: comp-cstr-=
comp-cstr-= is a byte-compiled function defined in comp-cstr.el.gz.
Signature
(comp-cstr-= DST OP1 OP2)
Documentation
Constraint OP1 being = OP2 setting the result into DST.
Source Code
;; Defined in /usr/src/emacs/lisp/emacs-lisp/comp-cstr.el.gz
(defun comp-cstr-= (dst op1 op2)
"Constraint OP1 being = OP2 setting the result into DST."
(with-comp-cstr-accessors
(cl-flet ((relax-cstr (cstr)
(setf cstr (copy-sequence cstr))
;; If can be any float extend it to all integers.
(when (memq 'float (typeset cstr))
(setf (range cstr) '((- . +))))
;; For each float value that can be represented
;; precisely as an integer add the integer as well.
(cl-loop
for v in (valset cstr)
do
(when-let* ((ok (floatp v))
(truncated (ignore-error overflow-error
(truncate v)))
(ok (= v truncated)))
(push (cons truncated truncated) (range cstr))))
(cl-loop
with vals-to-add
for (l . h) in (range cstr)
;; If an integer range reduces to single value add
;; its float value too.
if (eql l h)
do (push (float l) vals-to-add)
;; Otherwise can be any float.
else
do (cl-pushnew 'float (typeset cstr))
(cl-return cstr)
finally (setf (valset cstr)
(append vals-to-add (valset cstr))))
(when (memql 0.0 (valset cstr))
(cl-pushnew -0.0 (valset cstr)))
(when (memql -0.0 (valset cstr))
(cl-pushnew 0.0 (valset cstr)))
cstr))
(comp-cstr-intersection dst (relax-cstr op1) (relax-cstr op2)))))