1616 */
1717
1818#include < log4cxx/helpers/asyncbuffer.h>
19+ #include < log4cxx/helpers/transcoder.h>
1920
2021namespace LOG4CXX_NS
2122{
@@ -26,8 +27,59 @@ namespace helpers
2627struct AsyncBuffer ::Private
2728{
2829 std::vector<MessageBufferAppender> data;
30+
31+ Private (const MessageBufferAppender& f)
32+ : data{ f }
33+ {}
34+
35+ #if LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
36+ StringViewType fmt_string;
37+ FmtArgStore fmt_args;
38+
39+ Private (StringViewType&& format_string, FmtArgStore&& args)
40+ : fmt_string{ std::move (format_string) }
41+ , fmt_args{ std::move (args) }
42+ {}
43+
44+ #if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
45+ WideStringViewType fmt_wstring;
46+ WideFmtArgStore fmt_wargs;
47+
48+ Private (WideStringViewType&& format_string, WideFmtArgStore&& args)
49+ : fmt_wstring{ std::move (format_string) }
50+ , fmt_wargs{ std::move (args) }
51+ {}
52+ #endif // LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
53+ #endif // LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
54+
2955};
3056
57+ #if LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
58+ void AsyncBuffer::initializeForFmt (StringViewType&& format_string, FmtArgStore&& args)
59+ {
60+ if (!m_priv)
61+ m_priv = std::make_unique<Private>(std::move (format_string), std::move (args));
62+ else
63+ {
64+ m_priv->fmt_string = std::move (format_string);
65+ m_priv->fmt_args = std::move (args);
66+ }
67+ }
68+
69+ #if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
70+ void AsyncBuffer::initializeForFmt (WideStringViewType&& format_string, WideFmtArgStore&& args)
71+ {
72+ if (!m_priv)
73+ m_priv = std::make_unique<Private>(std::move (format_string), std::move (args));
74+ else
75+ {
76+ m_priv->fmt_wstring = std::move (format_string);
77+ m_priv->fmt_wargs = std::move (args);
78+ }
79+ }
80+ #endif // LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
81+ #endif // LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
82+
3183/* * An empty buffer.
3284*/
3385AsyncBuffer::AsyncBuffer ()
@@ -49,16 +101,57 @@ AsyncBuffer::~AsyncBuffer()
49101/* *
50102* Has no item been added to this?
51103*/
52- bool AsyncBuffer::empty () const { return !m_priv || m_priv->data .empty (); }
104+ bool AsyncBuffer::empty () const
105+ {
106+ bool result{ true };
107+ if (m_priv)
108+ {
109+ result = m_priv->data .empty ();
110+ #if LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
111+ if (result)
112+ result = (0 == m_priv->fmt_string .size ());
113+ #if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
114+ if (result)
115+ result = (0 == m_priv->fmt_wstring .size ());
116+ #endif // LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
117+ #endif
118+ }
119+ return result;
120+ }
53121
54122/* *
55123* Add text version of buffered values to \c msg
56124*/
57- void AsyncBuffer::renderMessage (LogCharMessageBuffer& msg)
125+ void AsyncBuffer::renderMessage (LogCharMessageBuffer& msg) const
58126{
59127 if (m_priv)
128+ {
60129 for (auto & renderer : m_priv->data )
61130 renderer (msg);
131+ #if LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
132+ #if LOG4CXX_LOGCHAR_IS_UTF8
133+ if (0 < m_priv->fmt_string .size ())
134+ msg << fmt::vformat (m_priv->fmt_string , m_priv->fmt_args );
135+ #if LOG4CXX_WCHAR_T_API
136+ if (0 < m_priv->fmt_wstring .size ())
137+ {
138+ LOG4CXX_DECODE_WCHAR (lsMsg, fmt::vformat (m_priv->fmt_wstring , m_priv->fmt_wargs ));
139+ msg << lsMsg;
140+ }
141+ #endif // LOG4CXX_WCHAR_T_API
142+ #endif // LOG4CXX_LOGCHAR_IS_UTF8
143+
144+ #if LOG4CXX_LOGCHAR_IS_WCHAR
145+ if (0 < m_priv->fmt_wstring .size ())
146+ msg << fmt::vformat (m_priv->fmt_wstring , m_priv->fmt_wargs );
147+ if (0 < m_priv->fmt_string .size ())
148+ {
149+ LOG4CXX_DECODE_CHAR (lsMsg, fmt::vformat (m_priv->fmt_string , m_priv->fmt_args ));
150+ msg << lsMsg;
151+ }
152+ #endif // LOG4CXX_LOGCHAR_IS_WCHAR
153+ #endif // LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
154+ }
62155}
63156
64157/* *
@@ -67,7 +160,15 @@ void AsyncBuffer::renderMessage(LogCharMessageBuffer& msg)
67160void AsyncBuffer::clear ()
68161{
69162 if (m_priv)
163+ {
70164 m_priv->data .clear ();
165+ #if LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
166+ m_priv->fmt_string = {};
167+ #if LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
168+ m_priv->fmt_wstring = {};
169+ #endif // LOG4CXX_WCHAR_T_API || LOG4CXX_LOGCHAR_IS_WCHAR
170+ #endif // LOG4CXX_ASYNC_BUFFER_SUPPORTS_FMT
171+ }
71172}
72173
73174/* *
@@ -76,8 +177,9 @@ void AsyncBuffer::clear()
76177void AsyncBuffer::append (const MessageBufferAppender& f)
77178{
78179 if (!m_priv)
79- m_priv = std::make_unique<Private>();
80- m_priv->data .push_back (f);
180+ m_priv = std::make_unique<Private>(f);
181+ else
182+ m_priv->data .push_back (f);
81183}
82184
83185} // namespace helpers
0 commit comments