颠倒udata_setCommonData的顺序

时间:2013-09-07 05:29:03

标签: c++ icu

ICU的文件说明

  

从ICU 4.4开始,可以设置多个数据包,   每次调用此函数一个。 udata_open()将在中查找数据   多个数据包按照设置的顺序

但是,我希望udata_open()以相反的顺序查找数据,这样只要我添加一个新的udata_setCommonData,我就可以用我的新数据覆盖任何以前的数据。显然,如果已经实例化了使用数据的对象,它将使用旧的集合,但任何新数据都应该使用新数据。我猜这个答案是在doLoadFromCommonData附近的udata.cpp中的某个地方,希望这个变化并不太复杂。在那个函数中,我看到了

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;
    }

1 个答案:

答案 0 :(得分:0)

唯一安全(或理智)的方法是致电u_cleanup()并重新开始。否则,这根本不是ICU的良好用法,而且非常不推荐。遗憾。

如果您想动态更新数据,发出功能请求,或者更好地为其提供代码。