dmitryh 2004/11/08 10:06:20
Modified: c/src/xalanc/ICUBridge ICUBridge.cpp ICUBridge.hpp
ICUBridgeCollationCompareFunctor.cpp
ICUBridgeCollationCompareFunctor.hpp
ICUBridgeCollationCompareFunctorImpl.cpp
ICUBridgeCollationCompareFunctorImpl.hpp
ICUFormatNumberFunctor.cpp
ICUFormatNumberFunctor.hpp
ICUXalanNumberFormatFactory.cpp
ICUXalanNumberFormatFactory.hpp
ICUXalanNumberFormatProxy.cpp
ICUXalanNumberFormatProxy.hpp
Log:
Initial implementation on the pluggable memory management
Revision Changes Path
1.7 +32 -57 xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.cpp
Index: ICUBridge.cpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.cpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ICUBridge.cpp 31 Jul 2004 06:05:03 -0000 1.6
+++ ICUBridge.cpp 8 Nov 2004 18:06:19 -0000 1.7
@@ -34,7 +34,7 @@
-typedef XalanVector<UChar> UCharVectorType;
+typedef XalanVector<UChar> UCharVectorType;
@@ -66,7 +66,8 @@
const UnicodeString
-ICUBridge::XalanDOMCharStringToUnicodeString(const XalanDOMChar*
theString)
+ICUBridge::XalanDOMCharStringToUnicodeString(MemoryManagerType&
theManager,
+ const XalanDOMChar*
theString)
{
if (theString == 0)
{
@@ -74,16 +75,25 @@
}
else
{
- return XalanDOMCharStringToUnicodeString(theString,
length(theString));
+ return XalanDOMCharStringToUnicodeString(theManager, theString,
length(theString));
}
}
+#if defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
const UnicodeString
ICUBridge::XalanDOMCharStringToUnicodeString(
+ MemoryManagerType& theManager,
+ const XalanDOMChar* theString,
+ XalanDOMString::size_type theLength)
+#else
+const UnicodeString
+ICUBridge::XalanDOMCharStringToUnicodeString(
+ MemoryManagerType& /* theManager */,
const XalanDOMChar* theString,
XalanDOMString::size_type theLength)
+#endif
{
assert(theString != 0);
@@ -110,7 +120,7 @@
else
{
// Create a buffer to copy out the UnicodeString data...
- UCharVectorType theBuffer;
+ UCharVectorType theBuffer(theManager);
// Resize the buffer appropriately...
theBuffer.resize(theLength);
@@ -134,16 +144,19 @@
const UnicodeString
-ICUBridge::XalanDOMStringToUnicodeString(const XalanDOMString&
theString)
+ICUBridge::XalanDOMStringToUnicodeString(MemoryManagerType& theManager,
+ const XalanDOMString&
theString)
{
// Just call up to the XalanDOMChar* version...
- return XalanDOMCharStringToUnicodeString(c_wstr(theString),
length(theString));
+ return XalanDOMCharStringToUnicodeString(theManager, c_wstr(theString),
length(theString));
}
-const XalanDOMString
-ICUBridge::UnicodeStringToXalanDOMString(const UnicodeString&
theString)
+XalanDOMString&
+ICUBridge::UnicodeStringToXalanDOMString(
+ const UnicodeString&
theString,
+ XalanDOMString& theResult)
{
const int32_t theLength = theString.length();
@@ -151,7 +164,7 @@
// If XalanDOMChar is larger than the ICU's UChar, we have to more
work...
// Create a buffer...
- XalanDOMCharVectorType theBuffer;
+ XalanDOMCharVectorType theBuffer(theResult.getMemoryManager());
// Reserve the appropriate amount of space...
theBuffer.reserve(theLength);
@@ -162,7 +175,9 @@
theBuffer.push_back(theString[i]);
}
- return XalanDOMString(&theBuffer[0], theBuffer.size());
+ theResult.assign(&theBuffer[0], theBuffer.size());
+
+ return theResult;
#else
@@ -173,12 +188,14 @@
// Extract the data...
theString.extract(0, theLength, theBuffer);
- return XalanDOMString(theBuffer, theLength);
+ theResult.assign(theBuffer, theLength);
+
+ return theResult;
}
else
{
// Create a buffer to copy out the UnicodeString data...
- UCharVectorType theBuffer;
+ UCharVectorType theBuffer(theResult.getMemoryManager());
// Resize the buffer appropriately...
theBuffer.resize(theLength);
@@ -188,55 +205,13 @@
assert(theLength == int32_t(theBuffer.size()));
- return XalanDOMString(&theBuffer[0], theLength);
+ theResult.assign(&theBuffer[0], theLength);
+
+ return theResult;
}
#endif
}
-
-void
-ICUBridge::UnicodeStringToXalanDOMString(
- const UnicodeString& theString,
- XalanDOMString& theResult)
-{
-#if defined(XALAN_XALANDOMCHAR_USHORT_MISMATCH)
-
- // If XalanDOMChar is larger than the ICU's UChar, we have to more work.
- // Don't bother to provide the optimized version, just call to the
- // previous function.
-
- theResult = UnicodeStringToXalanDOMString(theString);
-
-#else
-
- const int32_t theLength = theString.length();
-
- if (theStackBufferSize > theLength)
- {
- UChar theBuffer[theStackBufferSize];
-
- // Extract the data...
- theString.extract(0, theLength, theBuffer);
-
- theResult = XalanDOMString(theBuffer, theLength);
- }
- else
- {
- typedef XalanVector<UChar> UCharVectorType;
-
- // Create a buffer to copy out the UnicodeString data...
- UCharVectorType theBuffer;
-
- // Resize the buffer appropriately...
- theBuffer.resize(theLength);
-
- // Extract the data...
- theString.extract(0, theLength, &theBuffer[0]);
-
- theResult = XalanDOMString(&theBuffer[0], theBuffer.size());
- }
-#endif
-}
XALAN_CPP_NAMESPACE_END
1.7 +6 -6 xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.hpp
Index: ICUBridge.hpp
===================================================================
RCS file: /home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridge.hpp,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ICUBridge.hpp 12 Mar 2004 22:27:12 -0000 1.6
+++ ICUBridge.hpp 8 Nov 2004 18:06:19 -0000 1.7
@@ -40,20 +40,20 @@
public:
static const UnicodeString
- XalanDOMCharStringToUnicodeString(const XalanDOMChar* theString);
+ XalanDOMCharStringToUnicodeString(MemoryManagerType& theManager,
+ const XalanDOMChar* theString);
static const UnicodeString
XalanDOMCharStringToUnicodeString(
+ MemoryManagerType& theManager,
const XalanDOMChar* theString,
XalanDOMString::size_type theLHSLength);
static const UnicodeString
- XalanDOMStringToUnicodeString(const XalanDOMString&
theString);
+ XalanDOMStringToUnicodeString(MemoryManagerType& theManager,
+ const XalanDOMString&
theString);
- static const XalanDOMString
- UnicodeStringToXalanDOMString(const UnicodeString& theString);
-
- static void
+ static XalanDOMString&
UnicodeStringToXalanDOMString(
const UnicodeString& theString,
XalanDOMString& theResult);
1.6 +21 -3
xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.cpp
Index: ICUBridgeCollationCompareFunctor.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ICUBridgeCollationCompareFunctor.cpp 26 Feb 2004 23:07:12 -0000
1.5
+++ ICUBridgeCollationCompareFunctor.cpp 8 Nov 2004 18:06:19 -0000
1.6
@@ -21,22 +21,40 @@
#include "ICUBridge.hpp"
#include "ICUBridgeCollationCompareFunctorImpl.hpp"
+#include <xalanc/Include/XalanMemMgrHelper.hpp>
XALAN_CPP_NAMESPACE_BEGIN
-ICUBridgeCollationCompareFunctor::ICUBridgeCollationCompareFunctor(bool
fCacheCollators) :
- m_impl(new ICUBridgeCollationCompareFunctorImpl(fCacheCollators))
+ICUBridgeCollationCompareFunctor::ICUBridgeCollationCompareFunctor(
+ MemoryManagerType& theManager, bool fCacheCollators) :
+ m_impl(ICUBridgeCollationCompareFunctorImpl::create(theManager,
fCacheCollators))
{
}
+ICUBridgeCollationCompareFunctor*
+ICUBridgeCollationCompareFunctor::create (MemoryManagerType& theManager ,
bool fCacheCollators)
+{
+ typedef ICUBridgeCollationCompareFunctor ThisType;
+
+ XalanMemMgrAutoPtr<ThisType, false> theGuard( theManager ,
(ThisType*)theManager.allocate(sizeof(ThisType)));
+
+ ThisType* theResult = theGuard.get();
+
+ new (theResult) ThisType(theManager, fCacheCollators);
+ theGuard.release();
+
+ return theResult;
+}
ICUBridgeCollationCompareFunctor::~ICUBridgeCollationCompareFunctor()
{
- delete m_impl;
+ MemoryManagerType& theManager = m_impl->getMemoryManager();
+
+ destroyObjWithMemMgr(m_impl, theManager);
}
1.6 +5 -1
xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.hpp
Index: ICUBridgeCollationCompareFunctor.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctor.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ICUBridgeCollationCompareFunctor.hpp 26 Feb 2004 23:07:12 -0000
1.5
+++ ICUBridgeCollationCompareFunctor.hpp 8 Nov 2004 18:06:19 -0000
1.6
@@ -44,7 +44,11 @@
*
* @param fCacheCollators If true, the instance will cache collators.
This is not thread-safe, so each thread must have its own instance.
*/
- ICUBridgeCollationCompareFunctor(bool fCacheCollators = false);
+ ICUBridgeCollationCompareFunctor(MemoryManagerType& theManager,
+ bool fCacheCollators =
false);
+
+ static ICUBridgeCollationCompareFunctor*
+ create(MemoryManagerType& theManager, bool fCacheCollators =
false);
virtual
~ICUBridgeCollationCompareFunctor();
1.6 +26 -12
xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp
Index: ICUBridgeCollationCompareFunctorImpl.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ICUBridgeCollationCompareFunctorImpl.cpp 26 Feb 2004 23:07:12 -0000
1.5
+++ ICUBridgeCollationCompareFunctorImpl.cpp 8 Nov 2004 18:06:19 -0000
1.6
@@ -26,7 +26,7 @@
#include <xalanc/Include/XalanAutoPtr.hpp>
-
+#include <xalanc/Include/XalanMemMgrAutoPtr.hpp>
#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
#include <xalanc/PlatformSupport/XalanUnicode.hpp>
@@ -41,13 +41,12 @@
-inline ICUBridgeCollationCompareFunctorImpl::CollatorType*
+inline CollatorType*
createCollator(
UErrorCode& theStatus,
const Locale& theLocale,
XalanDOMString* theLocaleName = 0)
{
- typedef ICUBridgeCollationCompareFunctorImpl::CollatorType
CollatorType;
if (theLocaleName != 0)
{
@@ -67,7 +66,7 @@
-inline ICUBridgeCollationCompareFunctorImpl::CollatorType*
+inline CollatorType*
createCollator(
UErrorCode& theStatus,
XalanDOMString* theLocaleName = 0)
@@ -95,12 +94,13 @@
-ICUBridgeCollationCompareFunctorImpl::ICUBridgeCollationCompareFunctorImpl(bool
fCacheCollators) :
+ICUBridgeCollationCompareFunctorImpl::ICUBridgeCollationCompareFunctorImpl(MemoryManagerType&
theManager,
+
bool fCacheCollators) :
m_isValid(false),
m_defaultCollator(0),
- m_defaultCollatorLocaleName(),
+ m_defaultCollatorLocaleName(theManager),
m_cacheCollators(fCacheCollators),
- m_collatorCache()
+ m_collatorCache(theManager)
{
UErrorCode theStatus = U_ZERO_ERROR;
@@ -112,7 +112,21 @@
}
}
+ICUBridgeCollationCompareFunctorImpl*
+ICUBridgeCollationCompareFunctorImpl::create (MemoryManagerType& theManager
, bool fCacheCollators)
+{
+ typedef ICUBridgeCollationCompareFunctorImpl ThisType;
+
+ XalanMemMgrAutoPtr<ThisType, false> theGuard( theManager ,
(ThisType*)theManager.allocate(sizeof(ThisType)));
+
+ ThisType* theResult = theGuard.get();
+ new (theResult) ThisType(theManager, fCacheCollators);
+
+ theGuard.release();
+
+ return theResult;
+}
ICUBridgeCollationCompareFunctorImpl::~ICUBridgeCollationCompareFunctorImpl()
{
@@ -123,7 +137,7 @@
for_each(
m_collatorCache.begin(),
m_collatorCache.end(),
- CollationCacheStruct::CollatorDeleteFunctor());
+
CollationCacheStruct::CollatorDeleteFunctor(getMemoryManager()));
}
@@ -196,7 +210,7 @@
-inline ICUBridgeCollationCompareFunctorImpl::CollatorType*
+inline CollatorType*
createCollator(
const XalanDOMChar* theLocale,
UErrorCode& theStatus)
@@ -229,7 +243,7 @@
theBuffer[i] = char(theLocale[i]);
}
#endif
- return
ICUBridgeCollationCompareFunctorImpl::CollatorType::createInstance(
+ return CollatorType::createInstance(
Locale::createFromName(theBuffer),
theStatus);
}
@@ -388,7 +402,7 @@
-ICUBridgeCollationCompareFunctorImpl::CollatorType*
+CollatorType*
ICUBridgeCollationCompareFunctorImpl::getCachedCollator(const XalanDOMChar*
theLocale) const
{
XALAN_USING_STD(find_if)
@@ -462,7 +476,7 @@
theNonConstCache.pop_back();
}
- theNonConstCache.push_front(CollatorCacheListType::value_type());
+
theNonConstCache.push_front(CollatorCacheListType::value_type(getMemoryManager()));
CollatorCacheListType::value_type& theEntry =
theNonConstCache.front();
1.6 +108 -84
xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp
Index: ICUBridgeCollationCompareFunctorImpl.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctorImpl.hpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ICUBridgeCollationCompareFunctorImpl.hpp 26 Feb 2004 23:07:12 -0000
1.5
+++ ICUBridgeCollationCompareFunctorImpl.hpp 8 Nov 2004 18:06:19 -0000
1.6
@@ -23,7 +23,7 @@
-#include <list>
+#include <xalanc/Include/XalanList.hpp>
@@ -39,6 +39,99 @@
XALAN_CPP_NAMESPACE_BEGIN
+#if defined(XALAN_HAS_CPP_NAMESPACE)
+typedef U_ICU_NAMESPACE::Collator CollatorType;
+#else
+typedef Collator CollatorType;
+#endif
+
+struct CollationCacheStruct
+{
+ CollationCacheStruct(
+ MemoryManagerType& theManager,
+ const XalanDOMString& theLocale,
+ CollatorType* theCollator) :
+ m_locale(theLocale, theManager),
+ m_collator(theCollator)
+ {
+ }
+
+ CollationCacheStruct(MemoryManagerType& theManager) :
+ m_locale(theManager),
+ m_collator(0)
+ {
+ }
+
+ CollationCacheStruct( const CollationCacheStruct& other,
+ MemoryManagerType& theManager) :
+ m_locale(other.m_locale,theManager),
+ m_collator(other.m_collator)
+ {
+ }
+ void
+ swap(CollationCacheStruct& theOther)
+ {
+ m_locale.swap(theOther.m_locale);
+
+ CollatorType* const theTemp = m_collator;
+
+ m_collator = theOther.m_collator;
+
+ theOther.m_collator = theTemp;
+ }
+
+#if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION)
+ bool
+ operator<(const CollationCacheStruct& theRHS) const
+ {
+ return this < &theRHS;
+ }
+
+ bool
+ operator==(const CollationCacheStruct& theRHS) const
+ {
+ return this == &theRHS;
+ }
+#endif
+
+ XalanDOMString m_locale;
+
+ CollatorType* m_collator;
+
+ struct CollatorDeleteFunctor
+ {
+ CollatorDeleteFunctor(MemoryManagerType& theManager):
+ m_memoryManager(theManager)
+ {
+ }
+
+ void
+ operator()(CollationCacheStruct& theStruct) const
+ {
+ delete theStruct.m_collator;
+ }
+ private:
+ MemoryManagerType& m_memoryManager;
+ };
+
+ struct CollatorFindFunctor
+ {
+ CollatorFindFunctor(const XalanDOMChar* theLocale) :
+ m_locale(theLocale)
+ {
+ }
+
+ bool
+ operator()(CollationCacheStruct& theStruct) const
+ {
+ return XalanDOMString::equals(theStruct.m_locale ,m_locale);
+ }
+
+ const XalanDOMChar* const m_locale;
+ };
+};
+
+XALAN_USES_MEMORY_MANAGER(CollationCacheStruct)
class XALAN_ICUBRIDGE_EXPORT ICUBridgeCollationCompareFunctorImpl : public
XalanCollationServices::CollationCompareFunctor
{
@@ -49,10 +142,22 @@
*
* @param fCacheCollators If true, the instance will cache collators.
This is not thread-safe, so each thread must have its own instance.
*/
- ICUBridgeCollationCompareFunctorImpl(bool fCacheCollators =
false);
+ ICUBridgeCollationCompareFunctorImpl( MemoryManagerType& theManager ,
+ bool
fCacheCollators = false);
+
+ static ICUBridgeCollationCompareFunctorImpl*
+ create( MemoryManagerType& theManager,
+ bool fCacheCollators = false);
+
~ICUBridgeCollationCompareFunctorImpl();
+ MemoryManagerType&
+ getMemoryManager()const
+ {
+ return m_collatorCache.getMemoryManager();
+ }
+
int
operator()(
const XalanDOMChar*
theLHS,
@@ -72,89 +177,8 @@
return m_isValid;
}
-#if defined(XALAN_HAS_CPP_NAMESPACE)
- typedef U_ICU_NAMESPACE::Collator CollatorType;
-#else
- typedef Collator CollatorType;
-#endif
-
- struct CollationCacheStruct
- {
- CollationCacheStruct(
- const XalanDOMString& theLocale,
- CollatorType* theCollator) :
- m_locale(theLocale),
- m_collator(theCollator)
- {
- }
-
- CollationCacheStruct() :
- m_locale(),
- m_collator(0)
- {
- }
-
- void
- swap(CollationCacheStruct& theOther)
- {
- m_locale.swap(theOther.m_locale);
-
- CollatorType* const theTemp = m_collator;
-
- m_collator = theOther.m_collator;
-
- theOther.m_collator = theTemp;
- }
-#if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION)
- bool
- operator<(const CollationCacheStruct& theRHS) const
- {
- return this < &theRHS;
- }
-
- bool
- operator==(const CollationCacheStruct& theRHS) const
- {
- return this == &theRHS;
- }
-#endif
-
- XalanDOMString m_locale;
-
- CollatorType* m_collator;
-
- struct CollatorDeleteFunctor
- {
- void
- operator()(CollationCacheStruct& theStruct) const
- {
- delete theStruct.m_collator;
- }
- };
-
- struct CollatorFindFunctor
- {
- CollatorFindFunctor(const XalanDOMChar* theLocale) :
- m_locale(theLocale)
- {
- }
-
- bool
- operator()(CollationCacheStruct& theStruct) const
- {
- return
XalanDOMString::equals(theStruct.m_locale ,m_locale);
- }
-
- const XalanDOMChar* const m_locale;
- };
- };
-
-#if defined(XALAN_NO_STD_NAMESPACE)
- typedef list<CollationCacheStruct>
CollatorCacheListType;
-#else
- typedef std::list<CollationCacheStruct> CollatorCacheListType;
-#endif
+ typedef XalanList<CollationCacheStruct>
CollatorCacheListType;
enum { eCacheMax = 10 };
1.6 +39 -16
xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.cpp
Index: ICUFormatNumberFunctor.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.cpp,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ICUFormatNumberFunctor.cpp 21 Apr 2004 16:23:05 -0000 1.5
+++ ICUFormatNumberFunctor.cpp 8 Nov 2004 18:06:19 -0000 1.6
@@ -46,14 +46,32 @@
-ICUFormatNumberFunctor::ICUFormatNumberFunctor()
+ICUFormatNumberFunctor::ICUFormatNumberFunctor(MemoryManagerType&
theManager) :
+ m_decimalFormatCache(theManager),
+ m_memoryManager(theManager)
+
{
- XalanDecimalFormatSymbols defaultXalanDFS;
+ XalanDecimalFormatSymbols defaultXalanDFS(theManager);
m_defaultDecimalFormat = createDecimalFormat(defaultXalanDFS);
}
+ICUFormatNumberFunctor*
+ICUFormatNumberFunctor::create(MemoryManagerType& theManager)
+{
+ typedef ICUFormatNumberFunctor ThisType;
+
+ XalanMemMgrAutoPtr<ThisType, false> theGuard( theManager ,
(ThisType*)theManager.allocate(sizeof(ThisType)));
+
+ ThisType* theResult = theGuard.get();
+
+ new (theResult) ThisType(theManager);
+ theGuard.release();
+
+ return theResult;
+}
+
ICUFormatNumberFunctor::~ICUFormatNumberFunctor()
{
@@ -80,8 +98,10 @@
{
if (!doFormat(theNumber, thePattern, theResult, theDFS))
{
+ XalanDOMString buffer(executionContext.getMemoryManager());
+
executionContext.warn(
-
XalanMessageLoader::getMessage(XalanMessages::FormatNumberFailed),
+
XalanMessageLoader::getMessage(XalanMessages::FormatNumberFailed, buffer),
context,
locator);
}
@@ -89,7 +109,7 @@
-ICUFormatNumberFunctor::DecimalFormatType *
+DecimalFormatType *
ICUFormatNumberFunctor::getCachedDecimalFormat(const
XalanDecimalFormatSymbols &theDFS) const
{
XALAN_USING_STD(find_if)
@@ -152,7 +172,11 @@
return doICUFormat(theNumber,thePattern,theResult);
}
- XalanDOMString nonLocalPattern =
UnlocalizePatternFunctor(*theDFS)(thePattern);
+ XalanDOMString nonLocalPattern(theResult.getMemoryManager());
+
+ UnlocalizePatternFunctor formatter(*theDFS);
+
+ formatter(thePattern, nonLocalPattern);
DecimalFormatType* theFormatter = getCachedDecimalFormat(*theDFS);
@@ -185,7 +209,7 @@
-ICUFormatNumberFunctor::DecimalFormatType *
+DecimalFormatType *
ICUFormatNumberFunctor::createDecimalFormat(
const XalanDecimalFormatSymbols& theXalanDFS) const
{
@@ -203,11 +227,11 @@
theDFS->setSymbol(DecimalFormatSymbols::kDigitSymbol,
UChar(theXalanDFS.getDigit()));
theDFS->setSymbol(DecimalFormatSymbols::kPatternSeparatorSymbol,
UChar(theXalanDFS.getPatternSeparator()));
- theDFS->setSymbol(DecimalFormatSymbols::kInfinitySymbol,
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInfinity()));
- theDFS->setSymbol(DecimalFormatSymbols::kNaNSymbol,
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getNaN()));
+ theDFS->setSymbol(DecimalFormatSymbols::kInfinitySymbol,
ICUBridge::XalanDOMStringToUnicodeString(m_memoryManager,
theXalanDFS.getInfinity()));
+ theDFS->setSymbol(DecimalFormatSymbols::kNaNSymbol,
ICUBridge::XalanDOMStringToUnicodeString(m_memoryManager,theXalanDFS.getNaN()));
theDFS->setSymbol(DecimalFormatSymbols::kMinusSignSymbol,
UChar(theXalanDFS.getMinusSign()));
- theDFS->setSymbol(DecimalFormatSymbols::kCurrencySymbol,
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getCurrencySymbol()));
- theDFS->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol,
ICUBridge::XalanDOMStringToUnicodeString(theXalanDFS.getInternationalCurrencySymbol()));
+ theDFS->setSymbol(DecimalFormatSymbols::kCurrencySymbol,
ICUBridge::XalanDOMStringToUnicodeString(m_memoryManager,
theXalanDFS.getCurrencySymbol()));
+ theDFS->setSymbol(DecimalFormatSymbols::kIntlCurrencySymbol,
ICUBridge::XalanDOMStringToUnicodeString(m_memoryManager,
theXalanDFS.getInternationalCurrencySymbol()));
theDFS->setSymbol(DecimalFormatSymbols::kMonetarySeparatorSymbol,
UChar(theXalanDFS.getMonetaryDecimalSeparator()));
// Construct a DecimalFormat. Note that we release the XalanAutoPtr,
since the
@@ -252,7 +276,7 @@
}
- theNonConstCache.push_front(DecimalFormatCacheListType::value_type());
+
theNonConstCache.push_front(DecimalFormatCacheListType::value_type(m_memoryManager));
DecimalFormatCacheListType::value_type& theEntry =
theNonConstCache.front();
@@ -284,7 +308,7 @@
}
}
-
theFormatter->applyPattern(ICUBridge::XalanDOMStringToUnicodeString(thePattern),theStatus);
+
theFormatter->applyPattern(ICUBridge::XalanDOMStringToUnicodeString(m_memoryManager,
thePattern),theStatus);
if (U_SUCCESS(theStatus))
{
@@ -297,12 +321,11 @@
return U_SUCCESS(theStatus) ? true : false;
}
-XalanDOMString
-ICUFormatNumberFunctor::UnlocalizePatternFunctor::operator()(const
XalanDOMString& thePattern) const
+XalanDOMString&
+ICUFormatNumberFunctor::UnlocalizePatternFunctor::operator()(const
XalanDOMString& thePattern, XalanDOMString& theResult) const
{
- XalanDOMString theResult;
- XalanDecimalFormatSymbols defaultDFS;
+ XalanDecimalFormatSymbols defaultDFS( theResult.getMemoryManager());
XalanDOMString::const_iterator iterator = thePattern.begin();
1.4 +88 -76
xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.hpp
Index: ICUFormatNumberFunctor.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUFormatNumberFunctor.hpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ICUFormatNumberFunctor.hpp 10 Mar 2004 20:45:30 -0000 1.3
+++ ICUFormatNumberFunctor.hpp 8 Nov 2004 18:06:19 -0000 1.4
@@ -39,20 +39,98 @@
-#include <list>
-
-
XALAN_CPP_NAMESPACE_BEGIN
typedef StylesheetExecutionContextDefault::FormatNumberFunctor
FormatNumberFunctor;
+
+#if defined(XALAN_HAS_CPP_NAMESPACE)
+ typedef U_ICU_NAMESPACE::DecimalFormat DecimalFormatType;
+#else
+ typedef DecimalFormat
DecimalFormatType;
+#endif
+
+struct DecimalFormatCacheStruct
+{
+ DecimalFormatCacheStruct(
+ MemoryManagerType& theManager,
+ const XalanDecimalFormatSymbols& theDFS,
+ DecimalFormatType* theFormatter) :
+
+ m_DFS(theDFS, theManager),
+ m_formatter(theFormatter)
+ {
+ }
+
+ DecimalFormatCacheStruct(MemoryManagerType& theManager) :
+ m_DFS(theManager),
+ m_formatter(0)
+ {
+ }
+
+ DecimalFormatCacheStruct(const DecimalFormatCacheStruct& other,
MemoryManagerType& theManager) :
+ m_DFS(other.m_DFS, theManager),
+ m_formatter(other.m_formatter)
+ {
+ }
+#if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION)
+ bool
+ operator<(const DecimalFormatCacheStruct& theRHS) const
+ {
+ return this < &theRHS;
+ }
+
+ bool
+ operator==(const DecimalFormatCacheStruct& theRHS) const
+ {
+ return this == &theRHS;
+ }
+#endif
+
+ XalanDecimalFormatSymbols m_DFS;
+
+ DecimalFormatType * m_formatter;
+
+ struct DecimalFormatDeleteFunctor
+ {
+
+ void
+ operator()(DecimalFormatCacheStruct& theStruct) const
+ {
+ delete theStruct.m_formatter;
+ }
+ };
+
+ struct DecimalFormatFindFunctor
+ {
+ DecimalFormatFindFunctor(const XalanDecimalFormatSymbols* theDFS)
:
+ m_DFS(theDFS)
+ {
+ }
+
+ bool
+ operator()(DecimalFormatCacheStruct& theStruct) const
+ {
+ return theStruct.m_DFS == (*m_DFS);
+ }
+
+ const XalanDecimalFormatSymbols * const m_DFS;
+ };
+};
+
+
+XALAN_USES_MEMORY_MANAGER(DecimalFormatCacheStruct)
+
// Class that implements the XSLT function format-number using the ICU.
//
class XALAN_ICUBRIDGE_EXPORT ICUFormatNumberFunctor : public
FormatNumberFunctor
{
public:
- ICUFormatNumberFunctor();
+ ICUFormatNumberFunctor(MemoryManagerType& theManager);
+
+ static ICUFormatNumberFunctor*
+ create(MemoryManagerType& theManager);
virtual
~ICUFormatNumberFunctor();
@@ -67,11 +145,7 @@
const XalanNode* context
= 0,
const LocatorType* locator
= 0) const;
-#if defined(XALAN_HAS_CPP_NAMESPACE)
- typedef U_ICU_NAMESPACE::DecimalFormat DecimalFormatType;
-#else
- typedef DecimalFormat
DecimalFormatType;
-#endif
+
class UnlocalizePatternFunctor
{
@@ -81,78 +155,15 @@
{
}
- XalanDOMString
- operator()(const XalanDOMString& thePattern) const;
+ XalanDOMString&
+ operator()(const XalanDOMString& thePattern,
XalanDOMString& theResult) const;
private:
const XalanDecimalFormatSymbols& m_DFS;
};
- struct DecimalFormatCacheStruct
- {
- DecimalFormatCacheStruct(
- const XalanDecimalFormatSymbols& theDFS,
- DecimalFormatType*
theFormatter):
- m_DFS(theDFS),
- m_formatter(theFormatter)
- {
- }
+ typedef XalanList<DecimalFormatCacheStruct>
DecimalFormatCacheListType;
- DecimalFormatCacheStruct() :
- m_DFS(),
- m_formatter(0)
- {
- }
-
-#if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION)
- bool
- operator<(const DecimalFormatCacheStruct& theRHS) const
- {
- return this < &theRHS;
- }
-
- bool
- operator==(const DecimalFormatCacheStruct& theRHS) const
- {
- return this == &theRHS;
- }
-#endif
-
- XalanDecimalFormatSymbols m_DFS;
-
- DecimalFormatType * m_formatter;
-
- struct DecimalFormatDeleteFunctor
- {
- void
- operator()(DecimalFormatCacheStruct& theStruct) const
- {
- delete theStruct.m_formatter;
- }
- };
-
- struct DecimalFormatFindFunctor
- {
- DecimalFormatFindFunctor(const
XalanDecimalFormatSymbols* theDFS) :
- m_DFS(theDFS)
- {
- }
-
- bool
- operator()(DecimalFormatCacheStruct& theStruct) const
- {
- return theStruct.m_DFS == (*m_DFS);
- }
-
- const XalanDecimalFormatSymbols * const m_DFS;
- };
- };
-
-#if defined(XALAN_NO_STD_NAMESPACE)
- typedef list<DecimalFormatCacheStruct>
DecimalFormatCacheListType;
-#else
- typedef std::list<DecimalFormatCacheStruct>
DecimalFormatCacheListType;
-#endif
DecimalFormatType * getCachedDecimalFormat(const
XalanDecimalFormatSymbols &theDFS) const;
@@ -190,7 +201,8 @@
bool
operator==(const ICUFormatNumberFunctor&) const;
-
+private:
+ mutable MemoryManagerType& m_memoryManager;
};
XALAN_CPP_NAMESPACE_END
1.5 +14 -3
xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatFactory.cpp
Index: ICUXalanNumberFormatFactory.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatFactory.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ICUXalanNumberFormatFactory.cpp 26 Feb 2004 23:07:12 -0000 1.4
+++ ICUXalanNumberFormatFactory.cpp 8 Nov 2004 18:06:19 -0000 1.5
@@ -26,8 +26,9 @@
-ICUXalanNumberFormatFactory::ICUXalanNumberFormatFactory() :
- StylesheetExecutionContextDefault::XalanNumberFormatFactory()
+ICUXalanNumberFormatFactory::ICUXalanNumberFormatFactory(MemoryManagerType&
theManager) :
+ StylesheetExecutionContextDefault::XalanNumberFormatFactory(),
+ m_memoryManager(theManager)
{
}
@@ -42,7 +43,17 @@
XalanNumberFormat*
ICUXalanNumberFormatFactory::create()
{
- return new ICUXalanNumberFormatProxy;
+ typedef ICUXalanNumberFormatProxy ThisType;
+
+ XalanMemMgrAutoPtr<ThisType, false> theGuard( m_memoryManager ,
(ThisType*)m_memoryManager.allocate(sizeof(ThisType)));
+
+ ThisType* theResult = theGuard.get();
+
+ new (theResult) ThisType(m_memoryManager);
+
+ theGuard.release();
+
+ return theResult;
}
1.5 +3 -1
xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatFactory.hpp
Index: ICUXalanNumberFormatFactory.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatFactory.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ICUXalanNumberFormatFactory.hpp 26 Feb 2004 23:07:12 -0000 1.4
+++ ICUXalanNumberFormatFactory.hpp 8 Nov 2004 18:06:19 -0000 1.5
@@ -37,13 +37,15 @@
{
public:
- ICUXalanNumberFormatFactory();
+ ICUXalanNumberFormatFactory(MemoryManagerType& theManager);
virtual
~ICUXalanNumberFormatFactory();
virtual XalanNumberFormat*
create();
+private:
+ MemoryManagerType& m_memoryManager;
};
1.5 +26 -88
xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatProxy.cpp
Index: ICUXalanNumberFormatProxy.cpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatProxy.cpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ICUXalanNumberFormatProxy.cpp 26 Feb 2004 23:07:12 -0000 1.4
+++ ICUXalanNumberFormatProxy.cpp 8 Nov 2004 18:06:19 -0000 1.5
@@ -25,10 +25,11 @@
U_NAMESPACE_USE
-
#include <xalanc/PlatformSupport/DOMStringHelper.hpp>
+#include <xalanc/Include/XalanMemMgrAutoPtr.hpp>
+
#include "ICUBridge.hpp"
@@ -38,150 +39,87 @@
-ICUXalanNumberFormatProxy::ICUXalanNumberFormatProxy() :
- XalanNumberFormat(),
+ICUXalanNumberFormatProxy::ICUXalanNumberFormatProxy(MemoryManagerType&
theManager) :
+ XalanNumberFormat(theManager),
m_decimalFormat(0)
{
UErrorCode theResult = U_ZERO_ERROR;
- m_decimalFormat = new DecimalFormat(theResult);
+ new DecimalFormatType(theResult);
}
ICUXalanNumberFormatProxy::~ICUXalanNumberFormatProxy()
{
- delete m_decimalFormat;
-}
-
+ delete m_decimalFormat;
-
-XalanDOMString
-ICUXalanNumberFormatProxy::format(double theValue)
-{
- UnicodeString theUnicodeResult;
-
- m_decimalFormat->format(theValue, theUnicodeResult);
-
- return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult);
}
-void
-ICUXalanNumberFormatProxy::format(
- double theValue,
- XalanDOMString& theResult)
+XalanDOMString&
+ICUXalanNumberFormatProxy::format(double theValue,
+ XalanDOMString& theResult)
{
UnicodeString theUnicodeResult;
m_decimalFormat->format(theValue, theUnicodeResult);
- ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
+ return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult,
theResult);
}
-XalanDOMString
-ICUXalanNumberFormatProxy::format(int theValue)
+XalanDOMString&
+ICUXalanNumberFormatProxy::format(int theValue,
+ XalanDOMString& theResult)
{
UnicodeString theUnicodeResult;
m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
- return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult);
+ return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult,
theResult);
}
-void
-ICUXalanNumberFormatProxy::format(
- int theValue,
- XalanDOMString& theResult)
-{
- UnicodeString theUnicodeResult;
-
- m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
-
- ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
-}
-
-
-XalanDOMString
-ICUXalanNumberFormatProxy::format(unsigned int theValue)
+XalanDOMString&
+ICUXalanNumberFormatProxy::format(unsigned int theValue,
XalanDOMString& theResult)
{
UnicodeString theUnicodeResult;
m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
- return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult);
+ return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult,
theResult);
}
-
-void
-ICUXalanNumberFormatProxy::format(
- unsigned int theValue,
- XalanDOMString& theResult)
+XalanDOMString&
+ICUXalanNumberFormatProxy::format(long theValue,
+ XalanDOMString& theResult)
{
UnicodeString theUnicodeResult;
m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
- ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
+ return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult,
theResult);
}
-XalanDOMString
-ICUXalanNumberFormatProxy::format(long theValue)
-{
- UnicodeString theUnicodeResult;
- m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
- return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult);
-}
-
-
-
-void
-ICUXalanNumberFormatProxy::format(
- long theValue,
- XalanDOMString& theResult)
-{
- UnicodeString theUnicodeResult;
-
- m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
-
- ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
-}
-
-
-
-XalanDOMString
-ICUXalanNumberFormatProxy::format(unsigned long theValue)
-{
- UnicodeString theUnicodeResult;
-
- m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
-
- return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult);
-}
-
-
-
-void
-ICUXalanNumberFormatProxy::format(
- unsigned long theValue,
- XalanDOMString& theResult)
+XalanDOMString&
+ICUXalanNumberFormatProxy::format(unsigned long theValue,
+ XalanDOMString& theResult)
{
UnicodeString theUnicodeResult;
m_decimalFormat->format(int32_t(theValue), theUnicodeResult);
- ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult, theResult);
+ return ICUBridge::UnicodeStringToXalanDOMString(theUnicodeResult,
theResult);
}
@@ -222,7 +160,7 @@
theNewSymbols->setSymbol(
DecimalFormatSymbols::kGroupingSeparatorSymbol,
- ICUBridge::XalanDOMStringToUnicodeString(s));
+ ICUBridge::XalanDOMStringToUnicodeString(getMemoryManager(),
s));
m_decimalFormat->adoptDecimalFormatSymbols(theNewSymbols);
}
1.5 +18 -33
xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatProxy.hpp
Index: ICUXalanNumberFormatProxy.hpp
===================================================================
RCS file:
/home/cvs/xml-xalan/c/src/xalanc/ICUBridge/ICUXalanNumberFormatProxy.hpp,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- ICUXalanNumberFormatProxy.hpp 26 Feb 2004 23:07:12 -0000 1.4
+++ ICUXalanNumberFormatProxy.hpp 8 Nov 2004 18:06:19 -0000 1.5
@@ -42,50 +42,32 @@
public:
explicit
- ICUXalanNumberFormatProxy();
+ ICUXalanNumberFormatProxy(MemoryManagerType& theManager);
virtual
~ICUXalanNumberFormatProxy();
- virtual XalanDOMString
- format(double theValue);
+ virtual XalanDOMString&
+ format(double theValue,
+ XalanDOMString& theResult);
- virtual void
- format(
- double theValue,
- XalanDOMString& theResult);
- virtual XalanDOMString
- format(int theValue);
+ virtual XalanDOMString&
+ format(int theValue,
+ XalanDOMString& theResult);
- virtual void
- format(
- int theValue,
- XalanDOMString& theResult);
- virtual XalanDOMString
- format(unsigned int theValue);
+ virtual XalanDOMString&
+ format(unsigned int theValue, XalanDOMString& theResult);
- virtual void
- format(
- unsigned int theValue,
- XalanDOMString& theResult);
- virtual XalanDOMString
- format(long theValue);
+ virtual XalanDOMString&
+ format(long theValue, XalanDOMString& theResult);
- virtual void
- format(
- long theValue,
- XalanDOMString& theResult);
- virtual XalanDOMString
- format(unsigned long theValue);
+ virtual XalanDOMString&
+ format(unsigned long theValue, XalanDOMString& theResult);
- virtual void
- format(
- unsigned long theValue,
- XalanDOMString& theResult);
virtual bool
isGroupingUsed() const;
@@ -102,10 +84,13 @@
private:
#if defined(XALAN_HAS_CPP_NAMESPACE)
- U_ICU_NAMESPACE::DecimalFormat* m_decimalFormat;
+ typedef U_ICU_NAMESPACE::DecimalFormat DecimalFormatType;
#else
- DecimalFormat* m_decimalFormat;
+ typedef DecimalFormat*
DecimalFormatType;
#endif
+
+ DecimalFormatType* m_decimalFormat;
+
};
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]