Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. // Pair implementation -*- C++ -*-
  2.  
  3. // Copyright (C) 2001-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
  7. // terms of the GNU General Public License as published by the
  8. // Free Software Foundation; either version 3, or (at your option)
  9. // any later version.
  10.  
  11. // This library is distributed in the hope that it will be useful,
  12. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. // GNU 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. /*
  26.  *
  27.  * Copyright (c) 1994
  28.  * Hewlett-Packard Company
  29.  *
  30.  * Permission to use, copy, modify, distribute and sell this software
  31.  * and its documentation for any purpose is hereby granted without fee,
  32.  * provided that the above copyright notice appear in all copies and
  33.  * that both that copyright notice and this permission notice appear
  34.  * in supporting documentation.  Hewlett-Packard Company makes no
  35.  * representations about the suitability of this software for any
  36.  * purpose.  It is provided "as is" without express or implied warranty.
  37.  *
  38.  *
  39.  * Copyright (c) 1996,1997
  40.  * Silicon Graphics Computer Systems, Inc.
  41.  *
  42.  * Permission to use, copy, modify, distribute and sell this software
  43.  * and its documentation for any purpose is hereby granted without fee,
  44.  * provided that the above copyright notice appear in all copies and
  45.  * that both that copyright notice and this permission notice appear
  46.  * in supporting documentation.  Silicon Graphics makes no
  47.  * representations about the suitability of this software for any
  48.  * purpose.  It is provided "as is" without express or implied warranty.
  49.  */
  50.  
  51. /** @file bits/stl_pair.h
  52.  *  This is an internal header file, included by other library headers.
  53.  *  Do not attempt to use it directly. @headername{utility}
  54.  */
  55.  
  56. #ifndef _STL_PAIR_H
  57. #define _STL_PAIR_H 1
  58.  
  59. #include <bits/move.h> // for std::move / std::forward, and std::swap
  60.  
  61. #if __cplusplus >= 201103L
  62. #include <type_traits> // for std::__decay_and_strip too
  63. #endif
  64.  
  65. namespace std _GLIBCXX_VISIBILITY(default)
  66. {
  67. _GLIBCXX_BEGIN_NAMESPACE_VERSION
  68.  
  69.   /**
  70.    *  @addtogroup utilities
  71.    *  @{
  72.    */
  73.  
  74. #if __cplusplus >= 201103L
  75.   /// piecewise_construct_t
  76.   struct piecewise_construct_t { };
  77.  
  78.   /// piecewise_construct
  79.   constexpr piecewise_construct_t piecewise_construct = piecewise_construct_t();
  80.  
  81.   // Forward declarations.
  82.   template<typename...>
  83.     class tuple;
  84.  
  85.   template<std::size_t...>
  86.     struct _Index_tuple;
  87. #endif
  88.  
  89.  /**
  90.    *  @brief Struct holding two objects of arbitrary type.
  91.    *
  92.    *  @tparam _T1  Type of first object.
  93.    *  @tparam _T2  Type of second object.
  94.    */
  95.   template<class _T1, class _T2>
  96.     struct pair
  97.     {
  98.       typedef _T1 first_type;    /// @c first_type is the first bound type
  99.       typedef _T2 second_type;   /// @c second_type is the second bound type
  100.  
  101.       _T1 first;                 /// @c first is a copy of the first object
  102.       _T2 second;                /// @c second is a copy of the second object
  103.  
  104.       // _GLIBCXX_RESOLVE_LIB_DEFECTS
  105.       // 265.  std::pair::pair() effects overly restrictive
  106.       /** The default constructor creates @c first and @c second using their
  107.        *  respective default constructors.  */
  108.       _GLIBCXX_CONSTEXPR pair()
  109.       : first(), second() { }
  110.  
  111.       /** Two objects may be passed to a @c pair constructor to be copied.  */
  112.       _GLIBCXX_CONSTEXPR pair(const _T1& __a, const _T2& __b)
  113.       : first(__a), second(__b) { }
  114.  
  115.       /** There is also a templated copy ctor for the @c pair class itself.  */
  116. #if __cplusplus < 201103L
  117.       template<class _U1, class _U2>
  118.         pair(const pair<_U1, _U2>& __p)
  119.         : first(__p.first), second(__p.second) { }
  120. #else
  121.       template<class _U1, class _U2, class = typename
  122.                enable_if<__and_<is_convertible<const _U1&, _T1>,
  123.                                 is_convertible<const _U2&, _T2>>::value>::type>
  124.         constexpr pair(const pair<_U1, _U2>& __p)
  125.         : first(__p.first), second(__p.second) { }
  126.  
  127.       constexpr pair(const pair&) = default;
  128.       constexpr pair(pair&&) = default;
  129.  
  130.       // DR 811.
  131.       template<class _U1, class = typename
  132.                enable_if<is_convertible<_U1, _T1>::value>::type>
  133.         constexpr pair(_U1&& __x, const _T2& __y)
  134.         : first(std::forward<_U1>(__x)), second(__y) { }
  135.  
  136.       template<class _U2, class = typename
  137.                enable_if<is_convertible<_U2, _T2>::value>::type>
  138.         constexpr pair(const _T1& __x, _U2&& __y)
  139.         : first(__x), second(std::forward<_U2>(__y)) { }
  140.  
  141.       template<class _U1, class _U2, class = typename
  142.                enable_if<__and_<is_convertible<_U1, _T1>,
  143.                                 is_convertible<_U2, _T2>>::value>::type>
  144.         constexpr pair(_U1&& __x, _U2&& __y)
  145.         : first(std::forward<_U1>(__x)), second(std::forward<_U2>(__y)) { }
  146.  
  147.       template<class _U1, class _U2, class = typename
  148.                enable_if<__and_<is_convertible<_U1, _T1>,
  149.                                 is_convertible<_U2, _T2>>::value>::type>
  150.         constexpr pair(pair<_U1, _U2>&& __p)
  151.         : first(std::forward<_U1>(__p.first)),
  152.           second(std::forward<_U2>(__p.second)) { }
  153.  
  154.       template<typename... _Args1, typename... _Args2>
  155.         pair(piecewise_construct_t, tuple<_Args1...>, tuple<_Args2...>);
  156.  
  157.       pair&
  158.       operator=(const pair& __p)
  159.       {
  160.         first = __p.first;
  161.         second = __p.second;
  162.         return *this;
  163.       }
  164.  
  165.       pair&
  166.       operator=(pair&& __p)
  167.       noexcept(__and_<is_nothrow_move_assignable<_T1>,
  168.                       is_nothrow_move_assignable<_T2>>::value)
  169.       {
  170.         first = std::forward<first_type>(__p.first);
  171.         second = std::forward<second_type>(__p.second);
  172.         return *this;
  173.       }
  174.  
  175.       template<class _U1, class _U2>
  176.         pair&
  177.         operator=(const pair<_U1, _U2>& __p)
  178.         {
  179.           first = __p.first;
  180.           second = __p.second;
  181.           return *this;
  182.         }
  183.  
  184.       template<class _U1, class _U2>
  185.         pair&
  186.         operator=(pair<_U1, _U2>&& __p)
  187.         {
  188.           first = std::forward<_U1>(__p.first);
  189.           second = std::forward<_U2>(__p.second);
  190.           return *this;
  191.         }
  192.  
  193.       void
  194.       swap(pair& __p)
  195.       noexcept(noexcept(swap(first, __p.first))
  196.                && noexcept(swap(second, __p.second)))
  197.       {
  198.         using std::swap;
  199.         swap(first, __p.first);
  200.         swap(second, __p.second);
  201.       }
  202.  
  203.     private:
  204.       template<typename... _Args1, std::size_t... _Indexes1,
  205.                typename... _Args2, std::size_t... _Indexes2>
  206.         pair(tuple<_Args1...>&, tuple<_Args2...>&,
  207.              _Index_tuple<_Indexes1...>, _Index_tuple<_Indexes2...>);
  208. #endif
  209.     };
  210.  
  211.   /// Two pairs of the same type are equal iff their members are equal.
  212.   template<class _T1, class _T2>
  213.     inline _GLIBCXX_CONSTEXPR bool
  214.     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  215.     { return __x.first == __y.first && __x.second == __y.second; }
  216.  
  217.   /// <http://gcc.gnu.org/onlinedocs/libstdc++/manual/utilities.html>
  218.   template<class _T1, class _T2>
  219.     inline _GLIBCXX_CONSTEXPR bool
  220.     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  221.     { return __x.first < __y.first
  222.              || (!(__y.first < __x.first) && __x.second < __y.second); }
  223.  
  224.   /// Uses @c operator== to find the result.
  225.   template<class _T1, class _T2>
  226.     inline _GLIBCXX_CONSTEXPR bool
  227.     operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  228.     { return !(__x == __y); }
  229.  
  230.   /// Uses @c operator< to find the result.
  231.   template<class _T1, class _T2>
  232.     inline _GLIBCXX_CONSTEXPR bool
  233.     operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  234.     { return __y < __x; }
  235.  
  236.   /// Uses @c operator< to find the result.
  237.   template<class _T1, class _T2>
  238.     inline _GLIBCXX_CONSTEXPR bool
  239.     operator<=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  240.     { return !(__y < __x); }
  241.  
  242.   /// Uses @c operator< to find the result.
  243.   template<class _T1, class _T2>
  244.     inline _GLIBCXX_CONSTEXPR bool
  245.     operator>=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
  246.     { return !(__x < __y); }
  247.  
  248. #if __cplusplus >= 201103L
  249.   /// See std::pair::swap().
  250.   // Note:  no std::swap overloads in C++03 mode, this has performance
  251.   //        implications, see, eg, libstdc++/38466.
  252.   template<class _T1, class _T2>
  253.     inline void
  254.     swap(pair<_T1, _T2>& __x, pair<_T1, _T2>& __y)
  255.     noexcept(noexcept(__x.swap(__y)))
  256.     { __x.swap(__y); }
  257. #endif
  258.  
  259.   /**
  260.    *  @brief A convenience wrapper for creating a pair from two objects.
  261.    *  @param  __x  The first object.
  262.    *  @param  __y  The second object.
  263.    *  @return   A newly-constructed pair<> object of the appropriate type.
  264.    *
  265.    *  The standard requires that the objects be passed by reference-to-const,
  266.    *  but LWG issue #181 says they should be passed by const value.  We follow
  267.    *  the LWG by default.
  268.    */
  269.   // _GLIBCXX_RESOLVE_LIB_DEFECTS
  270.   // 181.  make_pair() unintended behavior
  271. #if __cplusplus >= 201103L
  272.   // NB: DR 706.
  273.   template<class _T1, class _T2>
  274.     constexpr pair<typename __decay_and_strip<_T1>::__type,
  275.                    typename __decay_and_strip<_T2>::__type>
  276.     make_pair(_T1&& __x, _T2&& __y)
  277.     {
  278.       typedef typename __decay_and_strip<_T1>::__type __ds_type1;
  279.       typedef typename __decay_and_strip<_T2>::__type __ds_type2;
  280.       typedef pair<__ds_type1, __ds_type2>            __pair_type;
  281.       return __pair_type(std::forward<_T1>(__x), std::forward<_T2>(__y));
  282.     }
  283. #else
  284.   template<class _T1, class _T2>
  285.     inline pair<_T1, _T2>
  286.     make_pair(_T1 __x, _T2 __y)
  287.     { return pair<_T1, _T2>(__x, __y); }
  288. #endif
  289.  
  290.   /// @}
  291.  
  292. _GLIBCXX_END_NAMESPACE_VERSION
  293. } // namespace std
  294.  
  295. #endif /* _STL_PAIR_H */
  296.