[squeak-dev] The Trunk: Collections-ul.640.mcz
Nicolas Cellier
nicolas.cellier.aka.nice at gmail.com
Sat Aug 15 20:52:53 UTC 2015
2015-08-14 22:25 GMT+02:00 <commits at source.squeak.org>:
> Levente Uzonyi uploaded a new version of Collections to project The Trunk:
> http://source.squeak.org/trunk/Collections-ul.640.mcz
>
> ==================== Summary ====================
>
> Name: Collections-ul.640
> Author: ul
> Time: 12 August 2015, 10:35:29.572 pm
> UUID: 1065564d-36c5-43a1-842b-3be19ce91a3e
> Ancestors: Collections-cmm.639
>
> Character:
> - sped up various methods by storing and reusing the result of #asInteger
> in a temporary variable.
> - sped up #isSeparator by eliminating the last branch. Swapped the tab and
> cr checks, because source code has more tabs than crs.
> - unified methods with mixed #asInteger and #asciiValue sends
> - #isAscii uses #< instead of #between:and:, like #isOctetCharacter does.
> - #asUnicode uses the same shortcut as #encodedCharSet does
> - quick return in #printOn: and #storeOn:
>
> String:
> - added identity check (should help with Text comparison) and quick
> returns to #=
> - spaceship operator uses #compare: if the argument is a string
> - added a fast #asSignedInteger implementation
>
> Text:
> - removed the identity check from Text >> #=, because String >> #= does it
> - the spaceship operator uses String's spaceship operator
>
> =============== Diff against Collections-cmm.639 ===============
>
> Item was changed:
> ----- Method: Character>>< (in category 'comparing') -----
> < aCharacter
> "Answer true if the receiver's value < aCharacter's value."
>
> + ^self asInteger < aCharacter asInteger!
> - ^self asInteger < aCharacter asciiValue!
>
> Item was changed:
> ----- Method: Character>><= (in category 'comparing') -----
> <= aCharacter
> "Answer true if the receiver's value <= aCharacter's value."
>
> + ^self asInteger <= aCharacter asInteger!
> - ^self asInteger <= aCharacter asciiValue!
>
> Item was changed:
> ----- Method: Character>>> (in category 'comparing') -----
> > aCharacter
> "Answer true if the receiver's value > aCharacter's value."
>
> + ^self asInteger > aCharacter asInteger!
> - ^self asInteger > aCharacter asciiValue!
>
> Item was changed:
> ----- Method: Character>>>= (in category 'comparing') -----
> >= aCharacter
> "Answer true if the receiver's value >= aCharacter's value."
>
> + ^self asInteger >= aCharacter asInteger!
> - ^self asInteger >= aCharacter asciiValue!
>
> Item was changed:
> ----- Method: Character>>asLowercase (in category 'converting') -----
> asLowercase
> "Answer the receiver's matching lowercase Character."
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> - self asInteger > 255 ifFalse: [
> | result |
> + (result := (ClassificationTable at: integerValue + 1)
> bitAnd: 16rFF) > 0
> - (result := (ClassificationTable at: self asInteger + 1)
> bitAnd: 16rFF) > 0
> ifTrue: [ ^self class value: result ] ].
> + ^self class value: (self encodedCharSet toLowercaseCode:
> integerValue)!
> - ^self class value: (self encodedCharSet toLowercaseCode: self
> asInteger)!
>
> Item was changed:
> ----- Method: Character>>asUnicode (in category 'converting') -----
> asUnicode
> "Answer the unicode encoding of the receiver"
> +
> + | integerValue |
> + (integerValue := self asInteger) <= 16r3FFFFF ifTrue: [
> ^integerValue ].
> + ^self encodedCharSet charsetClass convertToUnicode: (integerValue
> bitAnd: 16r3FFFFF)
> - self leadingChar = 0 ifTrue: [^ self asInteger].
> - ^self encodedCharSet charsetClass convertToUnicode: self charCode
> !
>
> Item was changed:
> ----- Method: Character>>asUppercase (in category 'converting') -----
> asUppercase
> "Answer the receiver's matching uppercase Character."
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> - self asInteger > 255 ifFalse: [
> | result |
> + (result := ((ClassificationTable at: integerValue + 1)
> bitShift: -8) bitAnd: 16rFF) > 0
> - (result := ((ClassificationTable at: self asInteger + 1)
> bitShift: -8) bitAnd: 16rFF) > 0
> ifTrue: [ ^self class value: result ] ].
> + ^self class value: (self encodedCharSet toUppercaseCode:
> integerValue)!
> - ^self class value: (self encodedCharSet toUppercaseCode: self
> asInteger)!
>
> Item was changed:
> ----- Method: Character>>digitValue (in category 'accessing') -----
> digitValue
> "Answer 0-9 if the receiver is $0-$9, 10-35 if it is $A-$Z, and < 0
> otherwise. This is used to parse literal numbers of radix 2-36."
>
> + | integerValue |
> + (integerValue := self asInteger) > 16rFF ifTrue: [^self
> encodedCharSet digitValueOf: self].
> + ^DigitValues at: integerValue + 1!
> - self asInteger > 16rFF ifTrue: [^self encodedCharSet digitValueOf:
> self].
> - ^DigitValues at: 1 + self asInteger!
>
> Item was changed:
> ----- Method: Character>>isAlphaNumeric (in category 'testing') -----
> isAlphaNumeric
> "Answer whether the receiver is a letter or a digit."
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> + ^((ClassificationTable at: integerValue + 1) bitAnd:
> AlphaNumericMask) > 0 ].
> - self asInteger > 255 ifFalse: [ ^((ClassificationTable at: self
> asInteger + 1) bitAnd: AlphaNumericMask) > 0 ].
> ^self encodedCharSet isAlphaNumeric: self!
>
> Item was changed:
> ----- Method: Character>>isAscii (in category 'testing') -----
> isAscii
> +
> + ^self asInteger < 128!
> - ^ self asInteger between: 0 and: 127!
>
> Item was changed:
> ----- Method: Character>>isDigit (in category 'testing') -----
> isDigit
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> + ^((ClassificationTable at: integerValue + 1) bitAnd:
> DigitBit) > 0 ].
> - self asInteger > 255 ifFalse: [ ^((ClassificationTable at: self
> asInteger + 1) bitAnd: DigitBit) > 0 ].
> ^self encodedCharSet isDigit: self.
> !
>
> Item was changed:
> ----- Method: Character>>isLetter (in category 'testing') -----
> isLetter
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> + ^((ClassificationTable at: integerValue + 1) bitAnd:
> LetterMask) > 0 ].
> - self asInteger > 255 ifFalse: [ ^((ClassificationTable at: self
> asInteger + 1) bitAnd: LetterMask) > 0 ].
> ^self encodedCharSet isLetter: self!
>
> Item was changed:
> ----- Method: Character>>isLowercase (in category 'testing') -----
> isLowercase
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> + ^((ClassificationTable at: integerValue + 1) bitAnd:
> LowercaseBit) > 0 ].
> - self asInteger > 255 ifFalse: [ ^((ClassificationTable at: self
> asInteger + 1) bitAnd: LowercaseBit) > 0 ].
> ^self encodedCharSet isLowercase: self.
> !
>
> Item was changed:
> ----- Method: Character>>isSeparator (in category 'testing') -----
> isSeparator
> "Answer whether the receiver is one of the separator
> characters--space,
> cr, tab, line feed, or form feed."
>
> + | integerValue |
> + (integerValue := self asInteger) = 32 ifTrue: [ ^true ].
> "space"
> + integerValue = 9 ifTrue: [ ^true ]. "tab"
> + integerValue = 13 ifTrue: [ ^true ]. "cr"
> + integerValue = 10 ifTrue: [ ^true ]. "line feed"
> + ^integerValue = 12 "form feed"!
> - self asInteger = 32 ifTrue: [^true]. "space"
> - self asInteger = 13 ifTrue: [^true]. "cr"
> - self asInteger = 9 ifTrue: [^true]. "tab"
> - self asInteger = 10 ifTrue: [^true]. "line feed"
> - self asInteger = 12 ifTrue: [^true]. "form feed"
> - ^false!
>
> Item was changed:
> ----- Method: Character>>isUppercase (in category 'testing') -----
> isUppercase
>
> + | integerValue |
> + (integerValue := self asInteger) > 255 ifFalse: [
> + ^((ClassificationTable at: integerValue + 1) bitAnd:
> UppercaseBit) > 0 ].
> - self asInteger > 255 ifFalse: [ ^((ClassificationTable at: self
> asInteger + 1) bitAnd: UppercaseBit) > 0 ].
> ^self encodedCharSet isUppercase: self.
> !
>
> Item was changed:
> ----- Method: Character>>printOn: (in category 'printing') -----
> printOn: aStream
> +
> + | integerValue |
> + ((integerValue := self asInteger) > 32 and: [ integerValue ~= 127
> ]) ifTrue: [
> + aStream nextPut: $$; nextPut: self.
> + ^self ].
> + (self class constantNameFor: self)
> + ifNotNil: [ :name | aStream nextPutAll: self class name;
> space; nextPutAll: name ]
> + ifNil: [ aStream nextPutAll: self class name; nextPutAll:
> ' value: '; print: integerValue ]!
> - | name |
> - (self asInteger > 32 and: [self asInteger ~= 127])
> - ifTrue: [ aStream nextPut: $$; nextPut: self ]
> - ifFalse: [
> - name := self class constantNameFor: self.
> - name notNil
> - ifTrue: [ aStream nextPutAll: self class
> name; space; nextPutAll: name ]
> - ifFalse: [ aStream nextPutAll: self class
> name; nextPutAll: ' value: '; print: self asInteger ] ].!
>
> Item was changed:
> ----- Method: Character>>shouldBePrintedAsLiteral (in category
> 'testing') -----
> shouldBePrintedAsLiteral
>
> + | integerValue |
> + ^((integerValue := self asInteger) between: 33 and: 255) and:
> [self asInteger ~= 127]!
>
I guess you forgot to use your fresh integerValue here in the and block ;)
--^
> - ^(self asInteger between: 33 and: 255) and: [self asInteger ~=
> 127]!
>
> Item was changed:
> ----- Method: Character>>storeBinaryOn: (in category 'printing') -----
> storeBinaryOn: aStream
> "Store the receiver on a binary (file) stream"
>
> + | integerValue |
> + (integerValue := self asInteger) < 256
> - self asInteger < 256
> ifTrue: [ aStream basicNextPut: self ]
> + ifFalse: [ aStream nextInt32Put: integerValue ]!
> - ifFalse: [ aStream nextInt32Put: self asInteger ]!
>
> Item was changed:
> ----- Method: Character>>storeDataOn: (in category 'object fileIn') -----
> storeDataOn: aDataStream
> " Store characters in reference-like way, with value like instvar.
> This is compatible with various Squeak Memory Systems"
>
> aDataStream
> beginInstance: self class
> + size: 1;
> + nextPut: self asInteger!
> - size: 1.
> - aDataStream nextPut: self asInteger.!
>
> Item was changed:
> ----- Method: Character>>storeOn: (in category 'printing') -----
> storeOn: aStream
> "Common character literals are preceded by '$', however special
> need to be encoded differently: for some this might be done by using one of
> the shortcut constructor methods for the rest we have to create them by
> ascii-value."
>
> + self shouldBePrintedAsLiteral ifTrue: [
> + aStream nextPut: $$; nextPut: self.
> + ^self ].
> + (self class constantNameFor: self) ifNotNil: [ :name |
> + aStream nextPutAll: self class name; space; nextPutAll:
> name.
> + ^self ].
> + aStream
> + nextPut: $(; nextPutAll: self class name;
> + nextPutAll: ' value: '; print: self asInteger; nextPut: $)!
> - | name |
> - self shouldBePrintedAsLiteral
> - ifTrue: [ aStream nextPut: $$; nextPut: self ]
> - ifFalse: [
> - name := self class constantNameFor: self.
> - name notNil
> - ifTrue: [ aStream nextPutAll: self class
> name; space; nextPutAll: name ]
> - ifFalse: [
> - aStream
> - nextPut: $(; nextPutAll:
> self class name;
> - nextPutAll: ' value: ';
> print: self asInteger; nextPut: $) ] ].!
>
> Item was changed:
> ----- Method: CharacterSet>>includes: (in category 'collection ops')
> -----
> includes: aCharacter
> +
> + | index |
> + (index := aCharacter asInteger + 1) > 256 ifTrue: [ ^false ].
> + ^(map at: index) > 0!
> - aCharacter asciiValue >= 256
> - ifTrue: ["Guard against wide characters"
> - ^false].
> - ^(map at: aCharacter asciiValue + 1) > 0!
>
> Item was changed:
> ----- Method: String>><=> (in category 'sorting') -----
> <=> aCharacterArray
> "Return a collation order of -1, 0, or 1, indicating whether I
> should be collated before the receiver, am equal, or after.
> See also: http://en.wikipedia.org/wiki/Spaceship_operator"
>
> + aCharacterArray isString ifTrue: [ ^(self compare:
> aCharacterArray) - 2 ].
> + self = aCharacterArray ifTrue: [ ^0 ].
> + self < aCharacterArray ifTrue: [ ^-1 ].
> + ^1!
> - ^self = aCharacterArray
> - ifTrue: [ 0 ]
> - ifFalse: [self < aCharacterArray
> - ifTrue: [ -1 ]
> - ifFalse: [ 1 ]]!
>
> Item was changed:
> ----- Method: String>>= (in category 'comparing') -----
> = aString
> "Answer whether the receiver sorts equally as aString.
> The collation order is simple ascii (with case differences)."
>
> + self == aString ifTrue: [ ^true ].
> + aString isString ifFalse: [ ^false ].
> + self size = aString size ifFalse: [ ^false ].
> - (aString isString
> - and: [self size = aString size]) ifFalse: [^ false].
> ^ (self compare: self with: aString collated: AsciiOrder) = 2!
>
> Item was changed:
> ----- Method: String>>asSignedInteger (in category 'converting') -----
> asSignedInteger
> "Returns the first signed integer it can find or nil."
>
> + | result character index negative |
> + (self at: 1) isDigit
> + ifTrue: [ index := 1 ]
> + ifFalse: [
> + index := self findFirst: [ :char | char isDigit ].
> + index = 0 ifTrue: [ ^nil ] ].
> + negative := index > 1 and: [ (self at: index - 1) == $- ].
> + result := 0.
> + [ index <= self size and: [ (character := self at: index) isDigit
> ] ] whileTrue: [
> + result := result * 10 + character asciiValue - 48 "$0
> asciiValue".
> + index := index + 1 ].
> + negative ifTrue: [ ^0 - result ].
> + ^result
> + !
> - | start |
> - start := self findFirst: [:char | char isDigit].
> - start isZero ifTrue: [^ nil].
> - (start > 1 and: [self at: start - 1]) = $- ifTrue: [start := start
> - 1].
> - ^ Integer readFrom: (ReadStream on: self from: start to: self
> size)!
>
> Item was changed:
> ----- Method: Text>><=> (in category 'sorting') -----
> <=> aCharacterArray
> "Return a collation order of -1, 0, or 1, indicating whether I
> should be collated before the receiver, am equal, or after.
> See also: http://en.wikipedia.org/wiki/Spaceship_operator"
>
> + aCharacterArray isString ifTrue: [ ^string <=> aCharacterArray ].
> + ^string <=> aCharacterArray asString!
> - ^string = aCharacterArray
> - ifTrue: [ 0 ]
> - ifFalse: [string < aCharacterArray asString
> - ifTrue: [ -1 ]
> - ifFalse: [ 1 ]]!
>
> Item was changed:
> ----- Method: Text>>= (in category 'comparing') -----
> = other
> "Am I equal to the other Text or String?
> ***** Warning ***** Two Texts are considered equal if they have
> the same characters in them. They might have completely different
> emphasis, fonts, sizes, text actions, or embedded morphs. If you need to
> find out if one is a true copy of the other, you must do (text1 = text2
> and: [text1 runs = text2 runs])."
>
> + other isText ifTrue: [ ^string = other string ].
> + other isString ifTrue: [ ^string = other ].
> + ^false!
> - other isText ifTrue: ["This is designed to run fast even for
> megabytes"
> - ^ string == other string or: [string =
> other string]].
> - other isString ifTrue: [^ string == other or: [string = other]].
> - ^ false!
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.squeakfoundation.org/pipermail/squeak-dev/attachments/20150815/28f2ed3f/attachment.htm
More information about the Squeak-dev
mailing list
|