inline void stringifyMapImpl( std::ostream& mStream, const T& mValue, const TSep& mSeparator) { auto itrBegin(std::begin(mValue)); if(std::begin(mValue) == std::end(mValue)) { printBold<TFmt>(mStream, "{ EMPTY }"); return; } printBold<TFmt>(mStream, "{"); repeatPenultimate(itrBegin, std::end(mValue), [&mStream, &mSeparator](const auto& mE) { callStringifyImpl<TFmt>(mStream, mE.first); printBold<TFmt>(mStream, mSeparator); callStringifyImpl<TFmt>(mStream, mE.second); }, [&mStream](const auto&) { printBold<TFmt>(mStream, ", "); }); printBold<TFmt>(mStream, "}"); }
template<bool TFmt> inline static void impl(std::ostream& mStream, const T& mValue) { auto itrBegin(std::begin(mValue)); if(itrBegin == std::end(mValue)) { printBold<TFmt>(mStream, "{ EMPTY }"); return; } printBold<TFmt>(mStream, "{"); repeatPenultimate(itrBegin, std::end(mValue), [&mStream](const auto& mE){ callStringifyImpl<TFmt>(mStream, mE); }, [&mStream](auto&){ printBold<TFmt>(mStream, ", "); }); printBold<TFmt>(mStream, "}"); }
/// @brief Map stringifier. Streams each key <separator> value pair, separated by commas. template<bool TFmt, typename T, typename TSep> inline void stringifyMapImpl(std::ostream& mStream, const T& mValue, const TSep& mSeparator) { auto itrBegin(std::begin(mValue)); if(std::begin(mValue) == std::end(mValue)) { printBold<TFmt>(mStream, "{ EMPTY }"); return; } printBold<TFmt>(mStream, "{"); // C++14: `auto` lambda repeatPenultimate(itrBegin, std::end(mValue), [&mStream, &mSeparator](decltype(*itrBegin) mE) { callStringifyImpl<TFmt>(mStream, mE.first); printBold<TFmt>(mStream, mSeparator); callStringifyImpl<TFmt>(mStream, mE.second); }, [&mStream](decltype(*itrBegin)){ printBold<TFmt>(mStream, ", "); }); printBold<TFmt>(mStream, "}"); }