sicking%bigfoot.com 6265d66757 Speed up NodeSets by always keeping them in document order. Only sort when we get nodes in random order (such as for id()) or when merging NodeSets.
This removes the need for the sortByDocumentOrder function.

b=85893 r=Pike rs=jag


git-svn-id: svn://10.0.0.236/trunk@113703 18797224-902f-48f8-a5cc-f745e15eee43
2002-02-05 14:22:34 +00:00

212 lines
5.9 KiB
C++

/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*-
*
* The contents of this file are subject to the Mozilla Public
* License Version 1.1 (the "License"); you may not use this file
* except in compliance with the License. You may obtain a copy of
* the License at http://www.mozilla.org/MPL/
*
* Software distributed under the License is distributed on an "AS
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
* implied. See the License for the specific language governing
* rights and limitations under the License.
*
* The Original Code is TransforMiiX XSLT processor.
*
* The Initial Developer of the Original Code is The MITRE Corporation.
* Portions created by MITRE are Copyright (C) 1999 The MITRE Corporation.
*
* Portions created by Keith Visco as a Non MITRE employee,
* (C) 1999 Keith Visco. All Rights Reserved.
*
* Contributor(s):
* Keith Visco, kvisco@ziplink.net
* -- original author.
*
* Larry Fitzpatrick, OpenText, lef@opentext.com
* -- moved initialization of DEFAULT_SIZE to NodeSet.cpp
*
*/
/*
* Implementation of an XPath NodeSet
*/
#ifndef TRANSFRMX_NODESET_H
#define TRANSFRMX_NODESET_H
#include "dom.h"
#include "ExprResult.h"
#include "txError.h"
class NodeSet : public ExprResult
{
public:
/*
* Creates a new empty NodeSet
*/
NodeSet();
/*
* Creates a new NodeSet containing the supplied node
*/
NodeSet(Node* aNode);
/*
* Creates a new NodeSet, copying the Node references from the source
* NodeSet
*/
NodeSet(const NodeSet& aSource);
/*
* Destructor for NodeSet, will not delete referenced Nodes
*/
virtual ~NodeSet()
{
delete [] mElements;
}
/*
* Adds the specified Node to this NodeSet if it is not already in this
* NodeSet. The node is inserted according to document order.
* @param aNode the Node to add to the NodeSet
* @return errorcode.
*/
nsresult add(Node* aNode);
/*
* Adds the nodes in specified NodeSet to this NodeSet. The resulting
* NodeSet is sorted in document order and does not contain any duplicate
* nodes.
* @param aNodes the NodeSet to add, must be in document order.
* @return errorcode.
*/
nsresult add(const NodeSet* aNodes);
/*
* Append API
* These functions should be used with care.
* They are intended to be used when the caller assures that the resulting
* NodeSet remains in document order.
* Abuse will break document order, and cause errors in the result.
* These functions are significantly faster than the add API, as no
* Node::OrderInfo structs will be generated.
*/
/*
* Appends the specified Node to the end of this NodeSet
* @param aNode the Node to append to the NodeSet
* @return errorcode.
*/
nsresult append(Node* aNode);
/*
* Appends the nodes in the specified NodeSet to the end of this NodeSet
* @param aNodes the NodeSet to append to the NodeSet
* @return errorcode.
*/
nsresult append(const NodeSet* aNodes);
/*
* Reverse the order of the nodes.
*/
void reverse();
/*
* Removes all nodes from this nodeset
*/
void clear()
{
mElementCount = 0;
}
/*
* Returns the index of the specified Node,
* or -1 if the Node is not contained in the NodeSet
* @param aNode the Node to get the index for
* @return index of specified node or -1 if the node does not exist
*/
int indexOf(Node* aNode) const;
/*
* Returns true if the specified Node is contained in the set.
* @param aNode the Node to search for
* @return true if specified Node is contained in the NodeSet
*/
MBool contains(Node* aNode) const
{
return indexOf(aNode) >= 0;
}
/*
* Returns the Node at the specified position in this NodeSet.
* @param aIndex the position of the Node to return
* @return Node at specified position
*/
Node* get(int aIndex) const;
/*
* Returns true if there are no Nodes in the NodeSet.
* @return true if there are no Nodes in the NodeSet.
*/
MBool isEmpty() const
{
return mElementCount == 0;
}
/*
* Returns the number of elements in the NodeSet
* @return the number of elements in the NodeSet
*/
int size() const
{
return mElementCount;
}
/*
* Virtual methods from ExprResult
*/
short getResultType();
MBool booleanValue();
double numberValue();
void stringValue(String& aStr);
private:
/*
* Makes sure that the mElements buffer contains at least aSize elements.
* If a new allocation is required the elements are copied over to the new
* buffer
* @param aSize requested number of elements
* @return true if allocation succeded, false on out of memory
*/
MBool ensureSize(int aSize);
/*
* Finds position in the mElements buffer where a node should be inserted
* to keep the nodeset in document order. Searches the positions
* aFirst-aLast, including both aFirst and aLast.
* @param aNode Node to find insert position for
* @param aFirst First index to search, this index will be searched
* @param aLast Last index to search, this index will be searched
* @param aPos out-param. Will be set to the index where to insert the
* node. The node should be inserted before the node at
* this index. This value is always >= aFirst and
* <= aLast + 1. This value is always set, even if aNode
* already exists in the NodeSet.
* @return true if the node should be inserted, false if it already exists
* in the NodeSet
*/
MBool findPosition(Node* aNode, int aFirst, int aLast, int& aPos) const;
Node** mElements;
int mBufferSize;
int mElementCount;
};
typedef NodeSet txResultTreeFragment;
#endif