// -*- C++ -*-

// Copyright (C) 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
//
// This file is part of the GNU ISO C++ Library.  This library is free
// software; you can redistribute it and/or modify it under the terms
// of the GNU General Public License as published by the Free Software
// Foundation; either version 3, or (at your option) any later
// version.

// This library is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.

// Under Section 7 of GPL version 3, you are granted additional
// permissions described in the GCC Runtime Library Exception, version
// 3.1, as published by the Free Software Foundation.

// You should have received a copy of the GNU General Public License and
// a copy of the GCC Runtime Library Exception along with this program;
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
// <http://www.gnu.org/licenses/>.

// Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.

// Permission to use, copy, modify, sell, and distribute this software
// is hereby granted without fee, provided that the above copyright
// notice appears in all copies, and that both that copyright notice
// and this permission notice appear in supporting documentation. None
// of the above authors, nor IBM Haifa Research Laboratories, make any
// representation about the suitability of this software for any
// purpose. It is provided "as is" without express or implied
// warranty.

/**
 * @file pat_trie_.hpp
 * Contains an implementation class for a patricia tree.
 */

/**
 * This implementation loosely borrows ideas from:
 * 1) Fast Mergeable Integer Maps, Okasaki, Gill 1998
 * 2) Ptset: Sets of integers implemented as Patricia trees,
 *    Jean-Christophe Filliatr, 2000
 **/

#include <ext/pb_ds/detail/pat_trie_/synth_e_access_traits.hpp>
#include <ext/pb_ds/detail/pat_trie_/node_base.hpp>
#include <ext/pb_ds/exception.hpp>
#include <ext/pb_ds/tag_and_trait.hpp>
#include <ext/pb_ds/detail/eq_fn/eq_by_less.hpp>
#include <ext/pb_ds/detail/types_traits.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/detail/cond_dealtor.hpp>
#include <ext/pb_ds/detail/type_utils.hpp>
#include <iterator>
#include <utility>
#include <algorithm>
#include <functional>
#include <assert.h>
#include <list>
#ifdef _GLIBCXX_DEBUG
#include <ext/pb_ds/detail/debug_map_base.hpp>
#endif 
#include <debug/debug.h>

namespace __gnu_pbds
{
  namespace detail
  {
#define PB_DS_CLASS_T_DEC \
    template<typename Key, typename Mapped, typename Node_And_It_Traits, \
	     typename Allocator>

#ifdef PB_DS_DATA_TRUE_INDICATOR
#define PB_DS_CLASS_NAME pat_trie_data_
#endif 

#ifdef PB_DS_DATA_FALSE_INDICATOR
#define PB_DS_CLASS_NAME pat_trie_no_data_
#endif 

#define PB_DS_CLASS_C_DEC \
    PB_DS_CLASS_NAME<Key, Mapped, Node_And_It_Traits, Allocator>

#define PB_DS_TYPES_TRAITS_C_DEC \
    types_traits<Key, Mapped, Allocator, false>

#ifdef _GLIBCXX_DEBUG
#define PB_DS_DEBUG_MAP_BASE_C_DEC \
    debug_map_base<Key,	eq_by_less<Key, \
			std::less<Key> >, typename Allocator::template rebind<Key>::other::const_reference>
#endif 

#ifdef PB_DS_DATA_TRUE_INDICATOR
#define PB_DS_V2F(X) (X).first
#define PB_DS_V2S(X) (X).second
#define PB_DS_EP2VP(X)& ((X)->m_value)
#endif 

#ifdef PB_DS_DATA_FALSE_INDICATOR
#define PB_DS_V2F(X) (X)
#define PB_DS_V2S(X) Mapped_Data()
#define PB_DS_EP2VP(X)& ((X)->m_value.first)
#endif 

    /**
     * class description = PATRICIA trie implementation.">
     **/
    template<typename Key,
	     typename Mapped,
	     typename Node_And_It_Traits,
	     typename Allocator>
    class PB_DS_CLASS_NAME :
#ifdef _GLIBCXX_DEBUG
      public PB_DS_DEBUG_MAP_BASE_C_DEC,
#endif 
      public Node_And_It_Traits::synth_e_access_traits,
      public Node_And_It_Traits::node_update,
      public PB_DS_TYPES_TRAITS_C_DEC
    {
    private:
      typedef PB_DS_TYPES_TRAITS_C_DEC traits_base;

      typedef typename Node_And_It_Traits::synth_e_access_traits synth_e_access_traits;
      typedef typename Allocator::template rebind<synth_e_access_traits>::other::const_pointer const_e_access_traits_pointer;
      typedef typename synth_e_access_traits::const_iterator const_e_iterator;

      typedef typename Node_And_It_Traits::node node;
      typedef typename Allocator::template rebind<node>::other::const_pointer const_node_pointer;

      typedef typename Allocator::template rebind<node>::other::pointer node_pointer;

      typedef typename Node_And_It_Traits::head head;
      typedef typename Allocator::template rebind<head>::other head_allocator;
      typedef typename head_allocator::pointer head_pointer;

      typedef typename Node_And_It_Traits::leaf leaf;
      typedef typename Allocator::template rebind<leaf>::other leaf_allocator;
      typedef typename leaf_allocator::const_pointer const_leaf_pointer;
      typedef typename leaf_allocator::pointer leaf_pointer;

      typedef typename Node_And_It_Traits::internal_node internal_node;
      typedef typename Allocator::template rebind<internal_node>::other internal_node_allocator;
      typedef typename internal_node_allocator::const_pointer const_internal_node_pointer;
      typedef typename internal_node_allocator::pointer internal_node_pointer;

#include <ext/pb_ds/detail/pat_trie_/cond_dtor_entry_dealtor.hpp>

#ifdef _GLIBCXX_DEBUG
      typedef PB_DS_DEBUG_MAP_BASE_C_DEC debug_base;
#endif 

#include <ext/pb_ds/detail/pat_trie_/split_join_branch_bag.hpp>

      typedef typename Node_And_It_Traits::null_node_update_pointer null_node_update_pointer;

    public:
      typedef pat_trie_tag container_category;
      typedef Allocator allocator_type;
      typedef typename Allocator::size_type size_type;
      typedef typename Allocator::difference_type difference_type;

      typedef typename traits_base::key_type key_type;
      typedef typename traits_base::key_pointer key_pointer;
      typedef typename traits_base::const_key_pointer const_key_pointer;
      typedef typename traits_base::key_reference key_reference;
      typedef typename traits_base::const_key_reference const_key_reference;
      typedef typename traits_base::mapped_type mapped_type;
      typedef typename traits_base::mapped_pointer mapped_pointer;
      typedef typename traits_base::const_mapped_pointer const_mapped_pointer;
      typedef typename traits_base::mapped_reference mapped_reference;
      typedef typename traits_base::const_mapped_reference const_mapped_reference;
      typedef typename traits_base::value_type value_type;
      typedef typename traits_base::pointer pointer;
      typedef typename traits_base::const_pointer const_pointer;
      typedef typename traits_base::reference reference;
      typedef typename traits_base::const_reference const_reference;

      typedef typename Node_And_It_Traits::const_iterator const_point_iterator;
      typedef typename Node_And_It_Traits::iterator point_iterator;
      typedef const_point_iterator const_iterator;
      typedef point_iterator iterator;

      typedef typename Node_And_It_Traits::const_reverse_iterator const_reverse_iterator;
      typedef typename Node_And_It_Traits::reverse_iterator reverse_iterator;
      typedef typename Node_And_It_Traits::const_node_iterator const_node_iterator;
      typedef typename Node_And_It_Traits::node_iterator node_iterator;
      typedef typename Node_And_It_Traits::e_access_traits e_access_traits;
      typedef typename Node_And_It_Traits::node_update node_update;

      PB_DS_CLASS_NAME();

      PB_DS_CLASS_NAME(const e_access_traits&);

      PB_DS_CLASS_NAME(const PB_DS_CLASS_C_DEC&);

      void
      swap(PB_DS_CLASS_C_DEC&);

      ~PB_DS_CLASS_NAME();

      inline bool
      empty() const;

      inline size_type
      size() const;

      inline size_type
      max_size() const;

      e_access_traits& 
      get_e_access_traits();

      const e_access_traits& 
      get_e_access_traits() const;

      node_update& 
      get_node_update();

      const node_update& 
      get_node_update() const;

      inline std::pair<point_iterator, bool>
      insert(const_reference);

      inline mapped_reference
      operator[](const_key_reference r_key)
      {
#ifdef PB_DS_DATA_TRUE_INDICATOR
	return insert(std::make_pair(r_key, mapped_type())).first->second;
#else 
	insert(r_key);
	return traits_base::s_null_mapped;
#endif 
      }

      inline point_iterator
      find(const_key_reference);

      inline const_point_iterator
      find(const_key_reference) const;

      inline point_iterator
      lower_bound(const_key_reference);

      inline const_point_iterator
      lower_bound(const_key_reference) const;

      inline point_iterator
      upper_bound(const_key_reference);

      inline const_point_iterator
      upper_bound(const_key_reference) const;

      void
      clear();

      inline bool
      erase(const_key_reference);

      inline const_iterator
      erase(const_iterator);

#ifdef PB_DS_DATA_TRUE_INDICATOR
      inline iterator
      erase(iterator);
#endif 

      inline const_reverse_iterator
      erase(const_reverse_iterator);

#ifdef PB_DS_DATA_TRUE_INDICATOR
      inline reverse_iterator
      erase(reverse_iterator);
#endif 

      template<typename Pred>
      inline size_type
      erase_if(Pred);

      void
      join(PB_DS_CLASS_C_DEC&);

      void
      split(const_key_reference, PB_DS_CLASS_C_DEC&);

      inline iterator
      begin();

      inline const_iterator
      begin() const;

      inline iterator
      end();

      inline const_iterator
      end() const;

      inline reverse_iterator
      rbegin();

      inline const_reverse_iterator
      rbegin() const;

      inline reverse_iterator
      rend();

      inline const_reverse_iterator
      rend() const;

      inline const_node_iterator
      node_begin() const;

      inline node_iterator
      node_begin();

      inline const_node_iterator
      node_end() const;

      inline node_iterator
      node_end();

#ifdef PB_DS_PAT_TRIE_TRACE_
      void
      trace() const;
#endif 

    protected:

      template<typename It>
      void
      copy_from_range(It, It);

      void
      value_swap(PB_DS_CLASS_C_DEC&);

      node_pointer
      recursive_copy_node(const_node_pointer);

    private:

      void
      initialize();

      inline void
      apply_update(node_pointer, null_node_update_pointer);

      template<typename Node_Update_>
      inline void
      apply_update(node_pointer, Node_Update_*);

      bool
      join_prep(PB_DS_CLASS_C_DEC&, split_join_branch_bag&);

      void
      rec_join_prep(const_node_pointer, const_node_pointer, 
		    split_join_branch_bag&);

      void
      rec_join_prep(const_leaf_pointer, const_leaf_pointer, 
		    split_join_branch_bag&);

      void
      rec_join_prep(const_leaf_pointer, const_internal_node_pointer, 
		    split_join_branch_bag&);

      void
      rec_join_prep(const_internal_node_pointer, const_leaf_pointer, 
		    split_join_branch_bag&);

      void
      rec_join_prep(const_internal_node_pointer, const_internal_node_pointer, 
		    split_join_branch_bag&);

      node_pointer
      rec_join(node_pointer, node_pointer, size_type, split_join_branch_bag&);

      node_pointer
      rec_join(leaf_pointer, leaf_pointer, split_join_branch_bag&);

      node_pointer
      rec_join(leaf_pointer, internal_node_pointer, size_type, 
	       split_join_branch_bag&);

      node_pointer
      rec_join(internal_node_pointer, leaf_pointer, size_type, 
	       split_join_branch_bag&);

      node_pointer
      rec_join(internal_node_pointer, internal_node_pointer, 
	       split_join_branch_bag&);

      size_type
      keys_diff_ind(typename e_access_traits::const_iterator, typename e_access_traits::const_iterator, typename e_access_traits::const_iterator, typename e_access_traits::const_iterator);

      internal_node_pointer
      insert_branch(node_pointer, node_pointer, split_join_branch_bag&);

      void
      update_min_max_for_inserted_leaf(leaf_pointer);

      void
      erase_leaf(leaf_pointer);

      inline void
      actual_erase_leaf(leaf_pointer);

      void
      clear_imp(node_pointer);

      void
      erase_fixup(internal_node_pointer);

      void
      update_min_max_for_erased_leaf(leaf_pointer);

      static inline const_e_iterator
      pref_begin(const_node_pointer);

      static inline const_e_iterator
      pref_end(const_node_pointer);

      inline node_pointer
      find_imp(const_key_reference);

      inline node_pointer
      lower_bound_imp(const_key_reference);

      inline node_pointer
      upper_bound_imp(const_key_reference);

      inline static const_leaf_pointer
      leftmost_descendant(const_node_pointer);

      inline static leaf_pointer
      leftmost_descendant(node_pointer);

      inline static const_leaf_pointer
      rightmost_descendant(const_node_pointer);

      inline static leaf_pointer
      rightmost_descendant(node_pointer);

#ifdef _GLIBCXX_DEBUG
      void
      assert_valid() const;

      void
      assert_iterators() const;

      void
      assert_reverse_iterators() const;

      static size_type
      recursive_count_leafs(const_node_pointer);
#endif 

#ifdef PB_DS_PAT_TRIE_TRACE_
      static void
      trace_node(const_node_pointer, size_type);

      template<typename Metadata_>
      static void
      trace_node_metadata(const_node_pointer, type_to_type<Metadata_>);

      static void
      trace_node_metadata(const_node_pointer, type_to_type<null_node_metadata>);
#endif 

      leaf_pointer
      split_prep(const_key_reference, PB_DS_CLASS_C_DEC&, 
		 split_join_branch_bag&);

      node_pointer
      rec_split(node_pointer, const_e_iterator, const_e_iterator, 
		PB_DS_CLASS_C_DEC&, split_join_branch_bag&);

      void
      split_insert_branch(size_type, const_e_iterator, 
			  typename internal_node::iterator, 
			  size_type, split_join_branch_bag&);

      static head_allocator s_head_allocator;
      static internal_node_allocator s_internal_node_allocator;
      static leaf_allocator s_leaf_allocator;

      head_pointer m_p_head;
      size_type m_size;
    };

#include <ext/pb_ds/detail/pat_trie_/constructors_destructor_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/iterators_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/insert_join_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/erase_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/find_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/info_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/policy_access_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/split_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/debug_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/trace_fn_imps.hpp>
#include <ext/pb_ds/detail/pat_trie_/update_fn_imps.hpp>

#undef PB_DS_CLASS_C_DEC
#undef PB_DS_CLASS_T_DEC
#undef PB_DS_CLASS_NAME
#undef PB_DS_TYPES_TRAITS_C_DEC
#undef PB_DS_DEBUG_MAP_BASE_C_DEC
#undef PB_DS_V2F
#undef PB_DS_EP2VP
#undef PB_DS_V2S

  } // namespace detail
} // namespace __gnu_pbds
