[glibmm] ustring: Replace 8×format() with 1 variadic template



commit 90ecb9d69b3b95fc5b357914ae98121961b7591e
Author: Daniel Boles <dboles src gnome org>
Date:   Sun Sep 3 20:34:10 2017 +0100

    ustring: Replace 8×format() with 1 variadic template
    
    as per the previous commit for Glib::ustring.
    
    Now, users can pass format() as many arguments as their compiler or
    stack will allow, rather than being limited to a maximum of 8.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=784211

 glib/glibmm/ustring.h |  182 ++++++++-----------------------------------------
 1 files changed, 29 insertions(+), 153 deletions(-)
---
diff --git a/glib/glibmm/ustring.h b/glib/glibmm/ustring.h
index 7aaf087..0b2a279 100644
--- a/glib/glibmm/ustring.h
+++ b/glib/glibmm/ustring.h
@@ -675,91 +675,45 @@ public:
   template <class... Ts>
   static inline ustring compose(const ustring& fmt, const Ts&... args);
 
-  /*! Format the argument to its string representation.
+  /*! Format the argument(s) to a string representation.
+   *
    * Applies the arguments in order to an std::wostringstream and returns the
    * resulting string.  I/O manipulators may also be used as arguments.  This
    * greatly simplifies the common task of converting a number to a string, as
    * demonstrated by the example below.  The format() methods can also be used
    * in conjunction with compose() to facilitate localization of user-visible
    * messages.
+   *
    * @code
    * using Glib::ustring;
    * double value = 22.0 / 7.0;
    * ustring text = ustring::format(std::fixed, std::setprecision(2), value);
    * @endcode
+   *
    * @note The use of a wide character stream in the implementation of format()
    * is almost completely transparent.  However, one of the instances where the
    * use of wide streams becomes visible is when the std::setfill() stream
    * manipulator is used.  In order for std::setfill() to work the argument
    * must be of type <tt>wchar_t</tt>.  This can be achieved by using the
    * <tt>L</tt> prefix with a character literal, as shown in the example.
+   *
    * @code
    * using Glib::ustring;
    * // Insert leading zeroes to fill in at least six digits
    * ustring text = ustring::format(std::setfill(L'0'), std::setw(6), 123);
    * @endcode
    *
-   * @param a1 A streamable value or an I/O manipulator.
-   * @return The string representation of the argument stream.
-   * @throw Glib::ConvertError
+   * @param args One or more streamable values or I/O manipulators.
    *
-   * @newin{2,16}
-   */
-  template <class T1>
-  static inline ustring format(const T1& a1);
-
-  /* See the documentation for format(const T1& a1).
-   *
-   * @newin{2,16}
-   */
-  template <class T1, class T2>
-  static inline ustring format(const T1& a1, const T2& a2);
-
-  /* See the documentation for format(const T1& a1).
-   *
-   * @newin{2,16}
-   */
-  template <class T1, class T2, class T3>
-  static inline ustring format(const T1& a1, const T2& a2, const T3& a3);
-
-  /* See the documentation for format(const T1& a1).
-   *
-   * @newin{2,16}
-   */
-  template <class T1, class T2, class T3, class T4>
-  static inline ustring format(const T1& a1, const T2& a2, const T3& a3, const T4& a4);
-
-  /* See the documentation for format(const T1& a1).
-   *
-   * @newin{2,16}
-   */
-  template <class T1, class T2, class T3, class T4, class T5>
-  static inline ustring format(
-    const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5);
-
-  /* See the documentation for format(const T1& a1).
+   * @return The string representation of the argument stream.
    *
-   * @newin{2,16}
-   */
-  template <class T1, class T2, class T3, class T4, class T5, class T6>
-  static inline ustring format(
-    const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6);
-
-  /* See the documentation for format(const T1& a1).
+   * @throw Glib::ConvertError
    *
-   * @newin{2,16}
+   * @newin{2,56}
    */
-  template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
-  static inline ustring format(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5,
-    const T6& a6, const T7& a7);
+  template <class... Ts>
+  static inline ustring format(const Ts&... args);
 
-  /* See the documentation for format(const T1& a1).
-   *
-   * @newin{2,16}
-   */
-  template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
-  static inline ustring format(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5,
-    const T6& a6, const T7& a7, const T8& a8);
   //! @}
 
 private:
@@ -782,9 +736,15 @@ private:
   template <class T>
   class Stringify;
 
+  static ustring compose_private(const ustring& fmt, std::initializer_list<const ustring*> ilist);
+
   class FormatStream;
 
-  static ustring compose_private(const ustring& fmt, std::initializer_list<const ustring*> ilist);
+  template<class T>
+  static inline void format_private(FormatStream& buf, const T& arg);
+
+  template<class T1, class... Ts>
+  static inline void format_private(FormatStream& buf, const T1& a1, const Ts&... args);
 
 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
 
@@ -1099,114 +1059,30 @@ ustring::raw() const
   return string_;
 }
 
-template <class T1>
-inline // static
-  ustring
-  ustring::format(const T1& a1)
-{
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  return buf.to_string();
-}
-
-template <class T1, class T2>
-inline // static
-  ustring
-  ustring::format(const T1& a1, const T2& a2)
-{
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  return buf.to_string();
-}
-
-template <class T1, class T2, class T3>
-inline // static
-  ustring
-  ustring::format(const T1& a1, const T2& a2, const T3& a3)
-{
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  return buf.to_string();
-}
-
-template <class T1, class T2, class T3, class T4>
-inline // static
-  ustring
-  ustring::format(const T1& a1, const T2& a2, const T3& a3, const T4& a4)
-{
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  buf.stream(a4);
-  return buf.to_string();
-}
-
-template <class T1, class T2, class T3, class T4, class T5>
-inline // static
-  ustring
-  ustring::format(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5)
-{
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  buf.stream(a4);
-  buf.stream(a5);
-  return buf.to_string();
-}
-
-template <class T1, class T2, class T3, class T4, class T5, class T6>
+template <class T>
 inline // static
-  ustring
-  ustring::format(
-    const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5, const T6& a6)
+  void
+  ustring::format_private(FormatStream& buf, const T& arg)
 {
-  ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  buf.stream(a4);
-  buf.stream(a5);
-  buf.stream(a6);
-  return buf.to_string();
+  buf.stream(arg);
 }
 
-template <class T1, class T2, class T3, class T4, class T5, class T6, class T7>
+template <class T1, class... Ts>
 inline // static
-  ustring
-  ustring::format(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5,
-    const T6& a6, const T7& a7)
+  void
+  ustring::format_private(FormatStream& buf, const T1& a1, const Ts&... args)
 {
-  ustring::FormatStream buf;
   buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  buf.stream(a4);
-  buf.stream(a5);
-  buf.stream(a6);
-  buf.stream(a7);
-  return buf.to_string();
+  return format_private(buf, args...);
 }
 
-template <class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8>
+template <class... Ts>
 inline // static
   ustring
-  ustring::format(const T1& a1, const T2& a2, const T3& a3, const T4& a4, const T5& a5,
-    const T6& a6, const T7& a7, const T8& a8)
+  ustring::format(const Ts&... args)
 {
   ustring::FormatStream buf;
-  buf.stream(a1);
-  buf.stream(a2);
-  buf.stream(a3);
-  buf.stream(a4);
-  buf.stream(a5);
-  buf.stream(a6);
-  buf.stream(a7);
-  buf.stream(a8);
+  format_private(buf, args...);
   return buf.to_string();
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]