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

E90870-01

coherence/util/TreeMap.hpp

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