Skip to content

Commit 8b209cc

Browse files
committed
GENERALIZEDARRAYS: cache expensive and frequently used array predicate
1 parent 2639ac0 commit 8b209cc

File tree

1 file changed

+16
-2
lines changed

1 file changed

+16
-2
lines changed

modules/generalized-arrays/generalized-arrays.scm

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -939,6 +939,7 @@ OTHER DEALINGS IN THE SOFTWARE.
939939
body ;; the backing store for this array
940940
indexer ;; see below
941941
safe? ;; do we check whether bounds (in getters and setters) and values (in setters) are valid
942+
ordered ;; cached %%compute-array-elements-in-order? (#f: unknown 0: false)
942943
)
943944

944945
(define specialized-array-default-safe?
@@ -986,6 +987,7 @@ OTHER DEALINGS IN THE SOFTWARE.
986987
#f ; body
987988
#f ; indexer
988989
#f ; safe?
990+
#f ; ordered (unknown)
989991
)))))
990992

991993
(define (array? x)
@@ -1565,7 +1567,7 @@ OTHER DEALINGS IN THE SOFTWARE.
15651567
(else
15661568
(%%array-safe? obj))))
15671569

1568-
(define (%%array-elements-in-order? array)
1570+
(define (%%compute-array-elements-in-order? array)
15691571
(let ((domain (%%array-domain array))
15701572
(indexer (%%array-indexer array)))
15711573
(case (%%interval-dimension domain)
@@ -1673,6 +1675,16 @@ OTHER DEALINGS IN THE SOFTWARE.
16731675
;; return a proper boolean instead of the volume of the domain
16741676
#t))))))
16751677

1678+
(define (%%array-elements-in-order? array)
1679+
(let ((ordering-known (%%array-ordered array)))
1680+
(cond
1681+
((not ordering-known)
1682+
(let ((ordered (%%compute-array-elements-in-order? array)))
1683+
(%%array-ordered-set! array (if ordered 1 0))
1684+
ordered))
1685+
((0) #f)
1686+
(else #t))))
1687+
16761688
(define (array-elements-in-order? array)
16771689
(cond ((not (specialized-array? array))
16781690
(error "array-elements-in-order?: The argument is not a specialized array: " array))
@@ -1842,7 +1854,9 @@ OTHER DEALINGS IN THE SOFTWARE.
18421854
storage-class
18431855
body
18441856
indexer
1845-
safe?))))
1857+
safe?
1858+
#f ;; ordered: unknown
1859+
))))
18461860

18471861
(define (%%interval->basic-indexer interval)
18481862
(case (%%interval-dimension interval)

0 commit comments

Comments
 (0)