- addition of the new pantheios::slice inserter
- widestring compatibility (of source, not yet of makefile build targets)
void fn(char const* str, size_t len)
{
. . .
In such a case, you cannot just pass str to a log statement, because that assumes it will be nul-terminated, and the semantics of fn() are clearly that it's not. In most circumstances you will get a benign overrun. But that is not guaranteed, and it's possible to get an access violation by overrunning into an invalid area of address space. (Imperfect C++ discusses ways in which this can happen.)
So, instead, use the new pantheios::slice inserter:
// assumes inclusion of pantheios/pan.hpp
// assumes inclusion of pantheios/inserter/slice.hpp
void fn(char const* str, size_t len)
{
pan::log_DEBUG("fn(", pan::slice(str, len), ")");
. . .
Now only the requisite slice will be included.
But there's more to it than just that. I often use the convention of naming parameters when logging function entry, as in:
void fn2(std::string const& path1, std::string const& path2)
{
pan::log_DEBUG(path1=", path1, ", path2=", path2, ")");
. . .
Obviously this is done explicitly, with names contained in the literal strings that are used to separate the function parameters in such cases. The question with pantheios::slice, then, is how we would achieve the same?
To accomodate this, pantheios::slice has several overloads that facilitate naming. Assuming str is "abcdefghijklm" and len is 5, consider the following examples:
void fn(char const* str, size_t len)
{
// gives "fn(abcde)"
pan::log_DEBUG("fn(", pan::slice(str, len), ")");
// gives "fn(str=abcde, len=5)"
pan::log_DEBUG("fn(", pan::slice(str, len, "str", "len"), ")");
// gives "fn(s;abcde;l:5)"
pan::log_DEBUG("fn(", pan::slice(str, len, "s", "l", ":", ";"), ")");
. . .