} else {
pos_=skipValue(pos, node);
}
- sp_.set(str_->data(), str_->length());
return TRUE;
}
if(maxLength_>0 && str_->length()==maxLength_) {
}
}
+StringPiece
+BytesTrie::Iterator::getString() const {
+ return str_ == NULL ? StringPiece() : str_->toStringPiece();
+}
+
UBool
BytesTrie::Iterator::truncateAndStop() {
pos_=NULL;
- sp_.set(str_->data(), str_->length());
value_=-1; // no real value for str
return TRUE;
}
str_->append((char)trieByte, errorCode);
if(isFinal) {
pos_=NULL;
- sp_.set(str_->data(), str_->length());
value_=value;
return NULL;
} else {
* @return The NUL-terminated byte sequence for the last successful next().
* @stable ICU 4.8
*/
- const StringPiece &getString() const { return sp_; }
+ StringPiece getString() const;
/**
* @return The value for the last successful next().
* @stable ICU 4.8
int32_t initialRemainingMatchLength_;
CharString *str_;
- StringPiece sp_;
int32_t maxLength_;
int32_t value_;
void TestTruncatingIteratorFromLinearMatchShort();
void TestTruncatingIteratorFromLinearMatchLong();
void TestIteratorFromBytes();
+ void TestFailedIterator();
void checkData(const StringAndValue data[], int32_t dataLength);
void checkData(const StringAndValue data[], int32_t dataLength, UStringTrieBuildOption buildOption);
TESTCASE_AUTO(TestTruncatingIteratorFromLinearMatchShort);
TESTCASE_AUTO(TestTruncatingIteratorFromLinearMatchLong);
TESTCASE_AUTO(TestIteratorFromBytes);
+ TESTCASE_AUTO(TestFailedIterator);
TESTCASE_AUTO_END;
}
checkIterator(iter, data, UPRV_LENGTHOF(data));
}
+void BytesTrieTest::TestFailedIterator() {
+ UErrorCode failure = U_ILLEGAL_ARGUMENT_ERROR;
+ BytesTrie::Iterator iter(NULL, 0, failure);
+ StringPiece sp = iter.getString();
+ if (!sp.empty()) {
+ errln("failed iterator returned garbage data");
+ }
+}
+
void BytesTrieTest::checkData(const StringAndValue data[], int32_t dataLength) {
logln("checkData(dataLength=%d, fast)", (int)dataLength);
checkData(data, dataLength, USTRINGTRIE_BUILD_FAST);