The Trunk: Collections-ul.738.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Collections-ul.738.mcz

commits-2
Levente Uzonyi uploaded a new version of Collections to project The Trunk:
http://source.squeak.org/trunk/Collections-ul.738.mcz

==================== Summary ====================

Name: Collections-ul.738
Author: ul
Time: 27 February 2017, 12:50:24.923499 am
UUID: 3cdaac93-5a62-4fb6-8037-4323767c63a1
Ancestors: Collections-ul.737

Part #3 of Improve SequenceableCollection's index-related search methods

- fixed typo in #indexOf:startingAt:ifAbsent:
- trimmed unnecessary #ifAbsent: sends
- improved a few methods

=============== Diff against Collections-ul.737 ===============

Item was changed:
  ----- Method: ByteString>>substrings (in category 'converting') -----
  substrings
  "Answer an array of the substrings that compose the receiver."
+
+ ^Array streamContents: [ :stream |
+ | end start |
+ end := 1.
+ "find one substring each time through this loop"
+ [ "find the beginning of the next substring"
+ (start := self
+ indexOfAnyOf: CharacterSet nonSeparators
+ startingAt: end) = 0 ]
+ whileFalse: [
+ "find the end"
+ end := self
+ indexOfAnyOf: CharacterSet separators
+ startingAt: start
+ ifAbsent: [ self size + 1 ].
+ stream nextPut: (self copyFrom: start to: end - 1) ] ]!
- | result end beginning |
- result := WriteStream on: (Array new: 10).
- end := 0.
- "find one substring each time through this loop"
- [ "find the beginning of the next substring"
- beginning := self indexOfAnyOf: CharacterSet nonSeparators
- startingAt: end+1 ifAbsent: [ nil ].
- beginning ~~ nil ] whileTrue: [
- "find the end"
- end := self indexOfAnyOf: CharacterSet separators
- startingAt: beginning ifAbsent: [ self size + 1 ].
- end := end - 1.
- result nextPut: (self copyFrom: beginning to: end).
- ].
- ^result contents!

Item was changed:
  ----- Method: RWBinaryOrTextStream>>upTo: (in category 'accessing') -----
  upTo: anObject
  "fast version using indexOf:"
 
  | start end |
- start := position+1.
  isBinary
  ifTrue: [ anObject isInteger ifFalse: [ ^self upToEnd ] ]
  ifFalse: [ anObject isCharacter ifFalse: [ ^self upToEnd ] ].
+ start := position + 1.
+ end := collection indexOf: anObject asCharacter startingAt: start.
- end := collection indexOf: anObject asCharacter startingAt: start ifAbsent: [ 0 ].
  "not present--return rest of the collection"
  (end = 0 or: [end > readLimit]) ifTrue: [ ^self upToEnd ].
  "skip to the end and return the data passed over"
  position := end.
  ^((isBinary ifTrue: [ ByteArray ] ifFalse: [ String ]) new: end - start)
  replaceFrom: 1
  to: end - start
  with: collection
  startingAt: start!

Item was changed:
  ----- Method: ReadStream>>upToAnyOf:do: (in category 'accessing') -----
  upToAnyOf: aCollection do: aBlock
  "Overriden for speed"
  | end result |
+ end := collection indexOfAnyOf: aCollection startingAt: 1 + position.
- end := collection indexOfAnyOf: aCollection startingAt: 1 + position ifAbsent: [0].
  (end = 0 or: [end > readLimit]) ifTrue: [^self upToEnd].
  result := collection copyFrom: 1 + position to: -1 + end.
  position := end.
  aBlock value: (collection at: end).
  ^result!

Item was changed:
  ----- Method: SequenceableCollection>>indexOf:startingAt:ifAbsent: (in category 'accessing') -----
  indexOf: anElement startingAt: start ifAbsent: exceptionBlock
  "Answer the index of the first occurence of anElement after start
  within the receiver. If the receiver does not contain anElement,
  answer the result of evaluating the argument, exceptionBlock."
 
  | index |
+ (index := self indexOf: anElement startingAt: start) = 0 ifFalse: [ ^index ].
- (index := self indexOf: start startingAt: start) = 0 ifFalse: [ ^index ].
  ^exceptionBlock value!

Item was changed:
  ----- Method: String>>withBlanksTrimmed (in category 'converting') -----
  withBlanksTrimmed
  "Return a copy of the receiver from which leading and trailing blanks have been trimmed."
 
  | first last |
+ first := self indexOfAnyOf: CharacterSet nonSeparators startingAt: 1.
- first := self indexOfAnyOf: CharacterSet nonSeparators startingAt: 1 ifAbsent: [0].
  first = 0 ifTrue: [ ^'' ].  "no non-separator character"
  last := self lastIndexOfAnyOf: CharacterSet nonSeparators startingAt: self size ifAbsent: [self size].
  (first = 1 and: [ last = self size ]) ifTrue: [ ^self copy ].
  ^self
  copyFrom: first
  to: last
  !