TRefCountPtr<FShader> FShaderType::FindShaderById(const FShaderId& Id) { FScopeLock MapLock(&ShaderIdMapCritical); TRefCountPtr<FShader> Result = ShaderIdMap.FindRef(Id); return Result; }
const FDecimalNumberFormattingRules& FCulture::FICUCultureImplementation::GetCurrencyFormattingRules(const FString& InCurrencyCode) { const bool bUseDefaultFormattingRules = InCurrencyCode.IsEmpty(); if (bUseDefaultFormattingRules) { if (UECurrencyFormattingRules.IsValid()) { return *UECurrencyFormattingRules; } } else { FScopeLock MapLock(&UEAlternateCurrencyFormattingRulesCS); auto FoundUEAlternateCurrencyFormattingRules = UEAlternateCurrencyFormattingRules.FindRef(InCurrencyCode); if (FoundUEAlternateCurrencyFormattingRules.IsValid()) { return *FoundUEAlternateCurrencyFormattingRules; } } // Create a culture percent formatter (doesn't call CreateCurrencyFormat as we need a mutable instance) TSharedPtr<icu::DecimalFormat> CurrencyFormatterForCulture; { UErrorCode ICUStatus = U_ZERO_ERROR; CurrencyFormatterForCulture = MakeShareable(static_cast<icu::DecimalFormat*>(icu::NumberFormat::createCurrencyInstance(ICULocale, ICUStatus))); checkf(CurrencyFormatterForCulture.IsValid(), TEXT("Creating a currency format object failed using locale %s. Perhaps this locale has no data."), StringCast<TCHAR>(ICULocale.getName()).Get()); } if (!bUseDefaultFormattingRules) { // Set the custom currency before we extract the data from the formatter icu::UnicodeString ICUCurrencyCode = ICUUtilities::ConvertString(InCurrencyCode); CurrencyFormatterForCulture->setCurrency(ICUCurrencyCode.getBuffer()); } const FDecimalNumberFormattingRules NewUECurrencyFormattingRules = ExtractNumberFormattingRulesFromICUDecimalFormatter(*CurrencyFormatterForCulture); if (bUseDefaultFormattingRules) { // Check the pointer again in case another thread beat us to it { FScopeLock PtrLock(&UECurrencyFormattingRulesCS); if (!UECurrencyFormattingRules.IsValid()) { UECurrencyFormattingRules = MakeShareable(new FDecimalNumberFormattingRules(NewUECurrencyFormattingRules)); } } return *UECurrencyFormattingRules; } else { FScopeLock MapLock(&UEAlternateCurrencyFormattingRulesCS); // Find again in case another thread beat us to it auto FoundUEAlternateCurrencyFormattingRules = UEAlternateCurrencyFormattingRules.FindRef(InCurrencyCode); if (FoundUEAlternateCurrencyFormattingRules.IsValid()) { return *FoundUEAlternateCurrencyFormattingRules; } FoundUEAlternateCurrencyFormattingRules = MakeShareable(new FDecimalNumberFormattingRules(NewUECurrencyFormattingRules)); UEAlternateCurrencyFormattingRules.Add(InCurrencyCode, FoundUEAlternateCurrencyFormattingRules); return *FoundUEAlternateCurrencyFormattingRules; } }