Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | RSS feed

  1. // -*- C++ -*-
  2.  
  3. // Copyright (C) 2005-2013 Free Software Foundation, Inc.
  4. //
  5. // This file is part of the GNU ISO C++ Library.  This library is free
  6. // software; you can redistribute it and/or modify it under the terms
  7. // of the GNU General Public License as published by the Free Software
  8. // Foundation; either version 3, or (at your option) any later
  9. // version.
  10.  
  11. // This library is distributed in the hope that it will be useful, but
  12. // WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  14. // General Public License for more details.
  15.  
  16. // Under Section 7 of GPL version 3, you are granted additional
  17. // permissions described in the GCC Runtime Library Exception, version
  18. // 3.1, as published by the Free Software Foundation.
  19.  
  20. // You should have received a copy of the GNU General Public License and
  21. // a copy of the GCC Runtime Library Exception along with this program;
  22. // see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
  23. // <http://www.gnu.org/licenses/>.
  24.  
  25. // Copyright (C) 2004 Ami Tavory and Vladimir Dreizin, IBM-HRL.
  26.  
  27. // Permission to use, copy, modify, sell, and distribute this software
  28. // is hereby granted without fee, provided that the above copyright
  29. // notice appears in all copies, and that both that copyright notice
  30. // and this permission notice appear in supporting documentation. None
  31. // of the above authors, nor IBM Haifa Research Laboratories, make any
  32. // representation about the suitability of this software for any
  33. // purpose. It is provided "as is" without express or implied
  34. // warranty.
  35.  
  36. /**
  37.  * @file tag_and_trait.hpp
  38.  * Contains tags and traits, e.g., ones describing underlying
  39.  * data structures.
  40.  */
  41.  
  42. #ifndef PB_DS_TAG_AND_TRAIT_HPP
  43. #define PB_DS_TAG_AND_TRAIT_HPP
  44.  
  45. #include <bits/c++config.h>
  46. #include <ext/pb_ds/detail/type_utils.hpp>
  47.  
  48. /**
  49.  * @namespace __gnu_pbds
  50.  * @brief GNU extensions for policy-based data structures for public use.
  51.  */
  52. namespace __gnu_pbds
  53. {
  54.   /** @defgroup pbds Policy-Based Data Structures
  55.    *  @ingroup extensions
  56.    *
  57.    *  This is a library of policy-based elementary data structures:
  58.    *  associative containers and priority queues. It is designed for
  59.    *  high-performance, flexibility, semantic safety, and conformance
  60.    *  to the corresponding containers in std (except for some points
  61.    *  where it differs by design).
  62.    *
  63.    *  For details, see:
  64.    *  http://gcc.gnu.org/onlinedocs/libstdc++/ext/pb_ds/index.html
  65.    *
  66.    *  @{
  67.    */
  68.  
  69.   /**
  70.    *  @defgroup tags Tags
  71.    *  @{  
  72.    */
  73.   /// A trivial iterator tag. Signifies that the iterators has none of
  74.   /// std::iterators's movement abilities.
  75.   struct trivial_iterator_tag
  76.   { };
  77.  
  78.   /// Prohibit moving trivial iterators.
  79.   typedef void trivial_iterator_difference_type;
  80.  
  81.  
  82.   /**
  83.    *  @defgroup invalidation_tags  Invalidation Guarantees
  84.    *  @ingroup tags
  85.    *  @{
  86.    */
  87.  
  88.   /**
  89.    *  Signifies a basic invalidation guarantee that any iterator,
  90.    *  pointer, or reference to a container object's mapped value type
  91.    *  is valid as long as the container is not modified.
  92.    */
  93.   struct basic_invalidation_guarantee
  94.   { };
  95.  
  96.   /**
  97.    *  Signifies an invalidation guarantee that includes all those of
  98.    *  its base, and additionally, that any point-type iterator,
  99.    *  pointer, or reference to a container object's mapped value type
  100.    *  is valid as long as its corresponding entry has not be erased,
  101.    *  regardless of modifications to the container object.
  102.    */
  103.   struct point_invalidation_guarantee : public basic_invalidation_guarantee
  104.   { };
  105.  
  106.   /**
  107.    *  Signifies an invalidation guarantee that includes all those of
  108.    *  its base, and additionally, that any range-type iterator
  109.    *  (including the returns of begin() and end()) is in the correct
  110.    *  relative positions to other range-type iterators as long as its
  111.    *  corresponding entry has not be erased, regardless of
  112.    *  modifications to the container object.
  113.    */
  114.   struct range_invalidation_guarantee : public point_invalidation_guarantee
  115.   { };
  116.   //@}
  117.  
  118.  
  119.   /**
  120.    *  @defgroup ds_tags Data Structure Type
  121.    *  @ingroup tags
  122.    *  @{
  123.    */
  124.   /// Base data structure tag.
  125.   struct container_tag
  126.   { };
  127.  
  128.   /// Basic sequence.
  129.   struct sequence_tag : public container_tag { };
  130.  
  131.   /// Basic string container, inclusive of strings, ropes, etc.
  132.   struct string_tag : public sequence_tag { };
  133.  
  134.   /// Basic associative-container.
  135.   struct associative_tag : public container_tag { };
  136.  
  137.   /// Basic hash structure.
  138.   struct basic_hash_tag : public associative_tag { };
  139.  
  140.   /// Collision-chaining hash.
  141.   struct cc_hash_tag : public basic_hash_tag { };
  142.  
  143.   /// General-probing hash.
  144.   struct gp_hash_tag : public basic_hash_tag { };
  145.  
  146.   /// Basic branch structure.
  147.   struct basic_branch_tag : public associative_tag { };
  148.  
  149.   /// Basic tree structure.
  150.   struct tree_tag : public basic_branch_tag { };
  151.  
  152.   /// Red-black tree.
  153.   struct rb_tree_tag : public tree_tag { };
  154.  
  155.   /// Splay tree.
  156.   struct splay_tree_tag : public tree_tag { };
  157.  
  158.   /// Ordered-vector tree.
  159.   struct ov_tree_tag : public tree_tag { };
  160.  
  161.   /// Basic trie structure.
  162.   struct trie_tag : public basic_branch_tag { };
  163.  
  164.   /// PATRICIA trie.
  165.   struct pat_trie_tag : public trie_tag { };
  166.  
  167.   /// List-update.
  168.   struct list_update_tag : public associative_tag { };
  169.  
  170.   /// Basic priority-queue.
  171.   struct priority_queue_tag : public container_tag { };
  172.  
  173.   /// Pairing-heap.
  174.   struct pairing_heap_tag : public priority_queue_tag { };
  175.  
  176.   /// Binomial-heap.
  177.   struct binomial_heap_tag : public priority_queue_tag { };
  178.  
  179.   /// Redundant-counter binomial-heap.
  180.   struct rc_binomial_heap_tag : public priority_queue_tag { };
  181.  
  182.   /// Binary-heap (array-based).
  183.   struct binary_heap_tag : public priority_queue_tag { };
  184.  
  185.   /// Thin heap.
  186.   struct thin_heap_tag : public priority_queue_tag { };
  187.   //@}
  188.   //@}
  189.  
  190.  
  191.   /**
  192.    *  @defgroup traits Traits
  193.    *  @{
  194.    */
  195.  
  196.   /**
  197.    *  @brief Represents no type, or absence of type, for template tricks.
  198.    *
  199.    *  In a mapped-policy, indicates that an associative container is a set.
  200.    *
  201.    *  In a list-update policy, indicates that each link does not need
  202.    *  metadata.
  203.    *
  204.    *  In a hash policy, indicates that the combining hash function
  205.    *  is actually a ranged hash function.
  206.    *
  207.    *  In a probe policy, indicates that the combining probe function
  208.    *  is actually a ranged probe function.
  209.    */
  210.   struct null_type { };
  211.  
  212.   /// A null node updator, indicating that no node updates are required.
  213.   template<typename _Tp1, typename _Tp2, typename _Tp3, typename _Tp4>
  214.     struct null_node_update : public null_type
  215.     { };
  216.  
  217.  
  218.   /// Primary template, container traits base.
  219.   template<typename _Tag>
  220.     struct container_traits_base;
  221.  
  222.   /// Specialization, cc hash.
  223.   template<>
  224.   struct container_traits_base<cc_hash_tag>
  225.   {
  226.     typedef cc_hash_tag                                 container_category;
  227.     typedef point_invalidation_guarantee                invalidation_guarantee;
  228.  
  229.     enum
  230.       {
  231.         order_preserving = false,
  232.         erase_can_throw = false,
  233.         split_join_can_throw = false,
  234.         reverse_iteration = false
  235.       };
  236.   };
  237.  
  238.   /// Specialization, gp hash.
  239.   template<>
  240.   struct container_traits_base<gp_hash_tag>
  241.   {
  242.     typedef gp_hash_tag                                 container_category;
  243.     typedef basic_invalidation_guarantee                invalidation_guarantee;
  244.  
  245.     enum
  246.       {
  247.         order_preserving = false,
  248.         erase_can_throw = false,
  249.         split_join_can_throw = false,
  250.         reverse_iteration = false
  251.       };
  252.   };
  253.  
  254.   /// Specialization, rb tree.
  255.   template<>
  256.   struct container_traits_base<rb_tree_tag>
  257.   {
  258.     typedef rb_tree_tag                                 container_category;
  259.     typedef range_invalidation_guarantee                invalidation_guarantee;
  260.  
  261.     enum
  262.       {
  263.         order_preserving = true,
  264.         erase_can_throw = false,
  265.         split_join_can_throw = false,
  266.         reverse_iteration = true
  267.       };
  268.   };
  269.  
  270.   /// Specialization, splay tree.
  271.   template<>
  272.   struct container_traits_base<splay_tree_tag>
  273.   {
  274.     typedef splay_tree_tag                              container_category;
  275.     typedef range_invalidation_guarantee                invalidation_guarantee;
  276.  
  277.     enum
  278.       {
  279.         order_preserving = true,
  280.         erase_can_throw = false,
  281.         split_join_can_throw = false,
  282.         reverse_iteration = true
  283.       };
  284.   };
  285.  
  286.   /// Specialization, ov tree.
  287.   template<>
  288.   struct container_traits_base<ov_tree_tag>
  289.   {
  290.     typedef ov_tree_tag                                 container_category;
  291.     typedef basic_invalidation_guarantee                invalidation_guarantee;
  292.  
  293.     enum
  294.       {
  295.         order_preserving = true,
  296.         erase_can_throw = true,
  297.         split_join_can_throw = true,
  298.         reverse_iteration = false
  299.       };
  300.   };
  301.  
  302.   /// Specialization, pat trie.
  303.   template<>
  304.   struct container_traits_base<pat_trie_tag>
  305.   {
  306.     typedef pat_trie_tag                                container_category;
  307.     typedef range_invalidation_guarantee                invalidation_guarantee;
  308.  
  309.     enum
  310.       {
  311.         order_preserving = true,
  312.         erase_can_throw = false,
  313.         split_join_can_throw = true,
  314.         reverse_iteration = true
  315.       };
  316.   };
  317.  
  318.   /// Specialization, list update.
  319.   template<>
  320.   struct container_traits_base<list_update_tag>
  321.   {
  322.     typedef list_update_tag                             container_category;
  323.     typedef point_invalidation_guarantee                invalidation_guarantee;
  324.  
  325.     enum
  326.       {
  327.         order_preserving = false,
  328.         erase_can_throw = false,
  329.         split_join_can_throw = false,
  330.         reverse_iteration = false
  331.       };
  332.   };
  333.  
  334.   /// Specialization, pairing heap.
  335.   template<>
  336.   struct container_traits_base<pairing_heap_tag>
  337.   {
  338.     typedef pairing_heap_tag                            container_category;
  339.     typedef point_invalidation_guarantee                invalidation_guarantee;
  340.  
  341.     enum
  342.       {
  343.         order_preserving = false,
  344.         erase_can_throw = false,
  345.         split_join_can_throw = false,
  346.         reverse_iteration = false
  347.       };
  348.   };
  349.  
  350.   /// Specialization, thin heap.
  351.   template<>
  352.   struct container_traits_base<thin_heap_tag>
  353.   {
  354.     typedef thin_heap_tag                               container_category;
  355.     typedef point_invalidation_guarantee                invalidation_guarantee;
  356.  
  357.     enum
  358.       {
  359.         order_preserving = false,
  360.         erase_can_throw = false,
  361.         split_join_can_throw = false,
  362.         reverse_iteration = false
  363.       };
  364.   };
  365.  
  366.   /// Specialization, binomial heap.
  367.   template<>
  368.   struct container_traits_base<binomial_heap_tag>
  369.   {
  370.     typedef binomial_heap_tag                           container_category;
  371.     typedef point_invalidation_guarantee                invalidation_guarantee;
  372.  
  373.     enum
  374.       {
  375.         order_preserving = false,
  376.         erase_can_throw = false,
  377.         split_join_can_throw = false,
  378.         reverse_iteration = false
  379.       };
  380.   };
  381.  
  382.   /// Specialization, rc binomial heap.
  383.   template<>
  384.   struct container_traits_base<rc_binomial_heap_tag>
  385.   {
  386.     typedef rc_binomial_heap_tag                        container_category;
  387.     typedef point_invalidation_guarantee                invalidation_guarantee;
  388.  
  389.     enum
  390.       {
  391.         order_preserving = false,
  392.         erase_can_throw = false,
  393.         split_join_can_throw = false,
  394.         reverse_iteration = false
  395.       };
  396.   };
  397.  
  398.   /// Specialization, binary heap.
  399.   template<>
  400.   struct container_traits_base<binary_heap_tag>
  401.   {
  402.     typedef binary_heap_tag                             container_category;
  403.     typedef basic_invalidation_guarantee                invalidation_guarantee;
  404.  
  405.     enum
  406.       {
  407.         order_preserving = false,
  408.         erase_can_throw = false,
  409.         split_join_can_throw = true,
  410.         reverse_iteration = false
  411.       };
  412.   };
  413.  
  414.  
  415.   /// Container traits.
  416.   // See Matt Austern for the name, S. Meyers MEFC++ #2, others.
  417.   template<typename Cntnr>
  418.   struct container_traits
  419.   : public container_traits_base<typename Cntnr::container_category>
  420.   {
  421.     typedef Cntnr                                      container_type;
  422.     typedef typename Cntnr::container_category         container_category;
  423.     typedef container_traits_base<container_category>  base_type;
  424.     typedef typename base_type::invalidation_guarantee invalidation_guarantee;
  425.  
  426.     enum
  427.       {
  428.         /// True only if Cntnr objects guarantee storing  keys by order.
  429.         order_preserving = base_type::order_preserving,
  430.  
  431.         /// True only if erasing a key can throw.
  432.         erase_can_throw = base_type::erase_can_throw,
  433.  
  434.         /// True only if split or join operations can throw.
  435.         split_join_can_throw = base_type::split_join_can_throw,
  436.  
  437.         /// True only reverse iterators are supported.
  438.         reverse_iteration = base_type::reverse_iteration
  439.       };
  440.   };
  441.   //@}
  442.  
  443.  
  444.   namespace detail
  445.   {
  446.     /// Dispatch mechanism, primary template for associative types.
  447.     template<typename Key, typename Mapped, typename _Alloc, typename Tag,
  448.              typename Policy_Tl = null_type>
  449.       struct container_base_dispatch;
  450.   } // namespace __detail
  451.   //@}
  452. } // namespace __gnu_pbds
  453.  
  454. #endif
  455.