Oracle® Fusion Middleware C++ API Reference for Oracle Coherence
12c (12.1.3.0.0)

E47891-01

coherence/util/TreeMap.hpp

00001 /*
00002 * TreeMap.hpp
00003 *
00004 * Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.
00005 *
00006 * Oracle is a registered trademarks of Oracle Corporation and/or its
00007 * affiliates.
00008 *
00009 * This software is the confidential and proprietary information of Oracle
00010 * Corporation. You shall not disclose such confidential and proprietary
00011 * information and shall use it only in accordance with the terms of the
00012 * license agreement you entered into with Oracle.
00013 *
00014 * This notice may not be removed or altered.
00015 */
00016 #ifndef COH_TREE_MAP_HPP
00017 #define COH_TREE_MAP_HPP
00018 
00019 #include "coherence/lang.ns"
00020 
00021 #include "coherence/util/AbstractMap.hpp"
00022 #include "coherence/util/Comparator.hpp"
00023 #include "coherence/util/Map.hpp"
00024 #include "coherence/util/NavigableMap.hpp"
00025 #include "coherence/util/SortedMap.hpp"
00026 
00027 COH_OPEN_NAMESPACE2(coherence,util)
00028 
00029 
00030 /**
00031 * A tree map implementation. Stored as an AVL tree. Implementation is based on
00032 * the public domain implementation by Julienne Walker. This implementation is
00033 * not thread-safe.
00034 *
00035 * @see <a href="http://www.eternallyconfuzzled.com/tuts/datastructures/jsw_tut_avl.aspx">
00036 *      Implementation by Julienne Walker</a>
00037 *
00038 * @author tb  2009.02.22
00039 */
00040 class COH_EXPORT TreeMap
00041     : public cloneable_spec<TreeMap,
00042         extends<AbstractMap>,
00043         implements<NavigableMap> >
00044     {
00045     friend class factory<TreeMap>;
00046 
00047     // ----- constructors ---------------------------------------------------
00048 
00049     protected:
00050         /**
00051         * @internal
00052         */
00053         TreeMap();
00054 
00055         /**
00056         * @internal
00057         */
00058         TreeMap(Comparator::View vComparator);
00059 
00060         /**
00061         * @internal
00062         */
00063         TreeMap(const TreeMap& that);
00064 
00065         /**
00066         * @internal
00067         */
00068         virtual ~TreeMap();
00069 
00070 
00071     // ----- Map interface --------------------------------------------------
00072 
00073     public:
00074         /**
00075         * {@inheritDoc}
00076         */
00077         virtual size32_t size() const;
00078 
00079         /**
00080         * {@inheritDoc}
00081         */
00082         virtual bool isEmpty() const;
00083 
00084         /**
00085         * {@inheritDoc}
00086         */
00087         virtual bool containsKey(Object::View vKey) const;
00088 
00089         /**
00090         * {@inheritDoc}
00091         */
00092         virtual Object::Holder get(Object::View vKey) const;
00093 
00094         /**
00095         * {@inheritDoc}
00096         */
00097         using Map::get;
00098 
00099         /**
00100         * {@inheritDoc}
00101         */
00102         virtual Object::Holder put(Object::View vKey, Object::Holder ohValue);
00103 
00104         /**
00105         * {@inheritDoc}
00106         */
00107         virtual Object::Holder remove(Object::View vKey);
00108 
00109         /**
00110         * {@inheritDoc}
00111         */
00112         virtual void clear();
00113 
00114         /**
00115         * {@inheritDoc}
00116         */
00117         virtual Set::View entrySet() const;
00118 
00119         /**
00120         * {@inheritDoc}
00121         */
00122         virtual Set::Handle entrySet();
00123 
00124 
00125     // ----- SortedMap interface --------------------------------------------
00126 
00127     public:
00128         /**
00129         * {@inheritDoc}
00130         */
00131         virtual Comparator::View comparator() const;
00132 
00133         /**
00134         * {@inheritDoc}
00135         */
00136         virtual Object::View firstKey() const;
00137 
00138         /**
00139         * {@inheritDoc}
00140         */
00141         virtual Object::View lastKey() const;
00142 
00143         /**
00144         * {@inheritDoc}
00145         */
00146         virtual SortedMap::Handle headMap(Object::View vToKey);
00147 
00148         /**
00149         * {@inheritDoc}
00150         */
00151         virtual SortedMap::View headMap(Object::View vToKey) const;
00152 
00153         /**
00154         * {@inheritDoc}
00155         */
00156         virtual SortedMap::Handle subMap(Object::View vFromKey,
00157                 Object::View vToKey);
00158 
00159         /**
00160         * {@inheritDoc}
00161         */
00162         virtual SortedMap::View subMap(Object::View vFromKey,
00163                 Object::View vToKey) const;
00164 
00165         /**
00166         * {@inheritDoc}
00167         */
00168         virtual SortedMap::Handle tailMap(Object::View vFromKey);
00169 
00170         /**
00171         * {@inheritDoc}
00172         */
00173         virtual SortedMap::View tailMap(Object::View vFromKey) const;
00174 
00175 
00176     // ----- NavigableMap interface -----------------------------------------
00177 
00178     public:
00179         /**
00180         * {@inheritDoc}
00181         */
00182         virtual Object::View ceilingKey(Object::View vKey) const;
00183 
00184         /**
00185          * {@inheritDoc}
00186          */
00187         virtual Object::View floorKey(Object::View vKey) const;
00188 
00189         /**
00190         * {@inheritDoc}
00191         */
00192         virtual Object::View higherKey(Object::View vKey) const;
00193 
00194         /**
00195          * {@inheritDoc}
00196          */
00197         virtual Object::View lowerKey(Object::View vKey) const;
00198 
00199         /**
00200         * {@inheritDoc}
00201         */
00202         virtual Map::Entry::Holder pollFirstEntry();
00203 
00204         /**
00205         * {@inheritDoc}
00206         */
00207         virtual Map::Entry::Holder pollLastEntry();
00208 
00209         /**
00210         * {@inheritDoc}
00211         */
00212         virtual NavigableMap::Handle headMap(Object::View vToKey, bool toInclusive);
00213 
00214         /**
00215         * {@inheritDoc}
00216         */
00217         virtual NavigableMap::View headMap(Object::View vToKey, bool toInclusive) const;
00218 
00219         /**
00220         * {@inheritDoc}
00221         */
00222         virtual NavigableMap::Handle subMap(Object::View vFromKey, bool fromInclusive,
00223                 Object::View vToKey, bool toInclusive);
00224 
00225         /**
00226         * {@inheritDoc}
00227         */
00228         virtual NavigableMap::View subMap(Object::View vFromKey, bool fromInclusive,
00229                 Object::View vToKey, bool toInclusive) const;
00230 
00231         /**
00232         * {@inheritDoc}
00233         */
00234         virtual NavigableMap::Handle tailMap(Object::View vFromKey, bool fromInclusive);
00235 
00236         /**
00237         * {@inheritDoc}
00238         */
00239         virtual NavigableMap::View tailMap(Object::View vFromKey, bool fromInclusive) const;
00240 
00241 
00242         // ----- inner class: Node ----------------------------------------------
00243 
00244     public:
00245         /**
00246         * An AVL tree node. This class is used only within the
00247         * TreeMap class and its derivations.
00248         */
00249         class COH_EXPORT Node
00250             : public cloneable_spec<Node,
00251                 extends<Object>,
00252                 implements<Map::Entry> >
00253         {
00254         friend class factory<Node>;
00255 
00256         // ----- constructors -------------------------------------------
00257 
00258         protected:
00259             /**
00260             * @internal
00261             */
00262             Node(Object::View ovKey);
00263 
00264             /**
00265             * @internal
00266             */
00267             Node(const Node& that);
00268 
00269         // ----- Node interface -----------------------------------------
00270 
00271         protected:
00272             /**
00273             * Adopt a child node
00274             *
00275             * @param hChild  the child to adopt
00276             * @param fLeft   the position of the child
00277             */
00278             virtual void adopt(Node::Handle hChild, bool fLeft);
00279 
00280             /**
00281             * Get the value associated with the node.
00282             *
00283             * @return the value associated with the node.
00284             */
00285             virtual Object::Holder getValue() const;
00286 
00287             /**
00288             * Set the value associated with the node.
00289             *
00290             * @param ohValue the value assocaited with the node
00291             *
00292             * @return the old value associated with the node
00293             */
00294             virtual Object::Holder setValue(Object::Holder ohValue);
00295 
00296             /**
00297             * Determine if this node is a part of a 2-3-4 leaf node
00298             * (i.e. at least one NULL child).
00299             *
00300             * @return true if this node is a leaf
00301             */
00302             virtual bool isLeaf() const;
00303 
00304             /**
00305             * Unlink this element and all sub elements.
00306             */
00307             virtual void dissolve();
00308 
00309         // ----- Map::Entry interface -----------------------------------
00310 
00311         public:
00312             /**
00313             * Return the key corresponding to this entry.
00314             *
00315             * @return the key corresponding to this entry
00316             */
00317             virtual Object::View getKey() const;
00318 
00319             /**
00320             * Return the value corresponding to this entry.
00321             *
00322             * @return the value corresponding to this entry
00323             */
00324             virtual Object::Holder getValue();
00325 
00326         // ----- Object interface ---------------------------------------
00327 
00328         public:
00329             /**
00330             * {@inheritDoc}
00331             */
00332             virtual void toStream(std::ostream& out) const;
00333 
00334             /**
00335             * {@inheritDoc}
00336             */
00337             virtual void onInit();
00338 
00339         // ----- data members -------------------------------------------
00340 
00341         public:
00342             /**
00343             * The key of the node. The key, once set, is considered
00344             * immutable.
00345             */
00346             FinalView<Object> f_vKey;
00347 
00348             /**
00349             * The value of the node.
00350             */
00351             MemberHolder<Object>  m_ohValue;
00352 
00353             /**
00354             * The AVL balance factor of the sub-tree.
00355             */
00356             int32_t nBalance;
00357 
00358             /**
00359             * The parent of this node.
00360             */
00361             MemberHandle<Node> m_hParent;
00362 
00363             /**
00364             * The left child of this node.
00365             */
00366             MemberHandle<Node> m_hLeft;
00367 
00368             /**
00369             * The right child of this node.
00370             */
00371             MemberHandle<Node> m_hRight;
00372 
00373         // ----- friends --------------------------------------------
00374 
00375         friend class TreeMap;
00376         };
00377 
00378 
00379     // ----- helper methods -------------------------------------------------
00380 
00381     public:
00382         /**
00383         * Remove the specified node from the tree.
00384         *
00385         * The supplied node must be part of the tree.
00386         *
00387         * @param hNode  the node to remove
00388         */
00389         virtual void removeNode(Node::Handle hNode);
00390 
00391         /**
00392         * Determine if Node is the head of the tree.
00393         *
00394         * @param vNode  the node to compare to the head of the tree
00395         *
00396         * @return true if the passed in Node is the head of the tree
00397         */
00398         virtual bool isHead(Node::View vNode) const;
00399 
00400         /**
00401         * Return an Iterator over this tree map.
00402         *
00403         * @return an Iterator over this tree map
00404         */
00405         virtual Iterator::Handle iterator() const;
00406 
00407         /**
00408         * Return an Iterator over this tree map.
00409         *
00410         * @return an Iterator over this tree map
00411         */
00412         virtual Muterator::Handle iterator();
00413 
00414         /**
00415         * Compare two Objects. If both Objects are comparable with this tree
00416         * map's Comparator, return < 0, 0 or > 0 if the first Object is less
00417         * than, equal to, or greater than the second Object.
00418         *
00419         * @param v1  the first object to compare
00420         * @param v2  the second object to compare
00421         *
00422         * @return  < 0, 0 or > 0 if the first Object is less than,
00423         * equal to, or greater than the second Object
00424         */
00425         virtual int32_t compare(Object::View v1, Object::View v2) const;
00426 
00427         /**
00428         * Find the specified key and return its node.
00429         *
00430         * @param vKey  the key to look for
00431         *
00432         * @return the node containing the index or NULL if the index is not
00433         *         in the TreeMap
00434         */
00435         virtual Node::Handle find(Object::View vKey) const;
00436 
00437         /**
00438         * Get the head node.
00439         *
00440         * @return this tree map's head node
00441         */
00442         virtual Node::Handle getHeadNode() const;
00443 
00444     protected:
00445 
00446         /**
00447         * Replace one node with another.
00448         *
00449         * @param hNodeA  the node to be unlinked
00450         * @param hNodeB  the node to be linked in nodeA's place; may be NULL
00451         *
00452         * @return nodeB's new parent
00453         */
00454         virtual Node::Handle replace(Node::Handle hNodeA,
00455                 Node::Handle hNodeB);
00456 
00457         /**
00458         * Rotate a node in a given direction.
00459         *
00460         * @param hNode  the node to rotate
00461         * @param fLeft  the rotation direction
00462         *
00463         * @return the node's new parent (former child)
00464         */
00465         virtual Node::Handle rotate(Node::Handle hNode, bool fLeft);
00466 
00467         /**
00468         * Double rotate a node in a given direction.
00469         *
00470         * @param hNode  the node to rotate
00471         * @param fLeft  the final rotation direction
00472         *
00473         * @return the node's new parent (former grand child)
00474         */
00475         virtual Node::Handle doubleRotate(Node::Handle hNode,
00476                 bool fLeft);
00477 
00478         /**
00479         * Adjust the balance factor of a node and its descendants prior to a
00480         * double rotation.
00481         *
00482         * @param hNode   the node which was rotated
00483         * @param hChild  the child to adjust
00484         * @param nBal    the balance adjustment
00485         */
00486         virtual void adjustDoubleBalance(Node::Handle hNode,
00487                 Node::Handle hChild, int32_t nBal);
00488 
00489         /**
00490         * Find the point at which a Node with the specified index would be
00491         * inserted.
00492         *
00493         * If the tree is empty then null is returned. If the index already
00494         * exists then the existing Node is returned, otherwise the Node which
00495         * will be the parent of the new Node is returned.
00496         *
00497         * @param ovKey  the key of the new node
00498         *
00499         * @return NULL, node, or parent
00500         */
00501         virtual Node::Handle findInsertionPoint(Object::View ovKey) const;
00502 
00503         /**
00504         * Insert a node into a tree and re-balance.
00505         *
00506         * @param hParent  the location at which to insert the node
00507         * @param hChild   the node to insert
00508         */
00509         virtual void balancedInsertion(Node::Handle hParent,
00510                 Node::Handle hChild);
00511 
00512         /**
00513         * Re-balance the tree following the removal of a node.
00514         *
00515         * @param hPruned      the node whose sub-tree shrunk
00516         * @param fPrunedLeft  the side on which the sub-tree shrunk
00517         */
00518         virtual void balancePostRemove(Node::Handle hPruned,
00519                 bool fPrunedLeft);
00520 
00521         /**
00522         * Create a new Node
00523         *
00524         * @param vKey     the key of the new Node
00525         * @param ohValue  the value of the new Node
00526         *
00527         * @return the newly instantiated Node
00528         */
00529         virtual Node::Handle instantiateNode(Object::View vKey,
00530                 Object::Holder ohValue);
00531 
00532 
00533     // ----- data members ---------------------------------------------------
00534 
00535     protected:
00536         /**
00537         * The number of nodes in the tree. This can be determined by
00538         * iterating through the tree, but by keeping the size cached, certain
00539         * operations that need the size of the tree up front are much more
00540         * efficient.
00541         */
00542         size32_t m_nSize;
00543 
00544         /**
00545         * The first node of the tree (or NULL if the tree is empty).  The
00546         * first node is referred to as the "head" or the "root" node.
00547         */
00548         mutable MemberHandle<Node> m_hHead;
00549 
00550         /**
00551         * The comparator used to maintain order in this tree map, or
00552         * NULL if it uses the natural ordering of its keys.
00553         */
00554         FinalView<Comparator> f_vComparator;
00555     };
00556 
00557 COH_CLOSE_NAMESPACE2
00558 
00559 #endif // COH_TREE_MAP_HPP
Copyright © 2000, 2014, Oracle and/or its affiliates. All rights reserved.