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 priority_queue.hpp 38*38fd1498Szrj * Contains priority_queues. 39*38fd1498Szrj */ 40*38fd1498Szrj 41*38fd1498Szrj #ifndef PB_DS_PRIORITY_QUEUE_HPP 42*38fd1498Szrj #define PB_DS_PRIORITY_QUEUE_HPP 43*38fd1498Szrj 44*38fd1498Szrj #include <bits/c++config.h> 45*38fd1498Szrj #include <ext/pb_ds/tag_and_trait.hpp> 46*38fd1498Szrj #include <ext/pb_ds/detail/priority_queue_base_dispatch.hpp> 47*38fd1498Szrj #include <ext/pb_ds/detail/standard_policies.hpp> 48*38fd1498Szrj 49*38fd1498Szrj namespace __gnu_pbds 50*38fd1498Szrj { 51*38fd1498Szrj /** 52*38fd1498Szrj * @defgroup heap-based Heap-Based 53*38fd1498Szrj * @ingroup containers-pbds 54*38fd1498Szrj * @{ 55*38fd1498Szrj */ 56*38fd1498Szrj 57*38fd1498Szrj /** 58*38fd1498Szrj * @defgroup heap-detail Base and Policy Classes 59*38fd1498Szrj * @ingroup heap-based 60*38fd1498Szrj */ 61*38fd1498Szrj 62*38fd1498Szrj /** 63*38fd1498Szrj * A priority queue composed of one specific heap policy. 64*38fd1498Szrj * 65*38fd1498Szrj * @tparam _Tv Value type. 66*38fd1498Szrj * @tparam Cmp_Fn Comparison functor. 67*38fd1498Szrj * @tparam Tag Instantiating data structure type, 68*38fd1498Szrj * see container_tag. 69*38fd1498Szrj * @tparam _Alloc Allocator type. 70*38fd1498Szrj * 71*38fd1498Szrj * Base is dispatched at compile time via Tag, from the following 72*38fd1498Szrj * choices: binary_heap_tag, binomial_heap_tag, pairing_heap_tag, 73*38fd1498Szrj * rc_binomial_heap_tag, thin_heap_tag 74*38fd1498Szrj * 75*38fd1498Szrj * Base choices are: detail::binary_heap, detail::binomial_heap, 76*38fd1498Szrj * detail::pairing_heap, detail::rc_binomial_heap, 77*38fd1498Szrj * detail::thin_heap. 78*38fd1498Szrj */ 79*38fd1498Szrj template<typename _Tv, 80*38fd1498Szrj typename Cmp_Fn = std::less<_Tv>, 81*38fd1498Szrj typename Tag = pairing_heap_tag, 82*38fd1498Szrj typename _Alloc = std::allocator<char> > 83*38fd1498Szrj class priority_queue 84*38fd1498Szrj : public detail::container_base_dispatch<_Tv, Cmp_Fn, _Alloc, Tag>::type 85*38fd1498Szrj { 86*38fd1498Szrj public: 87*38fd1498Szrj typedef _Tv value_type; 88*38fd1498Szrj typedef Cmp_Fn cmp_fn; 89*38fd1498Szrj typedef Tag container_category; 90*38fd1498Szrj typedef _Alloc allocator_type; 91*38fd1498Szrj typedef typename allocator_type::size_type size_type; 92*38fd1498Szrj typedef typename allocator_type::difference_type difference_type; 93*38fd1498Szrj 94*38fd1498Szrj private: 95*38fd1498Szrj typedef typename detail::container_base_dispatch<_Tv, Cmp_Fn, _Alloc, 96*38fd1498Szrj Tag>::type 97*38fd1498Szrj base_type; 98*38fd1498Szrj typedef typename _Alloc::template rebind<_Tv> __rebind_v; 99*38fd1498Szrj typedef typename __rebind_v::other __rebind_va; 100*38fd1498Szrj 101*38fd1498Szrj public: 102*38fd1498Szrj typedef typename __rebind_va::reference reference; 103*38fd1498Szrj typedef typename __rebind_va::const_reference const_reference; 104*38fd1498Szrj typedef typename __rebind_va::pointer pointer; 105*38fd1498Szrj typedef typename __rebind_va::const_pointer const_pointer; 106*38fd1498Szrj 107*38fd1498Szrj typedef typename base_type::point_iterator point_iterator; 108*38fd1498Szrj typedef typename base_type::point_const_iterator point_const_iterator; 109*38fd1498Szrj typedef typename base_type::iterator iterator; 110*38fd1498Szrj typedef typename base_type::const_iterator const_iterator; 111*38fd1498Szrj priority_queue()112*38fd1498Szrj priority_queue() { } 113*38fd1498Szrj 114*38fd1498Szrj /// Constructor taking some policy objects. r_cmp_fn will be 115*38fd1498Szrj /// copied by the Cmp_Fn object of the container object. priority_queue(const cmp_fn & r_cmp_fn)116*38fd1498Szrj priority_queue(const cmp_fn& r_cmp_fn) : base_type(r_cmp_fn) { } 117*38fd1498Szrj 118*38fd1498Szrj /// Constructor taking __iterators to a range of value_types. The 119*38fd1498Szrj /// value_types between first_it and last_it will be inserted into 120*38fd1498Szrj /// the container object. 121*38fd1498Szrj template<typename It> priority_queue(It first_it,It last_it)122*38fd1498Szrj priority_queue(It first_it, It last_it) 123*38fd1498Szrj { base_type::copy_from_range(first_it, last_it); } 124*38fd1498Szrj 125*38fd1498Szrj /// Constructor taking __iterators to a range of value_types and 126*38fd1498Szrj /// some policy objects The value_types between first_it and 127*38fd1498Szrj /// last_it will be inserted into the container object. r_cmp_fn 128*38fd1498Szrj /// will be copied by the cmp_fn object of the container object. 129*38fd1498Szrj template<typename It> priority_queue(It first_it,It last_it,const cmp_fn & r_cmp_fn)130*38fd1498Szrj priority_queue(It first_it, It last_it, const cmp_fn& r_cmp_fn) 131*38fd1498Szrj : base_type(r_cmp_fn) 132*38fd1498Szrj { base_type::copy_from_range(first_it, last_it); } 133*38fd1498Szrj priority_queue(const priority_queue & other)134*38fd1498Szrj priority_queue(const priority_queue& other) 135*38fd1498Szrj : base_type((const base_type& )other) { } 136*38fd1498Szrj 137*38fd1498Szrj virtual ~priority_queue()138*38fd1498Szrj ~priority_queue() { } 139*38fd1498Szrj 140*38fd1498Szrj priority_queue& operator =(const priority_queue & other)141*38fd1498Szrj operator=(const priority_queue& other) 142*38fd1498Szrj { 143*38fd1498Szrj if (this != &other) 144*38fd1498Szrj { 145*38fd1498Szrj priority_queue tmp(other); 146*38fd1498Szrj swap(tmp); 147*38fd1498Szrj } 148*38fd1498Szrj return *this; 149*38fd1498Szrj } 150*38fd1498Szrj 151*38fd1498Szrj void swap(priority_queue & other)152*38fd1498Szrj swap(priority_queue& other) 153*38fd1498Szrj { base_type::swap(other); } 154*38fd1498Szrj }; 155*38fd1498Szrj } // namespace __gnu_pbds 156*38fd1498Szrj //@} heap-based 157*38fd1498Szrj #endif 158