Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 | 10 |
| (...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 106 return 1; | 106 return 1; |
| 107 } | 107 } |
| 108 } | 108 } |
| 109 if (thisLength < otherLength) return -1; | 109 if (thisLength < otherLength) return -1; |
| 110 if (thisLength > otherLength) return 1; | 110 if (thisLength > otherLength) return 1; |
| 111 return 0; | 111 return 0; |
| 112 } | 112 } |
| 113 | 113 |
| 114 bool _substringMatches(int start, String other) { | 114 bool _substringMatches(int start, String other) { |
| 115 if (other.isEmpty) return true; | 115 if (other.isEmpty) return true; |
| 116 if ((start < 0) || (start >= this.length)) { | |
| 117 return false; | |
| 118 } | |
| 119 final int len = other.length; | 116 final int len = other.length; |
| 120 if ((start + len) > this.length) { | 117 if ((start < 0) || (start + len > this.length)) { |
| 121 return false; | 118 return false; |
| 122 } | 119 } |
| 123 for (int i = 0; i < len; i++) { | 120 for (int i = 0; i < len; i++) { |
| 124 if (this.codeUnitAt(i + start) != other.codeUnitAt(i)) { | 121 if (this.codeUnitAt(i + start) != other.codeUnitAt(i)) { |
| 125 return false; | 122 return false; |
| 126 } | 123 } |
| 127 } | 124 } |
| 128 return true; | 125 return true; |
| 129 } | 126 } |
| 130 | 127 |
| 131 bool endsWith(String other) { | 128 bool endsWith(String other) { |
| 132 return _substringMatches(this.length - other.length, other); | 129 return _substringMatches(this.length - other.length, other); |
| 133 } | 130 } |
| 134 | 131 |
| 135 bool startsWith(String other) { | 132 bool startsWith(Pattern pattern) { |
| 136 return _substringMatches(0, other); | 133 if (pattern is String) { |
| 134 return _substringMatches(0, pattern); | |
| 135 } | |
| 136 return pattern.matchAsPrefix(this, 0) != null; | |
| 137 } | 137 } |
| 138 | 138 |
| 139 int indexOf(String other, [int start = 0]) { | 139 int indexOf(Pattern pattern, [int start = 0]) { |
| 140 if (other.isEmpty) { | 140 if (start < 0 || start > this.length) { |
| 141 return start < this.length ? start : this.length; | 141 throw new RangeError.range(start, 0, this.length); |
| 142 } | 142 } |
| 143 if ((start < 0) || (start >= this.length)) { | 143 if (pattern is String) { |
| 144 String other = pattern; | |
| 145 int maxIndex = this.length - other.length; | |
| 146 // Consider using an efficient string search (e.g. BMH). | |
|
floitsch
2013/06/13 11:54:58
Make this a TODO.
Lasse Reichstein Nielsen
2013/06/13 12:37:49
Done.
| |
| 147 for (int index = start; index <= maxIndex; index++) { | |
| 148 if (_substringMatches(index, other)) { | |
| 149 return index; | |
| 150 } | |
| 151 } | |
| 144 return -1; | 152 return -1; |
| 145 } | 153 } |
| 146 int len = this.length - other.length + 1; | 154 for (int i = start; i <= this.length; i++) { |
| 147 for (int index = start; index < len; index++) { | 155 if (pattern.matchAsPrefix(this, i) != null) return i; |
| 148 if (_substringMatches(index, other)) { | |
| 149 return index; | |
| 150 } | |
| 151 } | 156 } |
| 152 return -1; | 157 return -1; |
| 153 } | 158 } |
| 154 | 159 |
| 155 int lastIndexOf(String other, [int start = null]) { | 160 int lastIndexOf(Pattern pattern, [int start = null]) { |
| 156 if (start == null) start = length - 1; | 161 if (start == null) { |
| 157 if (other.isEmpty) { | 162 start = this.length; |
| 158 return min(this.length, start); | 163 } else if (start < 0 || start > this.length) { |
| 164 throw new RangeError.range(start, 0, this.length); | |
| 159 } | 165 } |
| 160 if (start >= this.length) { | 166 if (pattern is String) { |
| 161 start = this.length - 1; | 167 String other = pattern; |
| 168 int maxIndex = this.length - other.length; | |
| 169 if (maxIndex < start) start = maxIndex; | |
| 170 for (int index = start; index >= 0; index--) { | |
| 171 if (_substringMatches(index, other)) { | |
| 172 return index; | |
| 173 } | |
| 174 } | |
| 175 return -1; | |
| 162 } | 176 } |
| 163 for (int index = start; index >= 0; index--) { | 177 for (int i = start; i >= 0; i--) { |
| 164 if (_substringMatches(index, other)) { | 178 // This has quadratic behavior because matchAsPrefix tries to find a later |
|
floitsch
2013/06/13 11:54:58
TODO(..): currently this has quadratic behavior be
Lasse Reichstein Nielsen
2013/06/13 12:37:49
Done.
| |
| 165 return index; | 179 // match too. Optimize matchAsPrefix to avoid this. |
| 166 } | 180 if (pattern.matchAsPrefix(this, i) != null) return i; |
| 167 } | 181 } |
| 168 return -1; | 182 return -1; |
| 169 } | 183 } |
| 170 | 184 |
| 171 String substring(int startIndex, [int endIndex]) { | 185 String substring(int startIndex, [int endIndex]) { |
| 172 if (endIndex == null) endIndex = this.length; | 186 if (endIndex == null) endIndex = this.length; |
| 173 | 187 |
| 174 if ((startIndex < 0) || (startIndex > this.length)) { | 188 if ((startIndex < 0) || (startIndex > this.length)) { |
| 175 throw new RangeError.value(startIndex); | 189 throw new RangeError.value(startIndex); |
| 176 } | 190 } |
| (...skipping 437 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 614 class _CodeUnits extends Object with ListMixin<int>, | 628 class _CodeUnits extends Object with ListMixin<int>, |
| 615 UnmodifiableListMixin<int> { | 629 UnmodifiableListMixin<int> { |
| 616 /** The string that this is the code units of. */ | 630 /** The string that this is the code units of. */ |
| 617 String _string; | 631 String _string; |
| 618 | 632 |
| 619 _CodeUnits(this._string); | 633 _CodeUnits(this._string); |
| 620 | 634 |
| 621 int get length => _string.length; | 635 int get length => _string.length; |
| 622 int operator[](int i) => _string.codeUnitAt(i); | 636 int operator[](int i) => _string.codeUnitAt(i); |
| 623 } | 637 } |
| OLD | NEW |