After an evaluation, GNOME has moved from Bugzilla to GitLab. Learn more about GitLab.
No new issues can be reported in GNOME Bugzilla anymore.
To report an issue in a GNOME project, go to GNOME GitLab.
Do not go to GNOME Gitlab for: Bluefish, Doxygen, GnuCash, GStreamer, java-gnome, LDTP, NetworkManager, Tomboy.
Bug 506415 - Compose with more than 9 parameters
Compose with more than 9 parameters
Status: RESOLVED WONTFIX
Product: glibmm
Classification: Bindings
Component: strings
2.15.x
Other All
: Normal enhancement
: ---
Assigned To: gtkmm-forge
gtkmm-forge
Depends on:
Blocks:
 
 
Reported: 2007-12-30 13:44 UTC by Szilárd Pfeiffer
Modified: 2009-04-03 15:29 UTC
See Also:
GNOME target: ---
GNOME version: Unversioned Enhancement



Description Szilárd Pfeiffer 2007-12-30 13:44:21 UTC
In some infrequent cases you must use the compose template function with more than 9 parameters. The following patch may solve these situations:


Index: glib/glibmm/ustring.h
===================================================================
--- glib/glibmm/ustring.h       (revision 490)
+++ glib/glibmm/ustring.h       (working copy)
@@ -705,6 +705,86 @@
                   const T4& a4, const T5& a5, const T6& a6,
                   const T7& a7, const T8& a8, const T9& a9);
 
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10);
+
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10,
+            class T11>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10, const T11& a11);
+
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10,
+            class T11, class T12>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10, const T11& a11, const T12& a12);
+
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10,
+            class T11, class T12, class T13>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10, const T11& a11, const T12& a12,
+                  const T13& a13);
+
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10,
+            class T11, class T12, class T13, class T14>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10, const T11& a11, const T12& a12,
+                  const T13& a13, const T14& a14);
+
+  /* See the documentation for compose(const ustring& fmt, const T1& a1).
+   * @newin2p16
+   */
+  template <class T1, class T2, class T3, class T4, class T5,
+            class T6, class T7, class T8, class T9, class T10,
+            class T11, class T12, class T13, class T14, class T15>
+  static inline
+  ustring compose(const ustring& fmt,
+                  const T1& a1, const T2& a2, const T3& a3,
+                  const T4& a4, const T5& a5, const T6& a6,
+                  const T7& a7, const T8& a8, const T9& a9,
+                  const T10& a10, const T11& a11, const T12& a12,
+                  const T13& a13, const T14& a14, const T15& a15);
+
   /*! Format the argument to its 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
@@ -1405,6 +1484,185 @@
   return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
 }
 
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10,
+          class T11>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10, const T11& a11)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+  const ustring::Stringify<T11> s11 (a11);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr(), s11.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10,
+          class T11, class T12>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10, const T11& a11, const T12& a12)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+  const ustring::Stringify<T11> s11 (a11);
+  const ustring::Stringify<T12> s12 (a12);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr(), s11.ptr(), s12.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10,
+          class T11, class T12, class T13>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10, const T11& a11, const T12& a12,
+                         const T13& a13)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+  const ustring::Stringify<T11> s11 (a11);
+  const ustring::Stringify<T12> s12 (a12);
+  const ustring::Stringify<T13> s13 (a13);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10,
+          class T11, class T12, class T13, class T14>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10, const T11& a11, const T12& a12,
+                         const T13& a13, const T14& a14)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+  const ustring::Stringify<T11> s11 (a11);
+  const ustring::Stringify<T12> s12 (a12);
+  const ustring::Stringify<T13> s13 (a13);
+  const ustring::Stringify<T14> s14 (a14);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr(), s14.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
+template <class T1, class T2, class T3, class T4, class T5,
+          class T6, class T7, class T8, class T9, class T10,
+          class T11, class T12, class T13, class T14, class T15>
+inline // static
+ustring ustring::compose(const ustring& fmt,
+                         const T1& a1, const T2& a2, const T3& a3,
+                         const T4& a4, const T5& a5, const T6& a6,
+                         const T7& a7, const T8& a8, const T9& a9,
+                         const T10& a10, const T11& a11, const T12& a12,
+                         const T13& a13, const T14& a14, const T15& a15)
+{
+  const ustring::Stringify<T1> s1 (a1);
+  const ustring::Stringify<T2> s2 (a2);
+  const ustring::Stringify<T3> s3 (a3);
+  const ustring::Stringify<T4> s4 (a4);
+  const ustring::Stringify<T5> s5 (a5);
+  const ustring::Stringify<T6> s6 (a6);
+  const ustring::Stringify<T7> s7 (a7);
+  const ustring::Stringify<T8> s8 (a8);
+  const ustring::Stringify<T9> s9 (a9);
+  const ustring::Stringify<T10> s10 (a10);
+  const ustring::Stringify<T11> s11 (a11);
+  const ustring::Stringify<T12> s12 (a12);
+  const ustring::Stringify<T13> s13 (a13);
+  const ustring::Stringify<T14> s14 (a14);
+  const ustring::Stringify<T15> s15 (a15);
+
+  const ustring *const argv[] = { s1.ptr(), s2.ptr(), s3.ptr(), s4.ptr(),
+                                  s5.ptr(), s6.ptr(), s7.ptr(), s8.ptr(), s9.ptr(),
+                                  s10.ptr(), s11.ptr(), s12.ptr(), s13.ptr(), s14.ptr(), s15.ptr() };
+  return ustring::compose_argv(fmt, G_N_ELEMENTS(argv), argv);
+}
+
 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
Comment 1 Murray Cumming 2008-01-20 18:21:00 UTC
Daniel, what do you think?
Comment 2 Murray Cumming 2008-07-25 14:10:26 UTC
Do you have a real-world need for 9 parameters?
Comment 3 Szilárd Pfeiffer 2008-07-28 18:43:12 UTC
(In reply to comment #2)
> Do you have a real-world need for 9 parameters?
> 

Yes, I have. It is a complex log message. I can understand that you don't want to support this kind usage, but I looked it good to create this patch.  
Comment 4 Murray Cumming 2008-07-29 11:01:58 UTC
I'd like to see an example of how you are using it. It doesn't sound like something that would be fun to translate anyway.
Comment 5 Daniel Elstner 2009-04-03 15:29:49 UTC
The patch cannot possibly work: We use qt-format syntax for the format string placeholders, which limits the maximum number of arguments to nine.

Closing.