Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(70)

Side by Side Diff: runtime/lib/string_patch.dart

Issue 213293002: Optimize one-byte string's toUpperCase. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Use a String as table instead of a List Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 patch class String { 5 patch class String {
6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) { 6 /* patch */ factory String.fromCharCodes(Iterable<int> charCodes) {
7 return _StringBase.createFromCharCodes(charCodes); 7 return _StringBase.createFromCharCodes(charCodes);
8 } 8 }
9 9
10 /* patch */ factory String.fromCharCode(int charCode) { 10 /* patch */ factory String.fromCharCode(int charCode) {
(...skipping 779 matching lines...) Expand 10 before | Expand all | Expand 10 after
790 } else { 790 } else {
791 for (int i = 0; i < delta; i++) { 791 for (int i = 0; i < delta; i++) {
792 for (int j = 0; j < padLength; j++) { 792 for (int j = 0; j < padLength; j++) {
793 result._setAt(index++, padding.codeUnitAt(j)); 793 result._setAt(index++, padding.codeUnitAt(j));
794 } 794 }
795 } 795 }
796 } 796 }
797 return result; 797 return result;
798 } 798 }
799 799
800 // Lower-case conversion table for Latin-1. 800 // Lower-case conversion table for Latin-1 as string.
801 // Upper-case ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde. 801 // Upper-case ranges: 0x41-0x5a ('A' - 'Z'), 0xc0-0xd6, 0xd8-0xde.
802 // Conversion to lower case performed by adding 0x20. 802 // Conversion to lower case performed by adding 0x20.
803 static const _LC_TABLE = const [ 803 static const _LC_TABLE =
804 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 804 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
805 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 805 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
806 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 806 "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
807 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 807 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
808 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 808 "\x40\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
809 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 809 "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x5b\x5c\x5d\x5e\x5f"
810 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 810 "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6a\x6b\x6c\x6d\x6e\x6f"
811 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 811 "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7a\x7b\x7c\x7d\x7e\x7f"
812 0x40, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 812 "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
813 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 813 "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
814 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 814 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
815 0x78, 0x79, 0x7a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 815 "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
816 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 816 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
817 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 817 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xd7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xdf"
818 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 818 "\xe0\xe1\xe2\xe3\xe4\xe5\xe6\xe7\xe8\xe9\xea\xeb\xec\xed\xee\xef"
819 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 819 "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff";
820 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 820
821 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 821 // Upper-case conversion table for Latin-1 as string.
822 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 822 // lower-case ranges: 0x61-0x7a ('a' - 'z'), 0xe0-0xff.
823 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 823 // The characters 0xb5 (µ) and 0xff (ÿ) have uper case variants
Bob Nystrom 2014/03/28 15:57:38 "uper" -> "upper".
Lasse Reichstein Nielsen 2014/04/07 08:14:18 Done, thanks.
824 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 824 // that are not Latin-1. These are both marked as 0xff in the table.
825 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 825 // The German "sharp s" \xdf (ß) should be converted into two characters (SS),
826 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 826 // and is also marked with 0xff.
827 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 827 // Conversion to lower case performed by subtracting 0x20.
828 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 828 static const _UC_TABLE =
829 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 829 "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
830 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xd7, 830 "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
831 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xdf, 831 "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2a\x2b\x2c\x2d\x2e\x2f"
832 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 832 "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3a\x3b\x3c\x3d\x3e\x3f"
833 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 833 "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
834 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 834 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x5b\x5c\x5d\x5e\x5f"
835 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 835 "\x60\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4a\x4b\x4c\x4d\x4e\x4f"
836 ]; 836 "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5a\x7b\x7c\x7d\x7e\x7f"
837 "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8a\x8b\x8c\x8d\x8e\x8f"
838 "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9a\x9b\x9c\x9d\x9e\x9f"
839 "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf"
840 "\xb0\xb1\xb2\xb3\xb4\xff\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf"
841 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
842 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xd7\xd8\xd9\xda\xdb\xdc\xdd\xde\xff"
843 "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf"
844 "\xd0\xd1\xd2\xd3\xd4\xd5\xd6\xf7\xd8\xd9\xda\xdb\xdc\xdd\xde\xff";
837 845
838 String toLowerCase() { 846 String toLowerCase() {
839 for (int i = 0; i < this.length; i++) { 847 for (int i = 0; i < this.length; i++) {
840 final c = this.codeUnitAt(i); 848 final c = this.codeUnitAt(i);
841 if (c == _LC_TABLE[c]) continue; 849 if (c == _LC_TABLE.codeUnitAt(c)) continue;
842 // Upper-case character found. 850 // Upper-case character found.
843 final result = _allocate(this.length); 851 final result = _allocate(this.length);
844 for (int j = 0; j < i; j++) { 852 for (int j = 0; j < i; j++) {
845 result._setAt(j, this.codeUnitAt(j)); 853 result._setAt(j, this.codeUnitAt(j));
846 } 854 }
847 for (int j = i; j < this.length; j++) { 855 for (int j = i; j < this.length; j++) {
848 result._setAt(j, _LC_TABLE[this.codeUnitAt(j)]); 856 result._setAt(j, _LC_TABLE.codeUnitAt(this.codeUnitAt(j)));
849 } 857 }
850 return result; 858 return result;
851 } 859 }
860 return this;
861 }
862
863 String toUpperCase() {
864 for (int i = 0; i < this.length; i++) {
865 final c = this.codeUnitAt(i);
866 if (c == _UC_TABLE.codeUnitAt(c)) continue;
867 // Check rest of string for characters that require complex handling.
868 for (int j = i; j < this.length; j++) {
869 if (_UC_TABLE.codeUnitAt(this.codeUnitAt(i)) == 0xff) {
870 return super.toUpperCase();
871 }
872 }
873 // Lower-case characters found, but no problematic ones.
874 final result = _allocate(this.length);
875 for (int j = 0; j < i; j++) {
876 result._setAt(j, this.codeUnitAt(j));
877 }
878 for (int j = i; j < this.length; j++) {
879 result._setAt(j, _UC_TABLE.codeUnitAt(this.codeUnitAt(j)));
880 }
881 return result;
882 }
852 return this; 883 return this;
853 } 884 }
854 885
855 // Allocates a string of given length, expecting its content to be 886 // Allocates a string of given length, expecting its content to be
856 // set using _setAt. 887 // set using _setAt.
857 static _OneByteString _allocate(int length) native "OneByteString_allocate"; 888 static _OneByteString _allocate(int length) native "OneByteString_allocate";
858 889
859 890
860 static _OneByteString _allocateFromOneByteList(List<int> list) 891 static _OneByteString _allocateFromOneByteList(List<int> list)
861 native "OneByteString_allocateFromOneByteList"; 892 native "OneByteString_allocateFromOneByteList";
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after
955 class _CodeUnits extends Object with ListMixin<int>, 986 class _CodeUnits extends Object with ListMixin<int>,
956 UnmodifiableListMixin<int> { 987 UnmodifiableListMixin<int> {
957 /** The string that this is the code units of. */ 988 /** The string that this is the code units of. */
958 String _string; 989 String _string;
959 990
960 _CodeUnits(this._string); 991 _CodeUnits(this._string);
961 992
962 int get length => _string.length; 993 int get length => _string.length;
963 int operator[](int i) => _string.codeUnitAt(i); 994 int operator[](int i) => _string.codeUnitAt(i);
964 } 995 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698