Updates for consistent string handling across shared library (#182)
This commit is contained in:
Родитель
2eebd7e6a1
Коммит
e99406bdf4
|
@ -103,7 +103,7 @@ TEST_CASE("IsValidCountry") {
|
||||||
|
|
||||||
TEST_CASE("GetSupportedCountries") {
|
TEST_CASE("GetSupportedCountries") {
|
||||||
ErrorInfoHandle * pErrorInfo(nullptr);
|
ErrorInfoHandle * pErrorInfo(nullptr);
|
||||||
StringBuffer * pStringBuffers(nullptr);
|
char const * const * pStringBuffers(nullptr);
|
||||||
size_t numStringBuffers;
|
size_t numStringBuffers;
|
||||||
|
|
||||||
CHECK(DateTimeFeaturizer_GetSupportedCountries(nullptr, &pStringBuffers, &numStringBuffers, &pErrorInfo));
|
CHECK(DateTimeFeaturizer_GetSupportedCountries(nullptr, &pStringBuffers, &numStringBuffers, &pErrorInfo));
|
||||||
|
@ -112,8 +112,8 @@ TEST_CASE("GetSupportedCountries") {
|
||||||
REQUIRE(numStringBuffers != 0);
|
REQUIRE(numStringBuffers != 0);
|
||||||
|
|
||||||
// Spot check a few of the values
|
// Spot check a few of the values
|
||||||
CHECK(strcmp(pStringBuffers->pString, "Argentina") == 0);
|
CHECK(strcmp(*pStringBuffers, "Argentina") == 0);
|
||||||
CHECK(strcmp((pStringBuffers + numStringBuffers - 1)->pString, "Wales") == 0);
|
CHECK(strcmp(*(pStringBuffers + numStringBuffers - 1), "Wales") == 0);
|
||||||
|
|
||||||
CHECK(DateTimeFeaturizer_DestroyStringBuffers(pStringBuffers, numStringBuffers, &pErrorInfo));
|
CHECK(DateTimeFeaturizer_DestroyStringBuffers(pStringBuffers, numStringBuffers, &pErrorInfo));
|
||||||
CHECK(pErrorInfo == nullptr);
|
CHECK(pErrorInfo == nullptr);
|
||||||
|
|
|
@ -66,7 +66,7 @@ FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_IsValidCountry(/*in*/ char const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char const *optionalDataRootDir, /*out*/ StringBuffer ** ppStringBuffers, /*out*/ std::size_t * pNumStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo) {
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char const *optionalDataRootDir, /*out*/ char const * const ** ppStringBuffers, /*out*/ std::size_t * pNumStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo) {
|
||||||
if(ppErrorInfo == nullptr)
|
if(ppErrorInfo == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -91,14 +91,14 @@ FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char
|
||||||
delete [] pData;
|
delete [] pData;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void StringBufferDeleter(StringBuffer *pData) {
|
static void StringsDeleter(char const ** pStrings) {
|
||||||
delete [] pData;
|
delete [] pStrings;
|
||||||
}
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
using StringUniquePtr = std::unique_ptr<char, void (*)(char *)>;
|
using StringUniquePtr = std::unique_ptr<char, void (*)(char *)>;
|
||||||
using StringUniquePtrs = std::vector<std::pair<StringUniquePtr, size_t>>;
|
using StringUniquePtrs = std::vector<std::pair<StringUniquePtr, size_t>>;
|
||||||
using StringBufferUniquePtr = std::unique_ptr<StringBuffer, void (*)(StringBuffer *)>;
|
using StringsUniquePtr = std::unique_ptr<char const *, void (*)(char const **)>;
|
||||||
// ----------------------------------------------------------------------
|
// ----------------------------------------------------------------------
|
||||||
|
|
||||||
// Create the strings
|
// Create the strings
|
||||||
|
@ -115,20 +115,19 @@ FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the string buffer and assign the strings
|
// Create the string buffer and assign the strings
|
||||||
StringBufferUniquePtr pStringBuffers(new StringBuffer[countries.size()], Internal::StringBufferDeleter);
|
StringsUniquePtr pStrings(new char const *[countries.size()], Internal::StringsDeleter);
|
||||||
StringBuffer * pStringBuffersPtr(pStringBuffers.get());
|
char const ** pStringsPtr(pStrings.get());
|
||||||
|
|
||||||
for(auto const & rawInfo : rawStringInfo) {
|
for(auto const & rawInfo : rawStringInfo) {
|
||||||
pStringBuffersPtr->pString = std::get<0>(rawInfo).get();
|
*pStringsPtr = std::get<0>(rawInfo).get();
|
||||||
pStringBuffersPtr->cCharacters = std::get<1>(rawInfo);
|
++pStringsPtr;
|
||||||
++pStringBuffersPtr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// If here, all memory was successfully allocated and we can release all pointers
|
// If here, all memory was successfully allocated and we can release all pointers
|
||||||
for(auto & rawInfo : rawStringInfo)
|
for(auto & rawInfo : rawStringInfo)
|
||||||
std::get<0>(rawInfo).release();
|
std::get<0>(rawInfo).release();
|
||||||
|
|
||||||
*ppStringBuffers = pStringBuffers.release();
|
*ppStringBuffers = pStrings.release();
|
||||||
*pNumStringBuffers = countries.size();
|
*pNumStringBuffers = countries.size();
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
|
@ -139,7 +138,7 @@ FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_DestroyStringBuffers(/*in*/ StringBuffer *pStringBuffer, /*in*/ std::size_t numStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo) {
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_DestroyStringBuffers(/*in*/ char const * const * pStringBuffer, /*in*/ std::size_t numStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo) {
|
||||||
if(ppErrorInfo == nullptr)
|
if(ppErrorInfo == nullptr)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
@ -152,13 +151,13 @@ FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_DestroyStringBuffers(/*in*/ Strin
|
||||||
if(pStringBuffer == nullptr)
|
if(pStringBuffer == nullptr)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
StringBuffer const * ptr(pStringBuffer);
|
char const * const * ptr(pStringBuffer);
|
||||||
StringBuffer const * const pEnd(ptr + numStringBuffers);
|
char const * const * const pEnd(ptr + numStringBuffers);
|
||||||
|
|
||||||
while(ptr != pEnd) {
|
while(ptr != pEnd) {
|
||||||
if(ptr->pString == nullptr || ptr->cCharacters == 0) throw std::invalid_argument("Invalid string element");
|
if(*ptr == nullptr) throw std::invalid_argument("Invalid string element");
|
||||||
|
|
||||||
delete [] ptr->pString;
|
delete [] *ptr;
|
||||||
++ptr;
|
++ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,19 +11,10 @@ extern "C" {
|
||||||
|
|
||||||
/* This file exposes non-standard functionality in the DateTimeFeaturizer */
|
/* This file exposes non-standard functionality in the DateTimeFeaturizer */
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API_PACK_PREFIX
|
|
||||||
|
|
||||||
struct StringBuffer {
|
|
||||||
char const * pString;
|
|
||||||
std::size_t cCharacters;
|
|
||||||
} FEATURIZER_LIBRARY_API_PACK_INLINE;
|
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API_PACK_SUFFIX
|
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_CreateTransformerFromSavedDataWithDataRoot(/*in*/ unsigned char const *pBuffer, /*in*/ std::size_t cBufferSize, /*in*/ char const *dataRootDir, /*out*/ DateTimeFeaturizer_TransformerHandle **ppTransformerHandle, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_CreateTransformerFromSavedDataWithDataRoot(/*in*/ unsigned char const *pBuffer, /*in*/ std::size_t cBufferSize, /*in*/ char const *dataRootDir, /*out*/ DateTimeFeaturizer_TransformerHandle **ppTransformerHandle, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
||||||
|
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_IsValidCountry(/*in*/ char const *countryName, /*in*/ char const *optionalDataRootDir, /*out*/ bool *isValid, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_IsValidCountry(/*in*/ char const *countryName, /*in*/ char const *optionalDataRootDir, /*out*/ bool *isValid, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char const *optionalDataRootDir, /*out*/ StringBuffer ** ppStringBuffers, /*out*/ std::size_t * pNumStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_GetSupportedCountries(/*in*/ char const *optionalDataRootDir, /*out*/ char const * const ** ppStringBuffers, /*out*/ std::size_t * pNumStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
||||||
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_DestroyStringBuffers(/*in*/ StringBuffer *pStringBuffer, /*in*/ std::size_t numStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
FEATURIZER_LIBRARY_API bool DateTimeFeaturizer_DestroyStringBuffers(/*in*/ char const * const * pStringBuffers, /*in*/ std::size_t numStringBuffers, /*out*/ ErrorInfoHandle **ppErrorInfo);
|
||||||
|
|
||||||
} // extern "C"
|
} // extern "C"
|
||||||
|
|
Загрузка…
Ссылка в новой задаче