]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Improve API docs for std::pair
authorJonathan Wakely <jwakely@redhat.com>
Tue, 7 May 2019 22:46:56 +0000 (23:46 +0100)
committerJonathan Wakely <redi@gcc.gnu.org>
Tue, 7 May 2019 22:46:56 +0000 (23:46 +0100)
* include/bits/stl_pair.h: Improve docs.
* include/std/tuple: Likewise.

From-SVN: r270989

libstdc++-v3/ChangeLog
libstdc++-v3/include/bits/stl_pair.h
libstdc++-v3/include/std/tuple

index 5c668bac172cfd2a070899fdd0c14a5281371ea9..acf58e9c22b5f8c725a3d8b103f91dc0cf773d8b 100644 (file)
@@ -1,5 +1,8 @@
 2019-05-07  Jonathan Wakely  <jwakely@redhat.com>
 
+       * include/bits/stl_pair.h: Improve docs.
+       * include/std/tuple: Likewise.
+
        * doc/doxygen/doxygroups.cc (std::literals): Add documentation for
        inline namespace.
        * include/std/chrono: Improve docs.
index 56565fd1ece19664c9eba2e75a25bd3406574ee2..f99b774c21e7f52d12ca7e93be082eae96ed3411 100644 (file)
@@ -72,13 +72,15 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
    */
 
 #if __cplusplus >= 201103L
-  /// piecewise_construct_t
+  /// Tag type for piecewise construction of std::pair objects.
   struct piecewise_construct_t { explicit piecewise_construct_t() = default; };
 
-  /// piecewise_construct
+  /// Tag for piecewise construction of std::pair objects.
   _GLIBCXX17_INLINE constexpr piecewise_construct_t piecewise_construct =
     piecewise_construct_t();
 
+  /// @cond undocumented
+
   // Forward declarations.
   template<typename...>
     class tuple;
@@ -198,21 +200,25 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif // C++11
   };
 
+  /// @endcond
+
  /**
    *  @brief Struct holding two objects of arbitrary type.
    *
    *  @tparam _T1  Type of first object.
    *  @tparam _T2  Type of second object.
+   *
+   *  <https://gcc.gnu.org/onlinedocs/libstdc++/manual/utilities.html>
    */
   template<typename _T1, typename _T2>
     struct pair
     : private __pair_base<_T1, _T2>
     {
-      typedef _T1 first_type;    /// @c first_type is the first bound type
-      typedef _T2 second_type;   /// @c second_type is the second bound type
+      typedef _T1 first_type;    ///< The type of the `first` member
+      typedef _T2 second_type;   ///< The type of the `second` member
 
-      _T1 first;                 /// @c first is a copy of the first object
-      _T2 second;                /// @c second is a copy of the second object
+      _T1 first;                 ///< The first member
+      _T2 second;                ///< The second member
 
       // _GLIBCXX_RESOLVE_LIB_DEFECTS
       // 265.  std::pair::pair() effects overly restrictive
@@ -243,14 +249,17 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       : first(), second() { }
 #endif
 
-      /** Two objects may be passed to a @c pair constructor to be copied.  */
 #if __cplusplus < 201103L
+      /// Two objects may be passed to a @c pair constructor to be copied.
       pair(const _T1& __a, const _T2& __b)
       : first(__a), second(__b) { }
 #else
       // Shortcut for constraining the templates that don't take pairs.
+      /// @cond undocumented
       using _PCCP = _PCC<true, _T1, _T2>;
+      /// @endcond
 
+      /// Construct from two const lvalues, allowing implicit conversions.
       template<typename _U1 = _T1, typename _U2=_T2, typename
               enable_if<_PCCP::template
                           _ConstructiblePair<_U1, _U2>()
@@ -260,6 +269,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       constexpr pair(const _T1& __a, const _T2& __b)
       : first(__a), second(__b) { }
 
+      /// Construct from two const lvalues, disallowing implicit conversions.
        template<typename _U1 = _T1, typename _U2=_T2, typename
                enable_if<_PCCP::template
                            _ConstructiblePair<_U1, _U2>()
@@ -269,18 +279,21 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
       explicit constexpr pair(const _T1& __a, const _T2& __b)
       : first(__a), second(__b) { }
 #endif
+      //@}
 
-      /** There is also a templated copy ctor for the @c pair class itself.  */
 #if __cplusplus < 201103L
+      /// There is also a templated constructor to convert from other pairs.
       template<typename _U1, typename _U2>
        pair(const pair<_U1, _U2>& __p)
        : first(__p.first), second(__p.second) { }
 #else
       // Shortcut for constraining the templates that take pairs.
+      /// @cond undocumented
       template <typename _U1, typename _U2>
         using _PCCFP = _PCC<!is_same<_T1, _U1>::value
                            || !is_same<_T2, _U2>::value,
                            _T1, _T2>;
+      /// @endcond
 
       template<typename _U1, typename _U2, typename
               enable_if<_PCCFP<_U1, _U2>::template
@@ -299,9 +312,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
                          bool>::type=false>
        explicit constexpr pair(const pair<_U1, _U2>& __p)
        : first(__p.first), second(__p.second) { }
+#endif
 
-      constexpr pair(const pair&) = default;
-      constexpr pair(pair&&) = default;
+#if __cplusplus >= 201103L
+      constexpr pair(const pair&) = default;   ///< Copy constructor
+      constexpr pair(pair&&) = default;                ///< Move constructor
 
       // DR 811.
       template<typename _U1, typename
@@ -420,6 +435,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
          return *this;
        }
 
+      /// Swap the first members and then the second members.
       void
       swap(pair& __p)
       noexcept(__and_<__is_nothrow_swappable<_T1>,
@@ -438,6 +454,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
     };
 
+  /// @relates pair @{
+
 #if __cpp_deduction_guides >= 201606
   template<typename _T1, typename _T2> pair(_T1, _T2) -> pair<_T1, _T2>;
 #endif
@@ -448,7 +466,13 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     operator==(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
     { return __x.first == __y.first && __x.second == __y.second; }
 
-  /// <http://gcc.gnu.org/onlinedocs/libstdc++/manual/utilities.html>
+  /** Defines a lexicographical order for pairs.
+   *
+   * For two pairs of the same type, `P` is ordered before `Q` if
+   * `P.first` is less than `Q.first`, or if `P.first` and `Q.first`
+   * are equivalent (neither is less than the other) and `P.second` is less
+   * than `Q.second`.
+  */
   template<typename _T1, typename _T2>
     inline _GLIBCXX_CONSTEXPR bool
     operator<(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y)
@@ -480,9 +504,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     { return !(__x < __y); }
 
 #if __cplusplus >= 201103L
-  /// See std::pair::swap().
-  // Note:  no std::swap overloads in C++03 mode, this has performance
-  //        implications, see, eg, libstdc++/38466.
+  /** Swap overload for pairs. Calls std::pair::swap().
+   *
+   * @note This std::swap overload is not declared in C++03 mode,
+   * which has performance implications, e.g. see https://gcc.gnu.org/PR38466
+  */
   template<typename _T1, typename _T2>
     inline
 #if __cplusplus > 201402L || !defined(__STRICT_ANSI__) // c++1z or gnu++11
@@ -504,15 +530,20 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #endif
 #endif // __cplusplus >= 201103L
 
+  // @} relates pair
+
   /**
    *  @brief A convenience wrapper for creating a pair from two objects.
    *  @param  __x  The first object.
    *  @param  __y  The second object.
    *  @return   A newly-constructed pair<> object of the appropriate type.
    *
-   *  The standard requires that the objects be passed by reference-to-const,
-   *  but LWG issue #181 says they should be passed by const value.  We follow
-   *  the LWG by default.
+   *  The C++98 standard says the objects are passed by reference-to-const,
+   *  but C++03 says they are passed by value (this was LWG issue #181).
+   *
+   *  Since C++11 they have been passed by forwarding reference and then
+   *  forwarded to the new members of the pair. To create a pair with a
+   *  member of reference type, pass a `reference_wrapper` to this function.
    */
   // _GLIBCXX_RESOLVE_LIB_DEFECTS
   // 181.  make_pair() unintended behavior
index fba28f963cd7180b65b06ea138d0b91ab98fb250..956e031ae9d264b26c97f5564fb92de3f4969e8b 100644 (file)
@@ -1691,6 +1691,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
     struct uses_allocator<tuple<_Types...>, _Alloc> : true_type { };
 
   // See stl_pair.h...
+  /** "piecewise construction" using a tuple of arguments for each member.
+   *
+   * @param __first Arguments for the first member of the pair.
+   * @param __second Arguments for the second member of the pair.
+   *
+   * The elements of each tuple will be used as the constructor arguments
+   * for the data members of the pair.
+  */
   template<class _T1, class _T2>
     template<typename... _Args1, typename... _Args2>
       inline