1*38fd1498Szrj // -*- C++ -*- 2*38fd1498Szrj 3*38fd1498Szrj // Copyright (C) 2005-2018 Free Software Foundation, Inc. 4*38fd1498Szrj // 5*38fd1498Szrj // This file is part of the GNU ISO C++ Library. This library is free 6*38fd1498Szrj // software; you can redistribute it and/or modify it under the terms 7*38fd1498Szrj // of the GNU General Public License as published by the Free Software 8*38fd1498Szrj // Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj // version. 10*38fd1498Szrj 11*38fd1498Szrj // This library is distributed in the hope that it will be useful, but 12*38fd1498Szrj // WITHOUT ANY WARRANTY; without even the implied warranty of 13*38fd1498Szrj // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14*38fd1498Szrj // General Public License for more details. 15*38fd1498Szrj 16*38fd1498Szrj // Under Section 7 of GPL version 3, you are granted additional 17*38fd1498Szrj // permissions described in the GCC Runtime Library Exception, version 18*38fd1498Szrj // 3.1, as published by the Free Software Foundation. 19*38fd1498Szrj 20*38fd1498Szrj // You should have received a copy of the GNU General Public License and 21*38fd1498Szrj // a copy of the GCC Runtime Library Exception along with this program; 22*38fd1498Szrj // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23*38fd1498Szrj // <http://www.gnu.org/licenses/>. 24*38fd1498Szrj 25*38fd1498Szrj // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL. 26*38fd1498Szrj 27*38fd1498Szrj // Permission to use, copy, modify, sell, and distribute this software 28*38fd1498Szrj // is hereby granted without fee, provided that the above copyright 29*38fd1498Szrj // notice appears in all copies, and that both that copyright notice 30*38fd1498Szrj // and this permission notice appear in supporting documentation. None 31*38fd1498Szrj // of the above authors, nor IBM Haifa Research Laboratories, make any 32*38fd1498Szrj // representation about the suitability of this software for any 33*38fd1498Szrj // purpose. It is provided "as is" without express or implied 34*38fd1498Szrj // warranty. 35*38fd1498Szrj 36*38fd1498Szrj /** 37*38fd1498Szrj * @file tree_policy.hpp 38*38fd1498Szrj * Contains tree-related policies. 39*38fd1498Szrj */ 40*38fd1498Szrj 41*38fd1498Szrj #ifndef PB_DS_TREE_POLICY_HPP 42*38fd1498Szrj #define PB_DS_TREE_POLICY_HPP 43*38fd1498Szrj 44*38fd1498Szrj #include <bits/c++config.h> 45*38fd1498Szrj #include <iterator> 46*38fd1498Szrj #include <ext/pb_ds/detail/type_utils.hpp> 47*38fd1498Szrj #include <ext/pb_ds/detail/branch_policy/branch_policy.hpp> 48*38fd1498Szrj 49*38fd1498Szrj namespace __gnu_pbds 50*38fd1498Szrj { 51*38fd1498Szrj #define PB_DS_CLASS_T_DEC \ 52*38fd1498Szrj template<typename Node_CItr, typename Node_Itr, typename Cmp_Fn, \ 53*38fd1498Szrj typename _Alloc> 54*38fd1498Szrj 55*38fd1498Szrj #define PB_DS_CLASS_C_DEC \ 56*38fd1498Szrj tree_order_statistics_node_update<Node_CItr, Node_Itr, Cmp_Fn, _Alloc> 57*38fd1498Szrj 58*38fd1498Szrj #define PB_DS_BRANCH_POLICY_BASE \ 59*38fd1498Szrj detail::branch_policy<Node_CItr, Node_Itr, _Alloc> 60*38fd1498Szrj 61*38fd1498Szrj /// Functor updating ranks of entrees. 62*38fd1498Szrj template<typename Node_CItr, typename Node_Itr, 63*38fd1498Szrj typename Cmp_Fn, typename _Alloc> 64*38fd1498Szrj class tree_order_statistics_node_update : private PB_DS_BRANCH_POLICY_BASE 65*38fd1498Szrj { 66*38fd1498Szrj private: 67*38fd1498Szrj typedef PB_DS_BRANCH_POLICY_BASE base_type; 68*38fd1498Szrj 69*38fd1498Szrj public: 70*38fd1498Szrj typedef Cmp_Fn cmp_fn; 71*38fd1498Szrj typedef _Alloc allocator_type; 72*38fd1498Szrj typedef typename allocator_type::size_type size_type; 73*38fd1498Szrj typedef typename base_type::key_type key_type; 74*38fd1498Szrj typedef typename base_type::key_const_reference key_const_reference; 75*38fd1498Szrj 76*38fd1498Szrj typedef size_type metadata_type; 77*38fd1498Szrj typedef Node_CItr node_const_iterator; 78*38fd1498Szrj typedef Node_Itr node_iterator; 79*38fd1498Szrj typedef typename node_const_iterator::value_type const_iterator; 80*38fd1498Szrj typedef typename node_iterator::value_type iterator; 81*38fd1498Szrj 82*38fd1498Szrj /// Finds an entry by __order. Returns a const_iterator to the 83*38fd1498Szrj /// entry with the __order order, or a const_iterator to the 84*38fd1498Szrj /// container object's end if order is at least the size of the 85*38fd1498Szrj /// container object. 86*38fd1498Szrj inline const_iterator 87*38fd1498Szrj find_by_order(size_type) const; 88*38fd1498Szrj 89*38fd1498Szrj /// Finds an entry by __order. Returns an iterator to the entry 90*38fd1498Szrj /// with the __order order, or an iterator to the container 91*38fd1498Szrj /// object's end if order is at least the size of the container 92*38fd1498Szrj /// object. 93*38fd1498Szrj inline iterator 94*38fd1498Szrj find_by_order(size_type); 95*38fd1498Szrj 96*38fd1498Szrj /// Returns the order of a key within a sequence. For exapmle, if 97*38fd1498Szrj /// r_key is the smallest key, this method will return 0; if r_key 98*38fd1498Szrj /// is a key between the smallest and next key, this method will 99*38fd1498Szrj /// return 1; if r_key is a key larger than the largest key, this 100*38fd1498Szrj /// method will return the size of r_c. 101*38fd1498Szrj inline size_type 102*38fd1498Szrj order_of_key(key_const_reference) const; 103*38fd1498Szrj 104*38fd1498Szrj private: 105*38fd1498Szrj /// Const reference to the container's value-type. 106*38fd1498Szrj typedef typename base_type::const_reference const_reference; 107*38fd1498Szrj 108*38fd1498Szrj /// Const pointer to the container's value-type. 109*38fd1498Szrj typedef typename base_type::const_pointer const_pointer; 110*38fd1498Szrj 111*38fd1498Szrj typedef typename _Alloc::template rebind<metadata_type>::other __rebind_m; 112*38fd1498Szrj 113*38fd1498Szrj /// Const metadata reference. 114*38fd1498Szrj typedef typename __rebind_m::const_reference metadata_const_reference; 115*38fd1498Szrj 116*38fd1498Szrj /// Metadata reference. 117*38fd1498Szrj typedef typename __rebind_m::reference metadata_reference; 118*38fd1498Szrj 119*38fd1498Szrj /// Returns the node_const_iterator associated with the tree's root node. 120*38fd1498Szrj virtual node_const_iterator 121*38fd1498Szrj node_begin() const = 0; 122*38fd1498Szrj 123*38fd1498Szrj /// Returns the node_iterator associated with the tree's root node. 124*38fd1498Szrj virtual node_iterator 125*38fd1498Szrj node_begin() = 0; 126*38fd1498Szrj 127*38fd1498Szrj /// Returns the node_const_iterator associated with a just-after leaf node. 128*38fd1498Szrj virtual node_const_iterator 129*38fd1498Szrj node_end() const = 0; 130*38fd1498Szrj 131*38fd1498Szrj /// Returns the node_iterator associated with a just-after leaf node. 132*38fd1498Szrj virtual node_iterator 133*38fd1498Szrj node_end() = 0; 134*38fd1498Szrj 135*38fd1498Szrj /// Access to the cmp_fn object. 136*38fd1498Szrj virtual cmp_fn& 137*38fd1498Szrj get_cmp_fn() = 0; 138*38fd1498Szrj 139*38fd1498Szrj protected: 140*38fd1498Szrj /// Updates the rank of a node through a node_iterator node_it; 141*38fd1498Szrj /// end_nd_it is the end node iterator. 142*38fd1498Szrj inline void 143*38fd1498Szrj operator()(node_iterator, node_const_iterator) const; 144*38fd1498Szrj 145*38fd1498Szrj virtual 146*38fd1498Szrj ~tree_order_statistics_node_update(); 147*38fd1498Szrj }; 148*38fd1498Szrj 149*38fd1498Szrj #include <ext/pb_ds/detail/tree_policy/order_statistics_imp.hpp> 150*38fd1498Szrj 151*38fd1498Szrj #undef PB_DS_CLASS_T_DEC 152*38fd1498Szrj #undef PB_DS_CLASS_C_DEC 153*38fd1498Szrj #undef PB_DS_BRANCH_POLICY_BASE 154*38fd1498Szrj 155*38fd1498Szrj } // namespace __gnu_pbds 156*38fd1498Szrj 157*38fd1498Szrj #endif 158