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_USE_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.format(sFormat, std::forward<first_arg_t>(firstArg), std::forward<rest_args_t>(restArgs)...);
72  return message;
73 }
74 
75 } // namespace details
76 
77 } // namespace qx
78 
79 // clang-format off
80 #define _QX_MACRO_USER_MESSAGE_0()
81 #define _QX_MACRO_USER_MESSAGE_1(a1) a1
82 #define _QX_MACRO_USER_MESSAGE_2(a1, a2) QXT(a1), a2
83 #define _QX_MACRO_USER_MESSAGE_3(a1, a2, a3) QXT(a1), a2, a3
84 #define _QX_MACRO_USER_MESSAGE_4(a1, a2, a3, a4) QXT(a1), a2, a3, a4
85 #define _QX_MACRO_USER_MESSAGE_5(a1, a2, a3, a4, a5) QXT(a1), a2, a3, a4, a5
86 #define _QX_MACRO_USER_MESSAGE_6(a1, a2, a3, a4, a5, a6) QXT(a1), a2, a3, a4, a5, a6
87 #define _QX_MACRO_USER_MESSAGE_7(a1, a2, a3, a4, a5, a6, a7) QXT(a1), a2, a3, a4, a5, a6, a7
88 #define _QX_MACRO_USER_MESSAGE_8(a1, a2, a3, a4, a5, a6, a7, a8) QXT(a1), a2, a3, a4, a5, a6, a7, a8
89 #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
90 #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
91 #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
92 #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
93 #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
94 #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
95 #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
96 #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
97 #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
98 #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
99 #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
100 #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
101 #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
102 #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
103 #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
104 #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
105 #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
106 #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
107 #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
108 #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
109 #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
110 #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
111 #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
112 #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
113 // clang-format on
114 
115 #define _QX_MACRO_USER_MESSAGE(stringsPool, ...) \
116  qx::details::format_macro_user_message(stringsPool __VA_OPT__(, ) QX_EXPAND( \
117  QX_APPEND_VA_ARG_COUNT(_QX_MACRO_USER_MESSAGE_, __VA_ARGS__)(__VA_ARGS__)))
requires format_acceptable_args_c< char_t, args_t... > void format(const format_string_type< std::type_identity_t< args_t >... > sFormat, args_t &&... args)
Clear the string and format it with the format string and the args.
Definition: string.inl:117
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.