1
0
forked from mirrors/0ad

No owning raw pointers in L10n.cpp.

Patch By: phosit
Differential Revision: https://code.wildfiregames.com/D4823
This was SVN commit r27413.
This commit is contained in:
vladislavbelov
2023-01-10 22:19:56 +00:00
parent 7c84c23114
commit 2442c948ba
+22 -22
View File
@@ -1,4 +1,4 @@
/* Copyright (C) 2022 Wildfire Games.
/* Copyright (C) 2023 Wildfire Games.
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
@@ -116,19 +116,22 @@ void ReadPoIntoDictionary(const std::string& poContent, tinygettext::Dictionary*
* parsing.
* @return ICU date formatter.
*/
icu::DateFormat* CreateDateTimeInstance(const L10n::DateTimeType& type, const icu::DateFormat::EStyle& style, const icu::Locale& locale)
std::unique_ptr<icu::DateFormat> CreateDateTimeInstance(const L10n::DateTimeType& type, const icu::DateFormat::EStyle& style, const icu::Locale& locale)
{
switch (type)
{
case L10n::Date:
return icu::SimpleDateFormat::createDateInstance(style, locale);
return std::unique_ptr<icu::DateFormat>{
icu::SimpleDateFormat::createDateInstance(style, locale)};
case L10n::Time:
return icu::SimpleDateFormat::createTimeInstance(style, locale);
return std::unique_ptr<icu::DateFormat>{
icu::SimpleDateFormat::createTimeInstance(style, locale)};
case L10n::DateTime:
case L10n::DateTime: FALLTHROUGH;
default:
return icu::SimpleDateFormat::createDateTimeInstance(style, style, locale);
return std::unique_ptr<icu::DateFormat>{
icu::SimpleDateFormat::createDateTimeInstance(style, style, locale)};
}
}
@@ -446,24 +449,21 @@ UDate L10n::ParseDateTime(const std::string& dateTimeString, const std::string&
icu::UnicodeString utf16DateTimeString = icu::UnicodeString::fromUTF8(dateTimeString.c_str());
icu::UnicodeString utf16DateTimeFormat = icu::UnicodeString::fromUTF8(dateTimeFormat.c_str());
icu::DateFormat* dateFormatter = new icu::SimpleDateFormat(utf16DateTimeFormat, locale, success);
UDate date = dateFormatter->parse(utf16DateTimeString, success);
delete dateFormatter;
return date;
const icu::SimpleDateFormat dateFormatter{utf16DateTimeFormat, locale, success};
return dateFormatter.parse(utf16DateTimeString, success);
}
std::string L10n::LocalizeDateTime(const UDate dateTime, const DateTimeType& type, const icu::DateFormat::EStyle& style) const
{
icu::UnicodeString utf16Date;
icu::DateFormat* dateFormatter = CreateDateTimeInstance(type, style, m_CurrentLocale);
const std::unique_ptr<const icu::DateFormat> dateFormatter{
CreateDateTimeInstance(type, style, m_CurrentLocale)};
dateFormatter->format(dateTime, utf16Date);
char utf8Date[512];
icu::CheckedArrayByteSink sink(utf8Date, ARRAY_SIZE(utf8Date));
utf16Date.toUTF8(sink);
ENSURE(!sink.Overflowed());
delete dateFormatter;
return std::string(utf8Date, sink.NumberOfBytesWritten());
}
@@ -475,21 +475,21 @@ std::string L10n::FormatMillisecondsIntoDateString(const UDate milliseconds, con
std::string resultString;
icu::UnicodeString unicodeFormat = icu::UnicodeString::fromUTF8(formatString.c_str());
icu::SimpleDateFormat* dateFormat = new icu::SimpleDateFormat(unicodeFormat, status);
icu::SimpleDateFormat dateFormat{unicodeFormat, status};
if (U_FAILURE(status))
LOGERROR("Error creating SimpleDateFormat: %s", u_errorName(status));
status = U_ZERO_ERROR;
icu::Calendar* calendar = useLocalTimezone ?
icu::Calendar::createInstance(m_CurrentLocale, status) :
icu::Calendar::createInstance(*icu::TimeZone::getGMT(), m_CurrentLocale, status);
std::unique_ptr<icu::Calendar> calendar{
useLocalTimezone ?
icu::Calendar::createInstance(m_CurrentLocale, status) :
icu::Calendar::createInstance(*icu::TimeZone::getGMT(), m_CurrentLocale, status)};
if (U_FAILURE(status))
LOGERROR("Error creating calendar: %s", u_errorName(status));
dateFormat->adoptCalendar(calendar);
dateFormat->format(milliseconds, dateString);
delete dateFormat;
dateFormat.adoptCalendar(calendar.release());
dateFormat.format(milliseconds, dateString);
dateString.toUTF8String(resultString);
return resultString;
@@ -499,8 +499,8 @@ std::string L10n::FormatDecimalNumberIntoString(double number) const
{
UErrorCode success = U_ZERO_ERROR;
icu::UnicodeString utf16Number;
icu::NumberFormat* numberFormatter = icu::NumberFormat::createInstance(m_CurrentLocale,
UNUM_DECIMAL, success);
std::unique_ptr<icu::NumberFormat> numberFormatter{
icu::NumberFormat::createInstance(m_CurrentLocale, UNUM_DECIMAL, success)};
numberFormatter->format(number, utf16Number);
char utf8Number[512];
icu::CheckedArrayByteSink sink(utf8Number, ARRAY_SIZE(utf8Number));