@@ -100,23 +100,10 @@ void FixedBuffer<SIZE>::cookieEnd()
100
100
{
101
101
}
102
102
103
- void LogStream::staticCheck ()
104
- {
105
- static_assert (kMaxNumericSize - 10 > std::numeric_limits<double >::digits10,
106
- " " );
107
- static_assert (kMaxNumericSize - 10 >
108
- std::numeric_limits<long double >::digits10,
109
- " " );
110
- static_assert (kMaxNumericSize - 10 > std::numeric_limits<long >::digits10,
111
- " " );
112
- static_assert (kMaxNumericSize - 10 >
113
- std::numeric_limits<long long >::digits10,
114
- " " );
115
- }
116
-
117
103
template <typename T>
118
104
void LogStream::formatInteger (T v)
119
105
{
106
+ constexpr static int kMaxNumericSize = std::numeric_limits<T>::digits10 + 4 ;
120
107
if (_exBuffer.empty ())
121
108
{
122
109
if (_buffer.avail () >= kMaxNumericSize )
@@ -172,13 +159,13 @@ LogStream &LogStream::operator<<(unsigned long v)
172
159
return *this ;
173
160
}
174
161
175
- LogStream &LogStream::operator <<(long long v)
162
+ LogStream &LogStream::operator <<(const long long & v)
176
163
{
177
164
formatInteger (v);
178
165
return *this ;
179
166
}
180
167
181
- LogStream &LogStream::operator <<(unsigned long long v)
168
+ LogStream &LogStream::operator <<(const unsigned long long & v)
182
169
{
183
170
formatInteger (v);
184
171
return *this ;
@@ -187,6 +174,8 @@ LogStream &LogStream::operator<<(unsigned long long v)
187
174
LogStream &LogStream::operator <<(const void *p)
188
175
{
189
176
uintptr_t v = reinterpret_cast <uintptr_t >(p);
177
+ constexpr static int kMaxNumericSize =
178
+ std::numeric_limits<uintptr_t >::digits / 4 + 4 ;
190
179
if (_exBuffer.empty ())
191
180
{
192
181
if (_buffer.avail () >= kMaxNumericSize )
@@ -214,8 +203,9 @@ LogStream &LogStream::operator<<(const void *p)
214
203
}
215
204
216
205
// TODO: replace this with Grisu3 by Florian Loitsch.
217
- LogStream &LogStream::operator <<(double v)
206
+ LogStream &LogStream::operator <<(const double & v)
218
207
{
208
+ constexpr static int kMaxNumericSize = 32 ;
219
209
if (_exBuffer.empty ())
220
210
{
221
211
if (_buffer.avail () >= kMaxNumericSize )
@@ -236,6 +226,29 @@ LogStream &LogStream::operator<<(double v)
236
226
return *this ;
237
227
}
238
228
229
+ LogStream &LogStream::operator <<(const long double &v)
230
+ {
231
+ constexpr static int kMaxNumericSize = 48 ;
232
+ if (_exBuffer.empty ())
233
+ {
234
+ if (_buffer.avail () >= kMaxNumericSize )
235
+ {
236
+ int len = snprintf (_buffer.current (), kMaxNumericSize , " %.12Lg" , v);
237
+ _buffer.add (len);
238
+ return *this ;
239
+ }
240
+ else
241
+ {
242
+ _exBuffer.append (_buffer.data (), _buffer.length ());
243
+ }
244
+ }
245
+ auto oldLen = _exBuffer.length ();
246
+ _exBuffer.resize (oldLen + kMaxNumericSize );
247
+ int len = snprintf (&(_exBuffer[oldLen]), kMaxNumericSize , " %.12Lg" , v);
248
+ _exBuffer.resize (oldLen + len);
249
+ return *this ;
250
+ }
251
+
239
252
template <typename T>
240
253
Fmt::Fmt (const char *fmt, T val)
241
254
{
0 commit comments