'From Pharo0.1 of 16 May 2008 [Latest update: #10300] on 10 May 2009 at 1:01:14 am'!
"Change Set:		FasterLatin1Conversion-Part1
Date:			10 May 2009
Author:			nice

Install fast latin1 conversion Part1

generalize Andreas Raab trick from ByteString>>#squeakToUtf8
to every converter using class instance variables"!

TextConverter class
	instanceVariableNames: 'latin1Map latin1Encodings '!

!TextConverter class methodsFor: 'accessing' stamp: 'nice 5/10/2009 00:45'!
initializeLatin1MapAndEncodings
	"Initialize the latin1Map and latin1Encodings.
	These variables ensure that conversions from latin1 ByteString is reasonably fast"
	
	| latin1 utf8 |
	latin1Map := ByteArray new: 256.
	latin1Encodings := Array new: 256.
	0 to: 255 do:[:i|
		utf8 := (String new: 8) writeStream.
		latin1 := String with: (Character value: i).
		self new nextPut: latin1 first toStream: utf8.
		utf8 := utf8 contents.
		latin1 = utf8 ifTrue:[
			latin1Map at: i+1 put: 0. "no translation needed"
		] ifFalse:[
			latin1Map at: i+1 put: 1. "translation needed"
			latin1Encodings at: i+1 put: utf8.
		].
	].! !

!TextConverter class methodsFor: 'accessing' stamp: 'nice 5/9/2009 23:35'!
latin1Encodings
	"Answer an Array mapping latin1 characters to conversion string"

	^latin1Encodings ifNil:
		[self initializeLatin1MapAndEncodings.
		latin1Encodings]! !

!TextConverter class methodsFor: 'accessing' stamp: 'nice 5/9/2009 23:34'!
latin1Map
	"Answer a ByteArray map telling if latin1 characters needs conversion or not"

	^latin1Map ifNil:
		[self initializeLatin1MapAndEncodings.
		latin1Map]! !

TextConverter class
	instanceVariableNames: 'latin1Map latin1Encodings'!
