документация для СИС утверждает, чтореверсивный порядок udata_setCommonData
Начиная с ICU 4.4, можно установить пакеты данных, несколько один за вызов этой функции. udata_open() будет искать данные в пакетах данных в том порядке, в котором они были установлены.
Однако, я хотел бы udata_open() для поиска данных в обратном порядке, так что, как только я добавить новый udata_setCommonData, я могу переписать предыдущие данные с моими новыми данными. Очевидно, что если объект, который использует данные, был создан, он будет использовать старый набор, но любые новые данные должны использовать новые данные. Я предполагаю, что ответ находится где-то в udata.cpp около doLoadFromCommonData, надеюсь, что это не слишком сложно сделать. В этой функции, я вижу
if (!isICUData) {
return NULL;
} else if (pCommonData != NULL) {
++commonDataIndex; /* try the next data package */
} else if ((!checkedExtendedICUData) && extendICUData(subErrorCode)) {
checkedExtendedICUData = TRUE;
/* try this data package slot again: it changed from NULL to non-NULL */
} else {
return NULL;
Я подозреваю, что я хочу, чтобы начать в верхней части и использовать --commonDataIndex вместо этого.
Обновление. Я обнаружил, что я также могу поменять содержимое до тех пор, пока указатель будет таким же и повторно запустите udata_setCommonData. Возможно, это хорошее решение, которое позволяет избежать изменения кода ICU. Просто нужно выделить максимально возможный размер, с которым я мог бы столкнуться, - который, возможно, может быть сложнее.
В качестве альтернативы, способ unsetCommonData может быть хорошим.
Или, что делает хранение указатель на указатель на данные вместо указателя на данные в
for (i = 0; i < LENGTHOF(gCommonICUDataArray); ++i) {
if (gCommonICUDataArray[i] == NULL) {
gCommonICUDataArray[i] = newCommonData;
ucln_common_registerCleanup(UCLN_COMMON_UDATA, udata_cleanup);
didUpdate = TRUE;
break;
} else if (gCommonICUDataArray[i]->pHeader == pData->pHeader) {
/* The same data pointer is already in the array. */
break;
}
Я не вижу вопросительный знак в вашем вопросе. В чем вопрос снова? – lpapp
Я отправил обновленную информацию на заголовок вопроса .. –