blob: d7078732b0fe7e968b420eff47ebf8ab33e13352 [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/*
* XSEC
*
* XSECXPathNodeList := A structure to hold node lists from XPath
* evaluations
*
* Author(s): Berin Lautenbach
*
* $Id$
*
*/
#ifndef XSECXPATHNODELIST_INCLUDE
#define XSECXPATHNODELIST_INCLUDE
// XSEC
#include <xsec/framework/XSECDefs.hpp>
// Xerces
XSEC_DECLARE_XERCES_CLASS(DOMNode)
#define _XSEC_NODELIST_DEFAULT_SIZE 100
/**
* @ingroup internal
*/
/**
* \brief Class for holding lists of DOMNodes.
*
* This class is used primarily for holding lists of nodes found during XPath
* processing. It is also used for xpath-filter which requires multiple list
* comparisons.
*
* It is not implemented using one of the container classes as it has the
* potential to become a real bottleneck. It could potentially be implemented
* as a hash list based on names of nodes (or even pointers).
*
*/
class XSEC_EXPORT XSECXPathNodeList {
public:
/** @name Constructors, Destructors and operators */
//@{
XSECXPathNodeList(unsigned int initialSize = _XSEC_NODELIST_DEFAULT_SIZE);
/**
* \brief Copy Constructor
*
* @note The XSEC Library generally passes NodeLists around as pointers.
* There is a LARGE overhead associated with re-creating lists, so we
* try to avoid doing it unless necessary.
*/
XSECXPathNodeList(const XSECXPathNodeList &other);
~XSECXPathNodeList();
/**
* \brief Assignment Operator.
*
* Set one node list equal to another.
*
* @note Do not do this frequently, particularly for large lists
* as it will replicate the entire list and is a fairly expensive
* operation
*
* @param toCopy The list to be copied from
*/
XSECXPathNodeList & operator= (const XSECXPathNodeList & toCopy);
//@}
/** @name Adding and Deleting nodes */
//@{
/**
*\brief Add a node to the list.
*
* Checks to see whether the node is already in the list, and if not
* adds it.
*
* @param n The node to add.
*/
void addNode(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n);
/**
* \brief Remove a node from the list.
*
* Given a node, find it in the list and (if it exists) delete it from the list.
*
* @param n The node to be removed.
*/
void removeNode(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n);
/**
* \brief Clear out the entire list, deleting all entries.
*
*/
void clear(void);
//@}
/** @name Reading List Functions */
//@{
/**
* \brief Check if a node exists in the list.
*
* @param n The node to find in the list.
*/
bool hasNode(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *n) const;
/**
* \brief Get the first node in the list.
*
* Returns the first node in the list of nodes and resets the search list.
*
* @returns The first node in the list or NULL if none exist
*/
const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * getFirstNode(void) const;
/**
* \brief Get the next node in the list
*
* Returns the next node in the list.
*
* @returns The next node in the list of NULL if none exist
*/
const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode *getNextNode(void) const;
//@}
/** @name Manipulating Nodesets */
//@{
/**
*\brief Intersect with nodeset
*
* Delete any nodes in my list that are not in the intersect list
*
* @param toIntersect The list to intersect with.
*/
void intersect(const XSECXPathNodeList &toIntersect);
//@}
private:
/* Implement an unbalanced binary search tree */
typedef struct s_btn {
struct s_btn * l; // Left
struct s_btn * r; // Right
struct s_btn * p; // Parent
const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode
* v; // Value
long h; // Height
} btn;
// Internal functions
btn * findNodeIndex(const XERCES_CPP_NAMESPACE_QUALIFIER DOMNode * n) const;
void delete_tree(btn * t);
btn * copy_tree(btn * t) const ;
long balance_count(btn * t) const;
void rotate_left(btn * t);
void rotate_right(btn * t);
long calc_height(btn * t);
btn * mp_tree; // The tree
unsigned int m_num; // Number of elements in the tree
mutable btn * mp_current; // current point in list for getNextNode
};
#endif /* XSECXPATHNODELIST_INCLUDE */