99 |
99 |
100 private: |
100 private: |
101 QString m_text; |
101 QString m_text; |
102 }; |
102 }; |
103 |
103 |
104 |
|
105 // Helper function for format() |
|
106 template<typename Arg1, typename... Rest> |
|
107 void formatHelper (QString& str, Arg1 arg1, Rest... rest) |
|
108 { |
|
109 str = str.arg (StringFormatArg (arg1).text()); |
|
110 formatHelper (str, rest...); |
|
111 } |
|
112 |
|
113 |
|
114 static void formatHelper (QString& str) __attribute__ ((unused)); |
|
115 static void formatHelper (QString& str) |
|
116 { |
|
117 (void) str; |
|
118 } |
|
119 |
|
120 |
|
121 // Format the message with the given args. |
104 // Format the message with the given args. |
122 // |
105 // |
123 // The formatting ultimately uses String's arg() method to actually format the args so the format string should be |
106 // The formatting ultimately uses String's arg() method to actually format the args so the format string should be |
124 // prepared accordingly, with %1 referring to the first arg, %2 to the second, etc. |
107 // prepared accordingly, with %1 referring to the first arg, %2 to the second, etc. |
125 template<typename... Args> |
108 template<typename T, typename... Rest> |
126 QString format (QString fmtstr, Args... args) |
109 QString format(const QString& formatString, const T& arg, Rest... rest) |
127 { |
110 { |
128 formatHelper (fmtstr, args...); |
111 return format(formatString.arg(StringFormatArg(arg).text()), rest...); |
129 return fmtstr; |
112 } |
|
113 |
|
114 // Recursion base |
|
115 inline QString format(const QString& formatString) |
|
116 { |
|
117 return formatString; |
130 } |
118 } |
131 |
119 |
132 template<typename... Args> |
120 template<typename... Args> |
133 void fprint (FILE* fp, QString fmtstr, Args... args) |
121 void fprint(FILE* fp, const QString& formatString, Args... args) |
134 { |
122 { |
135 formatHelper (fmtstr, args...); |
123 fprintf(fp, "%s", qPrintable(format(formatString, args...))); |
136 fprintf (fp, "%s", qPrintable (fmtstr)); |
|
137 } |
124 } |
138 |
125 |
139 |
126 |
140 template<typename... Args> |
127 template<typename... Args> |
141 void fprint (QIODevice& dev, QString fmtstr, Args... args) |
128 void fprint (QIODevice& dev, const QString& formatString, Args... args) |
142 { |
129 { |
143 formatHelper (fmtstr, args...); |
130 dev.write(format(formatString, args...).toUtf8()); |
144 dev.write (fmtstr.toUtf8()); |
|
145 } |
131 } |
146 |
132 |
147 class Printer : public QObject |
133 class Printer : public QObject |
148 { |
134 { |
149 Q_OBJECT |
135 Q_OBJECT |