/* * Copyright (C) 2010 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // A red-black tree, which is a form of a balanced binary tree. It // supports efficient insertion, deletion and queries of comparable // elements. The same element may be inserted multiple times. The // algorithmic complexity of common operations is: // // Insertion: O(lg(n)) // Deletion: O(lg(n)) // Querying: O(lg(n)) // // The data type T that is stored in this red-black tree must be only // Plain Old Data (POD), or bottom out into POD. It must _not_ rely on // having its destructor called. This implementation internally // allocates storage in large chunks and does not call the destructor // on each object. // // Type T must supply a default constructor, a copy constructor, and // the "<" and "==" operators. // // In debug mode, printing of the data contained in the tree is // enabled. This requires the template specialization to be available: // // template<> struct ValueToString<T> { // static String toString(const T& t); // }; // // Note that when complex types are stored in this red/black tree, it // is possible that single invocations of the "<" and "==" operators // will be insufficient to describe the ordering of elements in the // tree during queries. As a concrete example, consider the case where // intervals are stored in the tree sorted by low endpoint. The "<" // operator on the Interval class only compares the low endpoint, but // the "==" operator takes into account the high endpoint as well. // This makes the necessary logic for querying and deletion somewhat // more complex. In order to properly handle such situations, the // property "needsFullOrderingComparisons" must be set to true on // the tree. // // This red-black tree is designed to be _augmented_; subclasses can // add additional and summary information to each node to efficiently // store and index more complex data structures. A concrete example is // the IntervalTree, which extends each node with a summary statistic // to efficiently store one-dimensional intervals. // // The design of this red-black tree comes from Cormen, Leiserson, // and Rivest, _Introduction to Algorithms_, MIT Press, 1990. #ifndef THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_POD_RED_BLACK_TREE_H_ #define THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_POD_RED_BLACK_TREE_H_ #include "base/memory/scoped_refptr.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" #include "third_party/blink/renderer/platform/wtf/pod_free_list_arena.h" #ifndef NDEBUG #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #endif namespace WTF { #ifndef NDEBUG template <class T> struct ValueToString; #endif enum UninitializedTreeEnum { … }; template <class T> class PODRedBlackTree { … }; } // namespace WTF #endif // THIRD_PARTY_BLINK_RENDERER_PLATFORM_WTF_POD_RED_BLACK_TREE_H_