ICU-12827 ucol_getKeywordValuesForLocale() reset the keyword-list iterator, and a little UList cleanup

X-SVN-Rev: 39484
This commit is contained in:
Markus Scherer 2016-10-26 22:05:50 +00:00
parent a082545d69
commit 2f358ce4bb
4 changed files with 30 additions and 16 deletions

View File

@ -29,7 +29,6 @@ struct UList {
UListNode *tail; UListNode *tail;
int32_t size; int32_t size;
int32_t currentIndex;
}; };
static void ulist_addFirstItem(UList *list, UListNode *newItem); static void ulist_addFirstItem(UList *list, UListNode *newItem);
@ -51,7 +50,6 @@ U_CAPI UList *U_EXPORT2 ulist_createEmptyList(UErrorCode *status) {
newList->head = NULL; newList->head = NULL;
newList->tail = NULL; newList->tail = NULL;
newList->size = 0; newList->size = 0;
newList->currentIndex = -1;
return newList; return newList;
} }
@ -80,8 +78,9 @@ static void ulist_removeItem(UList *list, UListNode *p) {
} else { } else {
p->next->previous = p->previous; p->next->previous = p->previous;
} }
list->curr = NULL; if (p == list->curr) {
list->currentIndex = 0; list->curr = p->next;
}
--list->size; --list->size;
if (p->forceDelete) { if (p->forceDelete) {
uprv_free(p->data); uprv_free(p->data);
@ -150,7 +149,6 @@ U_CAPI void U_EXPORT2 ulist_addItemBeginList(UList *list, const void *data, UBoo
newItem->next = list->head; newItem->next = list->head;
list->head->previous = newItem; list->head->previous = newItem;
list->head = newItem; list->head = newItem;
list->currentIndex++;
} }
list->size++; list->size++;
@ -193,7 +191,6 @@ U_CAPI void *U_EXPORT2 ulist_getNext(UList *list) {
curr = list->curr; curr = list->curr;
list->curr = curr->next; list->curr = curr->next;
list->currentIndex++;
return curr->data; return curr->data;
} }
@ -209,7 +206,6 @@ U_CAPI int32_t U_EXPORT2 ulist_getListSize(const UList *list) {
U_CAPI void U_EXPORT2 ulist_resetList(UList *list) { U_CAPI void U_EXPORT2 ulist_resetList(UList *list) {
if (list != NULL) { if (list != NULL) {
list->curr = list->head; list->curr = list->head;
list->currentIndex = 0;
} }
} }
@ -272,4 +268,3 @@ U_CAPI void U_EXPORT2 ulist_reset_keyword_values_iterator(UEnumeration *en, UErr
U_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) { U_CAPI UList * U_EXPORT2 ulist_getListFromEnum(UEnumeration *en) {
return (UList *)(en->context); return (UList *)(en->context);
} }

View File

@ -680,6 +680,7 @@ ucol_getKeywordValuesForLocale(const char* /*key*/, const char* locale,
return NULL; return NULL;
} }
memcpy(en, &defaultKeywordValues, sizeof(UEnumeration)); memcpy(en, &defaultKeywordValues, sizeof(UEnumeration));
ulist_resetList(sink.values); // Initialize the iterator.
en->context = sink.values; en->context = sink.values;
sink.values = NULL; // Avoid deletion in the sink destructor. sink.values = NULL; // Avoid deletion in the sink destructor.
return en; return en;

View File

@ -81,17 +81,10 @@ CollationAPITest::TestProperty(/* char* par */)
logln("Test ctors : "); logln("Test ctors : ");
col = Collator::createInstance(Locale::getEnglish(), success); col = Collator::createInstance(Locale::getEnglish(), success);
if (U_FAILURE(success)){ if (U_FAILURE(success)){
errcheckln(success, "Default Collator creation failed. - %s", u_errorName(success)); errcheckln(success, "English Collator creation failed. - %s", u_errorName(success));
return; return;
} }
StringEnumeration* kwEnum = col->getKeywordValuesForLocale("", Locale::getEnglish(),true,success);
if (U_FAILURE(success)){
errcheckln(success, "Get Keyword Values for Locale failed. - %s", u_errorName(success));
return;
}
delete kwEnum;
col->getVersion(versionArray); col->getVersion(versionArray);
// Check for a version greater than some value rather than equality // Check for a version greater than some value rather than equality
// so that we need not update the expected version each time. // so that we need not update the expected version each time.
@ -231,6 +224,29 @@ CollationAPITest::TestProperty(/* char* par */)
delete junk; delete junk;
} }
void CollationAPITest::TestKeywordValues() {
IcuTestErrorCode errorCode(*this, "TestKeywordValues");
LocalPointer<Collator> col(Collator::createInstance(Locale::getEnglish(), errorCode));
if (errorCode.logIfFailureAndReset("English Collator creation failed")) {
return;
}
LocalPointer<StringEnumeration> kwEnum(
col->getKeywordValuesForLocale("collation", Locale::getEnglish(), TRUE, errorCode));
if (errorCode.logIfFailureAndReset("Get Keyword Values for English Collator failed")) {
return;
}
assertTrue("expect at least one collation tailoring for English", kwEnum->count(errorCode) > 0);
const char *kw;
UBool hasStandard = FALSE;
while ((kw = kwEnum->next(NULL, errorCode)) != NULL) {
if (strcmp(kw, "standard") == 0) {
hasStandard = TRUE;
}
}
assertTrue("expect at least the 'standard' collation tailoring for English", hasStandard);
}
void void
CollationAPITest::TestRuleBasedColl() CollationAPITest::TestRuleBasedColl()
{ {
@ -2466,6 +2482,7 @@ void CollationAPITest::runIndexedTest( int32_t index, UBool exec, const char* &n
if (exec) logln("TestSuite CollationAPITest: "); if (exec) logln("TestSuite CollationAPITest: ");
TESTCASE_AUTO_BEGIN; TESTCASE_AUTO_BEGIN;
TESTCASE_AUTO(TestProperty); TESTCASE_AUTO(TestProperty);
TESTCASE_AUTO(TestKeywordValues);
TESTCASE_AUTO(TestOperators); TESTCASE_AUTO(TestOperators);
TESTCASE_AUTO(TestDuplicate); TESTCASE_AUTO(TestDuplicate);
TESTCASE_AUTO(TestCompare); TESTCASE_AUTO(TestCompare);

View File

@ -35,6 +35,7 @@ public:
* - displayable name in the desired locale * - displayable name in the desired locale
*/ */
void TestProperty(/* char* par */); void TestProperty(/* char* par */);
void TestKeywordValues();
/** /**
* This tests the RuleBasedCollator * This tests the RuleBasedCollator