/************************************************************************ * * Licensed Materials - Property of IBM. * (C) Copyright IBM Corporation 2003, 2012. All Rights Reserved. * U.S. Government Users Restricted Rights: * Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp. * ************************************************************************/ #ifndef ZFORCACHE_INLINE_INCLUDE #define ZFORCACHE_INLINE_INCLUDE struct SvNumberFormatCache::SimpleDateFormatPointer { SimpleDateFormat * operator ->() const{ return mpdf; } SimpleDateFormatPointer( SimpleDateFormat * pdf, bool bCached = false ): mpdf( pdf ), mbCached( bCached ){} inline bool IsCached() const{ return mbCached; } ~SimpleDateFormatPointer(){ if( !mbCached && mpdf ) delete mpdf; } SimpleDateFormatPointer( SimpleDateFormatPointer const & r ): mpdf( r.mpdf ), mbCached( r.mbCached ){ r.mpdf = NULL; } private: mutable SimpleDateFormat * mpdf; bool mbCached; }; inline SvNumberFormatCache::SimpleDateFormatPointer SvNumberFormatCache::GetSimpleDateFormat( const UnicodeString & rPattern, const rtl::OUString & rIsoName, const ::rtl::OUString & rstrlocalCanlendarKey ) const { UErrorCode success = U_ZERO_ERROR; if( !this ) { return new SimpleDateFormat( rPattern, Locale(::rtl::OUStringToOString( rIsoName, RTL_TEXTENCODING_ASCII_US ).getStr()), success); } if( maFormatTable.size() >= this->SVNUMBERFORMAT_CACHE_SIZE ) { icuFormatTable::iterator i = maFormatTable.find( boost::make_tuple( rPattern, rIsoName, rstrlocalCanlendarKey ) ); if( i == maFormatTable.end() ) return new SimpleDateFormat( rPattern, Locale(::rtl::OUStringToOString( rIsoName, RTL_TEXTENCODING_ASCII_US ).getStr()), success); else return SimpleDateFormatPointer( i->second, true ); } std::pair< icuFormatTable::iterator, bool > i = maFormatTable.insert( std::make_pair( boost::make_tuple( rPattern, rIsoName, rstrlocalCanlendarKey ), (SimpleDateFormat*)NULL ) ); if( i.second ) { UErrorCode success = U_ZERO_ERROR; i.first->second = new SimpleDateFormat( rPattern, Locale(::rtl::OUStringToOString( rIsoName, RTL_TEXTENCODING_ASCII_US ).getStr()), success); } return SimpleDateFormatPointer( i.first->second, true ); } inline SvNumberFormatCache::~SvNumberFormatCache() { for( icuFormatTable::iterator i = maFormatTable.begin(); i!=maFormatTable.end(); i++ ) delete i->second; } #endif