00001 /* 00002 * The Apache Software License, Version 1.1 00003 * 00004 * 00005 * Copyright (c) 1999-2003 The Apache Software Foundation. All rights 00006 * reserved. 00007 * 00008 * Redistribution and use in source and binary forms, with or without 00009 * modification, are permitted provided that the following conditions 00010 * are met: 00011 * 00012 * 1. Redistributions of source code must retain the above copyright 00013 * notice, this list of conditions and the following disclaimer. 00014 * 00015 * 2. Redistributions in binary form must reproduce the above copyright 00016 * notice, this list of conditions and the following disclaimer in 00017 * the documentation and/or other materials provided with the 00018 * distribution. 00019 * 00020 * 3. The end-user documentation included with the redistribution, 00021 * if any, must include the following acknowledgment: 00022 * "This product includes software developed by the 00023 * Apache Software Foundation (http://www.apache.org/)." 00024 * Alternately, this acknowledgment may appear in the software itself, 00025 * if and wherever such third-party acknowledgments normally appear. 00026 * 00027 * 4. The names "Xalan" and "Apache Software Foundation" must 00028 * not be used to endorse or promote products derived from this 00029 * software without prior written permission. For written 00030 * permission, please contact apache@apache.org. 00031 * 00032 * 5. Products derived from this software may not be called "Apache", 00033 * nor may "Apache" appear in their name, without prior written 00034 * permission of the Apache Software Foundation. 00035 * 00036 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 00037 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 00038 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00039 * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR 00040 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00041 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00042 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 00043 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 00044 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00045 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 00046 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 00047 * SUCH DAMAGE. 00048 * ==================================================================== 00049 * 00050 * This software consists of voluntary contributions made by many 00051 * individuals on behalf of the Apache Software Foundation and was 00052 * originally based on software copyright (c) 1999, International 00053 * Business Machines, Inc., http://www.ibm.com. For more 00054 * information on the Apache Software Foundation, please see 00055 * <http://www.apache.org/>. 00056 */ 00057 #if !defined(XALAN_NODESORTER_HEADER_GUARD) 00058 #define XALAN_NODESORTER_HEADER_GUARD 00059 00063 00064 00065 00066 // Base include file. Must be first. 00067 #include "XSLTDefinitions.hpp" 00068 00069 00070 00071 #include <functional> 00072 #include <vector> 00073 00074 00075 00076 #include <xalanc/XPath/XObject.hpp> 00077 00078 00079 00080 #include <xalanc/XSLT/NodeSortKey.hpp> 00081 00082 00083 00084 XALAN_CPP_NAMESPACE_BEGIN 00085 00086 00087 00088 class MutableNodeRefList; 00089 class StylesheetExecutionContext; 00090 class XalanNode; 00091 class XPath; 00092 00093 00094 00098 class XALAN_XSLT_EXPORT NodeSorter 00099 { 00100 public: 00101 00102 struct XALAN_XSLT_EXPORT VectorEntry 00103 { 00104 public: 00105 00106 VectorEntry( 00107 XalanNode* theNode = 0, 00108 unsigned int thePosition = 0) : 00109 m_node(theNode), 00110 m_position(thePosition) 00111 { 00112 } 00113 00114 XalanNode* m_node; 00115 unsigned int m_position; 00116 }; 00117 00118 #if defined(XALAN_NO_STD_NAMESPACE) 00119 typedef vector<VectorEntry> NodeVectorType; 00120 typedef vector<NodeSortKey> NodeSortKeyVectorType; 00121 #else 00122 typedef std::vector<VectorEntry> NodeVectorType; 00123 typedef std::vector<NodeSortKey> NodeSortKeyVectorType; 00124 #endif 00125 00126 explicit 00127 NodeSorter(); 00128 00129 ~NodeSorter(); 00130 00131 NodeSortKeyVectorType& 00132 getSortKeys() 00133 { 00134 return m_keys; 00135 } 00136 00144 void 00145 sort( 00146 StylesheetExecutionContext& executionContext, 00147 MutableNodeRefList& theList); 00148 00152 #if defined(XALAN_NO_STD_NAMESPACE) 00153 struct XALAN_XSLT_EXPORT NodeSortKeyCompare : public binary_function<const NodeVectorType::value_type&, const NodeVectorType::value_type&, bool> 00154 #else 00155 struct XALAN_XSLT_EXPORT NodeSortKeyCompare : public std::binary_function<const NodeVectorType::value_type&, const NodeVectorType::value_type&, bool> 00156 #endif 00157 { 00158 public: 00159 00167 NodeSortKeyCompare( 00168 StylesheetExecutionContext& executionContext, 00169 NodeSorter& theSorter, 00170 const NodeVectorType& theNodes, 00171 const NodeSortKeyVectorType& theNodeSortKeys) : 00172 m_executionContext(executionContext), 00173 m_sorter(theSorter), 00174 m_nodes(theNodes), 00175 m_nodeSortKeys(theNodeSortKeys) 00176 { 00177 } 00178 00188 int 00189 compare( 00190 first_argument_type theLHS, 00191 second_argument_type theRHS, 00192 unsigned int theKeyIndex = 0) const; 00193 00202 result_type 00203 operator()( 00204 first_argument_type theLHS, 00205 second_argument_type theRHS, 00206 unsigned int theKeyIndex = 0) const 00207 { 00208 return compare(theLHS, theRHS, theKeyIndex) < 0 ? true : false; 00209 } 00210 00211 protected: 00212 00213 double 00214 getNumberResult( 00215 const NodeSortKey& theKey, 00216 unsigned int theKeyIndex, 00217 first_argument_type theEntry) const; 00218 00219 const XalanDOMString& 00220 getStringResult( 00221 const NodeSortKey& theKey, 00222 unsigned int theKeyIndex, 00223 first_argument_type theEntry) const; 00224 00225 private: 00226 00227 StylesheetExecutionContext& m_executionContext; 00228 NodeSorter& m_sorter; 00229 const NodeVectorType& m_nodes; 00230 const NodeSortKeyVectorType& m_nodeSortKeys; 00231 }; 00232 00233 friend struct NodeSortKeyCompare; 00234 00235 #if defined(XALAN_NO_STD_NAMESPACE) 00236 typedef vector<double> NumberVectorType; 00237 typedef vector<XObjectPtr> XObjectVectorType; 00238 typedef vector<XalanDOMString> StringVectorType; 00239 00240 typedef vector<NumberVectorType> NumberCacheType; 00241 typedef vector<XObjectVectorType> XObjectCacheType; 00242 typedef vector<StringVectorType> StringCacheType; 00243 #else 00244 typedef std::vector<double> NumberVectorType; 00245 typedef std::vector<XObjectPtr> XObjectVectorType; 00246 typedef std::vector<XalanDOMString> StringVectorType; 00247 00248 typedef std::vector<NumberVectorType> NumberCacheType; 00249 typedef std::vector<XObjectVectorType> XObjectCacheType; 00250 typedef std::vector<StringVectorType> StringCacheType; 00251 #endif 00252 00253 typedef NumberCacheType NumberResultsCacheType; 00254 00255 #if defined(XALAN_NODESORTER_CACHE_XOBJECTS) 00256 typedef XObjectCacheType StringResultsCacheType; 00257 #else 00258 typedef StringCacheType StringResultsCacheType; 00259 #endif 00260 00261 private: 00262 00269 void 00270 sort(StylesheetExecutionContext& executionContext); 00271 00272 // Data members... 00273 NumberResultsCacheType m_numberResultsCache; 00274 00275 StringResultsCacheType m_stringResultsCache; 00276 00277 NodeSortKeyVectorType m_keys; 00278 00279 NodeVectorType m_scratchVector; 00280 }; 00281 00282 00283 00284 XALAN_CPP_NAMESPACE_END 00285 00286 00287 00288 #endif // XALAN_NODESORTER_HEADER_GUARD
Doxygen and GraphViz are used to generate this API documentation from the Xalan-C header files.
![]() |
Xalan-C++ XSLT Processor Version 1.6 |
|