peterv%netscape.com 05ca9a5742 Fix for bug 163955 (Header cleanup for transformiix). r=sicking, rs=jst.
git-svn-id: svn://10.0.0.236/trunk@127853 18797224-902f-48f8-a5cc-f745e15eee43
2002-08-22 12:22:47 +00:00

214 lines
6.0 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 "ExprResult.h"
#include "txError.h"
class Node;
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
*/
ExprResult* clone();
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