qxLib
macro_user_message.h
Go to the documentation of this file.
1 /**
2 
3  @file macro_user_message.h
4  @author Khrapov
5  @date 4.01.2026
6  @copyright © Nick Khrapov, 2026. All right reserved.
7 
8 **/
9 #pragma once
10 
13 
14 namespace qx
15 {
16 
17 template<class... args_t>
18 concept log_acceptable_args_c = (sizeof...(args_t) > 0 && format_acceptable_args_c<char_type, args_t...>);
19 
20 namespace details
21 {
22 
23 template<size_t nStringsPoolSize>
24 inline string_pool<nStringsPoolSize>::item format_macro_user_message(string_pool<nStringsPoolSize>* pStringsPool)
25 {
26  return { QXT(""), string_pool<nStringsPoolSize>::nFreeString };
27 }
28 
29 template<size_t nStringsPoolSize>
30 inline string_pool<nStringsPoolSize>::item format_macro_user_message(
31  string_pool<nStringsPoolSize>* pStringsPool,
32  const char* pszUserMessage)
33 {
34  typename string_pool<nStringsPoolSize>::item message =
35  pStringsPool
36  ? pStringsPool->acquire()
37  : typename string_pool<nStringsPoolSize>::item { string(), string_pool<nStringsPoolSize>::nFreeString };
38 
39  to_string(message.sValue, pszUserMessage);
40  return message;
41 }
42 
43 template<size_t nStringsPoolSize>
44 inline string_pool<nStringsPoolSize>::item format_macro_user_message(
45  string_pool<nStringsPoolSize>* pStringsPool,
46  string sUserMessage)
47 {
48  return { std::move(sUserMessage), string_pool<nStringsPoolSize>::nFreeString };
49 }
50 
51 #if QX_CONF_CHAR != QX_CHAR_T_CHAR
52 template<size_t nStringsPoolSize, size_t nStringLiteralSize>
53 string_pool<nStringsPoolSize>::item format_macro_user_message(
54  string_pool<nStringsPoolSize>* pStringsPool,
55  const char_type (&)[nStringLiteralSize]) = delete;
56 #endif
57 
58 template<size_t nStringsPoolSize, class first_arg_t, class... rest_args_t>
59  requires(log_acceptable_args_c<first_arg_t, rest_args_t...>)
60 string_pool<nStringsPoolSize>::item format_macro_user_message(
61  string_pool<nStringsPoolSize>* pStringsPool,
62  const format_string_strong_checks<first_arg_t, rest_args_t...> sFormat,
63  first_arg_t&& firstArg,
64  rest_args_t&&... restArgs)
65 {
66  typename string_pool<nStringsPoolSize>::item message =
67  pStringsPool
68  ? pStringsPool->acquire()
69  : typename string_pool<nStringsPoolSize>::item { string(), string_pool<nStringsPoolSize>::nFreeString };
70 
71  message.sValue.vformat(
72  string_view(sFormat.get().data(), sFormat.get().size()),
73  std::forward<first_arg_t>(firstArg),
74  std::forward<rest_args_t>(restArgs)...);
75  return message;
76 }
77 
78 } // namespace details
79 
80 } // namespace qx
81 
82 // clang-format off
83 #define _QX_MACRO_USER_MESSAGE_0()
84 #define _QX_MACRO_USER_MESSAGE_1(a1) a1
85 #define _QX_MACRO_USER_MESSAGE_2(a1, a2) QXT(a1), a2
86 #define _QX_MACRO_USER_MESSAGE_3(a1, a2, a3) QXT(a1), a2, a3
87 #define _QX_MACRO_USER_MESSAGE_4(a1, a2, a3, a4) QXT(a1), a2, a3, a4
88 #define _QX_MACRO_USER_MESSAGE_5(a1, a2, a3, a4, a5) QXT(a1), a2, a3, a4, a5
89 #define _QX_MACRO_USER_MESSAGE_6(a1, a2, a3, a4, a5, a6) QXT(a1), a2, a3, a4, a5, a6
90 #define _QX_MACRO_USER_MESSAGE_7(a1, a2, a3, a4, a5, a6, a7) QXT(a1), a2, a3, a4, a5, a6, a7
91 #define _QX_MACRO_USER_MESSAGE_8(a1, a2, a3, a4, a5, a6, a7, a8) QXT(a1), a2, a3, a4, a5, a6, a7, a8
92 #define _QX_MACRO_USER_MESSAGE_9(a1, a2, a3, a4, a5, a6, a7, a8, a9) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9
93 #define _QX_MACRO_USER_MESSAGE_10(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10
94 #define _QX_MACRO_USER_MESSAGE_11(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11
95 #define _QX_MACRO_USER_MESSAGE_12(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12
96 #define _QX_MACRO_USER_MESSAGE_13(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13
97 #define _QX_MACRO_USER_MESSAGE_14(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14
98 #define _QX_MACRO_USER_MESSAGE_15(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15
99 #define _QX_MACRO_USER_MESSAGE_16(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16
100 #define _QX_MACRO_USER_MESSAGE_17(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17
101 #define _QX_MACRO_USER_MESSAGE_18(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18
102 #define _QX_MACRO_USER_MESSAGE_19(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19
103 #define _QX_MACRO_USER_MESSAGE_20(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20
104 #define _QX_MACRO_USER_MESSAGE_21(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21
105 #define _QX_MACRO_USER_MESSAGE_22(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22
106 #define _QX_MACRO_USER_MESSAGE_23(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23
107 #define _QX_MACRO_USER_MESSAGE_24(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24
108 #define _QX_MACRO_USER_MESSAGE_25(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25
109 #define _QX_MACRO_USER_MESSAGE_26(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26
110 #define _QX_MACRO_USER_MESSAGE_27(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27
111 #define _QX_MACRO_USER_MESSAGE_28(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28
112 #define _QX_MACRO_USER_MESSAGE_29(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29
113 #define _QX_MACRO_USER_MESSAGE_30(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30
114 #define _QX_MACRO_USER_MESSAGE_31(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31
115 #define _QX_MACRO_USER_MESSAGE_32(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32) QXT(a1), a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32
116 // clang-format on
117 
118 #define _QX_MACRO_USER_MESSAGE(stringsPool, ...) \
119  qx::details::format_macro_user_message(stringsPool __VA_OPT__(, ) QX_EXPAND( \
120  QX_APPEND_VA_ARG_COUNT(_QX_MACRO_USER_MESSAGE_, __VA_ARGS__)(__VA_ARGS__)))
requires format_acceptable_args_c< char_t, args_t... > void vformat(string_view svFormat, args_t &&... args)
Clear the string and format it with the format string and the args.
Definition: string.inl:156
requires(same_variadic_args_v< args_t... >) const expr auto coalesce(args_t &&... args)
Coalesce function, C# a ?? b analogue.
Definition: coalesce.inl:57
void to_string(string &out, cstring_view stringView, const std::locale &locale=std::locale())
Convert a char string to common string type.