Smarter SmartText (not fully working)

This commit is contained in:
NaifBanana
2025-12-12 02:19:45 -06:00
parent c66c4d5574
commit 6a0583b44b
2 changed files with 32 additions and 10 deletions
+26 -9
View File
@@ -10,12 +10,12 @@
namespace nb {
typedef std::pair<unsigned int, std::string> SmartTextKV;
typedef std::pair<unsigned int, std::string> SmartFormat;
//template<typename T=std::string>
template <typename T=const char*>
struct SmartText {
std::string msg;
SmartTextKV kv = {0, ""};
T msg;
SmartFormat fmt;
};
typedef std::string (*SmartTextFormatter)(std::string, std::string);
@@ -25,7 +25,7 @@ typedef std::unordered_map<unsigned int, SmartTextFormatter> SmartFormatMap;
template <typename ST>
class SmartOStreamBase {
public:
virtual void process(const SmartText&) = 0;
virtual void process(const SmartText<const char*>&) = 0;
static const SmartFormatMap Formatters;
@@ -81,7 +81,23 @@ public:
*_ostream << val;
}
virtual void process(const SmartText&);
template <typename Msg>
void process(const SmartText<Msg>& msg) {
using D = typename std::conditional<std::is_void<Derived>::value, SmartOStream<StreamType, void>, Derived>::type;
try {
*_ostream << D::Formatters.at(msg.fmt.first)(
static_cast<D*>(this)->process(static_cast<Msg>(msg.msg)),
msg.fmt.second
);
} catch (const std::out_of_range& e) {
*_ostream << D::Formatters.at(0)(
static_cast<D*>(this)->process(static_cast<Msg>(msg.msg)),
msg.fmt.second
);
}
}
virtual void process(const SmartText<const char*>&);
static const SmartFormatMap Formatters;
@@ -106,12 +122,13 @@ SmartOStream<ST, D>& operator<<(SmartOStream<ST, D>& stream, const U& msg) {
}
template<typename ST, typename D>
void SmartOStream<ST, D>::process(const SmartText& msg) {
void SmartOStream<ST, D>::process(const SmartText<const char*>& msg) {
using Derived = typename std::conditional<std::is_void<D>::value, SmartOStream<ST, void>, D>::type;
std::string msg_str(msg.msg);
try {
*_ostream << Derived::Formatters.at(msg.kv.first)(msg.msg, msg.kv.second);
*_ostream << Derived::Formatters.at(msg.fmt.first)(msg_str, msg.fmt.second);
} catch (const std::out_of_range& e) {
*_ostream << Derived::Formatters.at(0)(msg.msg, msg.kv.second);
*_ostream << Derived::Formatters.at(0)(msg_str, msg.fmt.second);
}
}