mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 15:43:01 +00:00 
			
		
		
		
	Merge commit '0ea77cabfb30afc15433581f5888171c1f65aafd'
This commit is contained in:
		| @@ -791,38 +791,49 @@ | ||||
| ### | ||||
|  | ||||
| (defn- median-of-three [a b c] | ||||
|   (if (not= (> a b) (> a  c)) | ||||
|   (if (not= (> a b) (> a c)) | ||||
|     a | ||||
|     (if (not= (> b a) (> b c)) b c))) | ||||
|  | ||||
| (defn sort-help [a lo hi by] | ||||
|   (when (< lo hi) | ||||
|     (def pivot | ||||
|       (median-of-three (in a hi) (in a lo) | ||||
|                        (in a (math/floor (/ (+ lo hi) 2))))) | ||||
|     (var left lo) | ||||
|     (var right hi) | ||||
|     (while true | ||||
|       (while (by (in a left) pivot) (++ left)) | ||||
|       (while (by pivot (in a right)) (-- right)) | ||||
|       (when (<= left right) | ||||
|         (def tmp (in a left)) | ||||
|         (set (a left) (in a right)) | ||||
|         (set (a right) tmp) | ||||
|         (++ left) | ||||
|         (-- right)) | ||||
|       (if (>= left right) (break))) | ||||
|     (sort-help a lo right by) | ||||
|     (sort-help a left hi by)) | ||||
| (defn- insertion-sort [a lo hi by] | ||||
|   (for i (+ lo 1) (+ hi 1) | ||||
|     (def temp (in a i)) | ||||
|     (var j (- i 1)) | ||||
|     (while (and (>= j lo) (by temp (in a j))) | ||||
|       (set (a (+ j 1)) (in a j)) | ||||
|       (-- j)) | ||||
|  | ||||
|     (set (a (+ j 1)) temp)) | ||||
|   a) | ||||
|  | ||||
| (defn sort | ||||
|   "Sort an array in-place. Uses quick-sort and is not a stable sort." | ||||
|   [a &opt by] | ||||
|   (sort-help a 0 (- (length a) 1) (or by <))) | ||||
|   (default by <) | ||||
|   (def stack @[[0 (- (length a) 1)]]) | ||||
|   (while (not (empty? stack)) | ||||
|     (def [lo hi] (array/pop stack)) | ||||
|     (when (< lo hi) | ||||
|       (when (< (- hi lo) 32) (insertion-sort a lo hi by) (break)) | ||||
|       (def pivot (median-of-three (in a hi) (in a lo) (in a (math/floor (/ (+ lo hi) 2))))) | ||||
|       (var left lo) | ||||
|       (var right hi) | ||||
|       (while true | ||||
|         (while (by (in a left) pivot) (++ left)) | ||||
|         (while (by pivot (in a right)) (-- right)) | ||||
|         (when (<= left right) | ||||
|           (def tmp (in a left)) | ||||
|           (set (a left) (in a right)) | ||||
|           (set (a right) tmp) | ||||
|           (++ left) | ||||
|           (-- right)) | ||||
|         (if (>= left right) (break))) | ||||
|       (array/push stack [lo right]) | ||||
|       (array/push stack [left hi]))) | ||||
|   a) | ||||
|  | ||||
| (undef median-of-three) | ||||
| (undef sort-help) | ||||
| (undef insertion-sort) | ||||
|  | ||||
| (defn sort-by | ||||
|   `Returns a new sorted array that compares elements by invoking | ||||
|   | ||||
| @@ -268,14 +268,13 @@ int32_t janet_hash(Janet x) { | ||||
|             if (isnan(num) || isinf(num) || num == 0) { | ||||
|                 hash = 0; | ||||
|             } else { | ||||
|                 int e = 0; | ||||
|                 double rest = frexp(num, &e); | ||||
|                 int64_t intrest = (int64_t)(rest * JANET_INTMAX_DOUBLE); | ||||
|                 uint32_t accum = (uint32_t)((intrest >> 22) ^ intrest); | ||||
|                 accum ^= 0x9e3779b9 + (accum << 3) + (accum >> 2); | ||||
|                 accum += (int32_t)(e); | ||||
|                 accum ^= 0x9e3779b9 + (accum << 3) + (accum >> 2); | ||||
|                 hash = (int32_t) accum; | ||||
|                 hash = (int32_t)num; | ||||
|                 hash = ((hash >> 16) ^ hash) * 0x45d9f3b; | ||||
|                 hash = ((hash >> 16) ^ hash) * 0x45d9f3b; | ||||
|                 hash = (hash >> 16) ^ hash; | ||||
|  | ||||
|                 uint32_t lo = (uint32_t)(janet_u64(x) & 0xFFFFFFFF); | ||||
|                 hash ^= lo + 0x9e3779b9 + (hash << 6) + (hash >> 2); | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Calvin Rose
					Calvin Rose