[Pkg] The Trunk: Collections-eem.907.mcz
commits at source.squeak.org
commits at source.squeak.org
Thu Aug 6 19:51:50 UTC 2020
Eliot Miranda uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-eem.907.mcz
==================== Summary ====================
Name: Collections-eem.907
Author: eem
Time: 6 August 2020, 12:51:46.481296 pm
UUID: 4ea594f7-b7bf-4d48-9e7e-2e7cb3af5e70
Ancestors: Collections-mt.906
2.7x faster ByteArray>>readHexFrom:
=============== Diff against Collections-mt.906 ===============
Item was changed:
----- Method: ByteArray>>readHexFrom: (in category 'initialize') -----
readHexFrom: aStream
"Initialize the receiver from a hexadecimal string representation"
+
+ 1 to: self size do:
+ [:i| | n v1 v2 |
+ n := aStream next asInteger.
+ v1 := n > 57 "$9 asInteger = 57"
+ ifTrue:
+ [n > 96 "$a asInteger 97"
+ ifTrue: [n - 87]
+ ifFalse: [n > 64 "$A asInteger = 65"
+ ifTrue: [n - 55]
+ ifFalse: [-1]]]
+ ifFalse: [n - 48]. "$0 asInteger = 48"
+ (v1 between: 0 and: 15) ifFalse: [^self error: 'Hex digit expected'].
+ n := aStream next asInteger.
+ v2 := n > 57 "$9 asInteger = 57"
+ ifTrue:
+ [n > 96 "$a asInteger 97"
+ ifTrue: [n - 87]
+ ifFalse: [n > 64 "$A asInteger = 65"
+ ifTrue: [n - 55]
+ ifFalse: [-1]]]
+ ifFalse: [n - 48]. "$0 asInteger = 48"
+ (v2 between: 0 and: 15) ifFalse: [^self error: 'Hex digit expected'].
+ self at: i put: (v1 bitShift: 4) + v2]
+
+ "Proof that our filter selects only hexadecimal characters:
+ (0 to: 255)
+ select:
+ [:n|
+ (n > 57
+ ifTrue:
+ [n > 96
+ ifTrue: [n - 87]
+ ifFalse: [n > 64
+ ifTrue: [n - 55]
+ ifFalse: [-1]]]
+ ifFalse: [n - 48]) between: 0 and: 15]
+ thenCollect:
+ [:n| Character value: n]"!
- | map v ch value |
- map := '0123456789abcdefABCDEF'.
- 1 to: self size do:[:i|
- ch := aStream next.
- v := (map indexOf: ch) - 1.
- ((v between: 0 and: 15) or: [((v:= v - 6) between: 0 and: 15)]) ifFalse:[^self error: 'Hex digit expected'].
- value := v bitShift: 4.
- ch := aStream next.
- v := (map indexOf: ch) - 1.
- ((v between: 0 and: 15) or: [((v:= v - 6) between: 0 and: 15)]) ifFalse:[^self error: 'Hex digit expected'].
- value := value + v.
- self at: i put: value.
- ].
- !
More information about the Packages
mailing list