00001 /* 00002 * Copyright 1999-2004 The Apache Software Foundation. 00003 * 00004 * Licensed under the Apache License, Version 2.0 (the "License"); 00005 * you may not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an "AS IS" BASIS, 00012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #if !defined(FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680) 00017 #define FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680 00018 00019 00020 00021 // Base header file. Must be first. 00022 #include <xalanc/ICUBridge/ICUBridgeDefinitions.hpp> 00023 00024 00025 00026 #include <xalanc/PlatformSupport/XalanDecimalFormatSymbols.hpp> 00027 00028 00029 00030 #include <xalanc/XSLT/StylesheetExecutionContextDefault.hpp> 00031 00032 00033 00034 #include <xalanc/XPath/XPathExecutionContext.hpp> 00035 00036 00037 00038 #include <unicode/decimfmt.h> 00039 00040 00041 00042 00043 XALAN_CPP_NAMESPACE_BEGIN 00044 00045 typedef StylesheetExecutionContextDefault::FormatNumberFunctor FormatNumberFunctor; 00046 00047 #if defined(XALAN_HAS_CPP_NAMESPACE) 00048 typedef U_ICU_NAMESPACE::DecimalFormat DecimalFormatType; 00049 #else 00050 typedef DecimalFormat DecimalFormatType; 00051 #endif 00052 00053 struct DecimalFormatCacheStruct 00054 { 00055 DecimalFormatCacheStruct( 00056 MemoryManagerType& theManager, 00057 const XalanDecimalFormatSymbols& theDFS, 00058 DecimalFormatType* theFormatter) : 00059 00060 m_DFS(theDFS, theManager), 00061 m_formatter(theFormatter) 00062 { 00063 } 00064 00065 DecimalFormatCacheStruct(MemoryManagerType& theManager) : 00066 m_DFS(theManager), 00067 m_formatter(0) 00068 { 00069 } 00070 00071 DecimalFormatCacheStruct(const DecimalFormatCacheStruct& other, MemoryManagerType& theManager) : 00072 m_DFS(other.m_DFS, theManager), 00073 m_formatter(other.m_formatter) 00074 { 00075 } 00076 #if defined(XALAN_NO_SELECTIVE_TEMPLATE_INSTANTIATION) 00077 bool 00078 operator<(const DecimalFormatCacheStruct& theRHS) const 00079 { 00080 return this < &theRHS; 00081 } 00082 00083 bool 00084 operator==(const DecimalFormatCacheStruct& theRHS) const 00085 { 00086 return this == &theRHS; 00087 } 00088 #endif 00089 00090 XalanDecimalFormatSymbols m_DFS; 00091 00092 DecimalFormatType * m_formatter; 00093 00094 struct DecimalFormatDeleteFunctor 00095 { 00096 00097 void 00098 operator()(DecimalFormatCacheStruct& theStruct) const 00099 { 00100 delete theStruct.m_formatter; 00101 } 00102 }; 00103 00104 struct DecimalFormatFindFunctor 00105 { 00106 DecimalFormatFindFunctor(const XalanDecimalFormatSymbols* theDFS) : 00107 m_DFS(theDFS) 00108 { 00109 } 00110 00111 bool 00112 operator()(DecimalFormatCacheStruct& theStruct) const 00113 { 00114 return theStruct.m_DFS == (*m_DFS); 00115 } 00116 00117 const XalanDecimalFormatSymbols * const m_DFS; 00118 }; 00119 00120 private: 00121 00122 DecimalFormatCacheStruct(); 00123 DecimalFormatCacheStruct(const DecimalFormatCacheStruct& other); 00124 00125 }; 00126 00127 00128 XALAN_USES_MEMORY_MANAGER(DecimalFormatCacheStruct) 00129 00130 // Class that implements the XSLT function format-number using the ICU. 00131 // 00132 class XALAN_ICUBRIDGE_EXPORT ICUFormatNumberFunctor : public FormatNumberFunctor 00133 { 00134 public: 00135 00136 ICUFormatNumberFunctor(MemoryManagerType& theManager); 00137 00138 static ICUFormatNumberFunctor* 00139 create(MemoryManagerType& theManager); 00140 00141 virtual 00142 ~ICUFormatNumberFunctor(); 00143 00144 virtual void 00145 operator() ( 00146 XPathExecutionContext& executionContext, 00147 double theNumber, 00148 const XalanDOMString& thePattern, 00149 const XalanDecimalFormatSymbols* theDFS, 00150 XalanDOMString& theResult, 00151 const XalanNode* context = 0, 00152 const LocatorType* locator = 0) const; 00153 00154 00155 00156 class UnlocalizePatternFunctor 00157 { 00158 public: 00159 UnlocalizePatternFunctor(const XalanDecimalFormatSymbols& theDFS): 00160 m_DFS(theDFS) 00161 { 00162 } 00163 00164 XalanDOMString& 00165 operator()(const XalanDOMString& thePattern, XalanDOMString& theResult) const; 00166 00167 private: 00168 const XalanDecimalFormatSymbols& m_DFS; 00169 }; 00170 00171 typedef XalanList<DecimalFormatCacheStruct> DecimalFormatCacheListType; 00172 00173 00174 DecimalFormatType * getCachedDecimalFormat(const XalanDecimalFormatSymbols &theDFS) const; 00175 00176 bool 00177 doFormat( 00178 double theNumber, 00179 const XalanDOMString& thePattern, 00180 XalanDOMString& theResult, 00181 const XalanDecimalFormatSymbols* theDFS = 0) const; 00182 00183 bool 00184 doICUFormat( 00185 double theNumber, 00186 const XalanDOMString& thePattern, 00187 XalanDOMString& theResult, 00188 DecimalFormatType* theFormatter = 0) const; 00189 00190 void 00191 cacheDecimalFormat( 00192 DecimalFormatType* theFormatter, 00193 const XalanDecimalFormatSymbols& theDFS) const; 00194 00195 DecimalFormat * 00196 createDecimalFormat( 00197 const XalanDecimalFormatSymbols& theXalanDFS) const; 00198 00199 enum { eCacheMax = 10 }; 00200 00201 DecimalFormatType * m_defaultDecimalFormat; 00202 00203 mutable DecimalFormatCacheListType m_decimalFormatCache; 00204 00205 ICUFormatNumberFunctor& 00206 operator=(const ICUFormatNumberFunctor&); 00207 00208 bool 00209 operator==(const ICUFormatNumberFunctor&) const; 00210 private: 00211 MemoryManagerType& m_memoryManager; 00212 }; 00213 00214 XALAN_CPP_NAMESPACE_END 00215 00216 #endif // FUNCTIONICUFORMATNUMBERFUNCTOR_HEADER_GUARD_1357924680
Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.
![]() |
Xalan-C++ XSLT Processor Version 1.9 |
|