summaryrefslogtreecommitdiff
path: root/indra/llcommon/llcallstack.h
diff options
context:
space:
mode:
authorNat Goodspeed <nat@lindenlab.com>2021-11-23 09:58:54 -0500
committerNat Goodspeed <nat@lindenlab.com>2021-11-23 09:58:54 -0500
commita32a45163d18f9b5998e469a356f870dbdb034ad (patch)
treeb800e7fe9da36ec3c1d4d06666a20aadf5b4b40f /indra/llcommon/llcallstack.h
parent53cf740d874f376f212a5d706ca70cbf35fee259 (diff)
SL-16094: Extend stringize() to support variadic arguments.
It's useful to be able to say STRINGIZE(item0 << item1 << item2), and we use that a lot in our code base. But weird syntax aside, there are a couple advantages to being able to write stringize(item0, item1, item2). First, it allows stringize() to be used from within some other variadic function, without having to make that function a macro that accepts an arbitrary insertion-operator expression. There's no such thing as a member macro. Second, particularly for variadic functions, it allows us to optimize the single-argument case stringize(item0). A macro can't do that. When item0 is already a string of the desired char type, instead of streaming it into a std::ostringstream and retrieving it again, we can simply return the input string. When it's a pointer to the desired char type, we can directly construct the result string without the help of std::ostringstream. When it's a string of some other char type, we can engage ll_convert() to perform needed conversions. We generalize and optimize the generic gstringize() function, retaining the role of stringize() and wstringize() as thin wrappers that merely provide the desired char type. Optimizing the single-argument case requires separately defining gstringize() with two or more arguments: the general case. Then gstringize(arg) is delegated to a gstringize_impl class template so we can partially specialize to recognize a std::basic_string<desired_char_type> argument, as well as desired_char_type*. Both these specializations engage ll_convert(), which already handles the trivial case when no conversion is required. Use of ll_convert() in this role supercedes and generalizes the previous wstring_to_utf8str() and utf8str_to_wstring() overloads. Also introduce stream_to(std::ostream&, ...) to support variadic streaming to other destinations, e.g. a file, std::cout, ...
Diffstat (limited to 'indra/llcommon/llcallstack.h')
0 files changed, 0 insertions, 0 deletions