summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pfmtlog.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pfmtlog.h')
-rwxr-xr-x[-rw-r--r--]src/lib/netlist/plib/pfmtlog.h185
1 files changed, 93 insertions, 92 deletions
diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h
index 200be024478..030de5d1fc5 100644..100755
--- a/src/lib/netlist/plib/pfmtlog.h
+++ b/src/lib/netlist/plib/pfmtlog.h
@@ -25,15 +25,20 @@ P_ENUM(plog_level,
template <typename T>
struct ptype_traits_base
{
- static T cast(T x) { return x; }
+ static const T cast(const T &x) { return x; }
static const bool is_signed = std::numeric_limits<T>::is_signed;
+ static const char *size_spec() { return ""; }
+ static char32_t fmt_spec() { return 'u'; }
};
template <>
struct ptype_traits_base<bool>
{
- static unsigned int cast(bool x) { return static_cast<unsigned int>(x); }
+ static unsigned int cast(bool &x) { return static_cast<unsigned int>(x); }
+ static unsigned int cast(const bool &x) { return static_cast<unsigned int>(x); }
static const bool is_signed = std::numeric_limits<bool>::is_signed;
+ static const char *size_spec() { return ""; }
+ static char32_t fmt_spec() { return 'u'; }
};
template <typename T>
@@ -42,143 +47,155 @@ struct ptype_traits;
template<>
struct ptype_traits<bool> : ptype_traits_base<bool>
{
- static const char *size_specifier() { return ""; }
};
template<>
struct ptype_traits<char> : ptype_traits_base<char>
{
- static const char *size_specifier() { return "h"; }
+ static const char *size_spec() { return "h"; }
+ static char32_t fmt_spec() { return is_signed ? 'd' : 'u'; }
};
template<>
struct ptype_traits<short> : ptype_traits_base<short>
{
- static const char *size_specifier() { return "h"; }
+ static const char *size_spec() { return "h"; }
+ static char32_t fmt_spec() { return 'd'; }
};
template<>
struct ptype_traits<int> : ptype_traits_base<int>
{
- static const char *size_specifier() { return ""; }
+ static char32_t fmt_spec() { return 'd'; }
};
template<>
struct ptype_traits<long> : ptype_traits_base<long>
{
- static const char *size_specifier() { return "l"; }
+ static const char *size_spec() { return "l"; }
+ static char32_t fmt_spec() { return 'd'; }
};
template<>
struct ptype_traits<long long> : ptype_traits_base<long long>
{
- static const char *size_specifier() { return "ll"; }
+ static const char *size_spec() { return "ll"; }
+ static char32_t fmt_spec() { return 'd'; }
};
template<>
struct ptype_traits<signed char> : ptype_traits_base<signed char>
{
- static const char *size_specifier() { return "h"; }
+ static const char *size_spec() { return "h"; }
+ static char32_t fmt_spec() { return 'd'; }
};
template<>
struct ptype_traits<unsigned char> : ptype_traits_base<unsigned char>
{
- static const char *size_specifier() { return "h"; }
+ static const char *size_spec() { return "h"; }
+ static char32_t fmt_spec() { return 'u'; }
};
template<>
struct ptype_traits<unsigned short> : ptype_traits_base<unsigned short>
{
- static const char *size_specifier() { return "h"; }
+ static const char *size_spec() { return "h"; }
+ static char32_t fmt_spec() { return 'u'; }
};
template<>
struct ptype_traits<unsigned int> : ptype_traits_base<unsigned int>
{
- static const char *size_specifier() { return ""; }
+ static char32_t fmt_spec() { return 'u'; }
};
template<>
struct ptype_traits<unsigned long> : ptype_traits_base<unsigned long>
{
- static const char *size_specifier() { return "l"; }
+ static const char *size_spec() { return "l"; }
+ static char32_t fmt_spec() { return 'u'; }
};
template<>
struct ptype_traits<unsigned long long> : ptype_traits_base<unsigned long long>
{
- static const char *size_specifier() { return "ll"; }
+ static const char *size_spec() { return "ll"; }
+ static char32_t fmt_spec() { return 'u'; }
};
-template <typename P>
-class pformat_base
+template<>
+struct ptype_traits<float> : ptype_traits_base<float>
+{
+ static char32_t fmt_spec() { return 'f'; }
+};
+
+template<>
+struct ptype_traits<double> : ptype_traits_base<double>
+{
+ static char32_t fmt_spec() { return 'f'; }
+};
+
+
+template<>
+struct ptype_traits<char *> : ptype_traits_base<char *>
+{
+ static const char *cast(const char *x) { return x; }
+ static char32_t fmt_spec() { return 's'; }
+};
+
+class pfmt
{
public:
+ explicit pfmt(const pstring &fmt)
+ : m_str(fmt), m_arg(0)
+ {
+ }
+
+ ~pfmt()
+ {
+ }
- P &operator ()(const double x, const char *f = "") { format_element(f, "", "f", x); return static_cast<P &>(*this); }
- P & e(const double x, const char *f = "") { format_element(f, "", "e", x); return static_cast<P &>(*this); }
- P & g(const double x, const char *f = "") { format_element(f, "", "g", x); return static_cast<P &>(*this); }
+ operator pstring() const { return m_str; }
+ pfmt & e(const double &x) {return format_element("", 'e', x); }
+ pfmt & g(const double &x) {return format_element("", 'g', x); }
- P &operator ()(const float x, const char *f = "") { format_element(f, "", "f", x); return static_cast<P &>(*this); }
- P & e(const float x, const char *f = "") { format_element(f, "", "e", x); return static_cast<P &>(*this); }
- P & g(const float x, const char *f = "") { format_element(f, "", "g", x); return static_cast<P &>(*this); }
+ pfmt & e(const float &x) {return format_element("", 'e', static_cast<double>(x)); }
+ pfmt & g(const float &x) {return format_element("", 'g', static_cast<double>(x)); }
- P &operator ()(const char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast<P &>(*this); }
- P &operator ()(char *x, const char *f = "") { format_element(f, "", "s", x); return static_cast<P &>(*this); }
- P &operator ()(const void *x, const char *f = "") { format_element(f, "", "p", x); return static_cast<P &>(*this); }
- P &operator ()(const pstring &x, const char *f = "") { format_element(f, "", "s", x.c_str() ); return static_cast<P &>(*this); }
+ pfmt &operator ()(const void *x) {return format_element("", 'p', x); }
+ pfmt &operator ()(const pstring &x) {return format_element("", 's', x.c_str() ); }
template<typename T>
- P &operator ()(const T x, const char *f = "")
+ pfmt &operator ()(const T &x)
{
- if (ptype_traits<T>::is_signed)
- format_element(f, ptype_traits<T>::size_specifier(), "d", ptype_traits<T>::cast(x));
- else
- format_element(f, ptype_traits<T>::size_specifier(), "u", ptype_traits<T>::cast(x));
- return static_cast<P &>(*this);
+ return format_element(ptype_traits<T>::size_spec(), ptype_traits<T>::fmt_spec(), ptype_traits<T>::cast(x));
}
template<typename T>
- P &x(const T x, const char *f = "")
+ pfmt &operator ()(const T *x)
{
- format_element(f, ptype_traits<T>::size_specifier(), "x", x);
- return static_cast<P &>(*this);
+ return format_element(ptype_traits<T *>::size_spec(), ptype_traits<T *>::fmt_spec(), ptype_traits<T *>::cast(x));
}
template<typename T>
- P &o(const T x, const char *f = "")
+ pfmt &x(const T &x)
{
- format_element(f, ptype_traits<T>::size_specifier(), "o", x);
- return static_cast<P &>(*this);
+ return format_element(ptype_traits<T>::size_spec(), 'x', x);
}
+ template<typename T>
+ pfmt &o(const T &x)
+ {
+ return format_element(ptype_traits<T>::size_spec(), 'o', x);
+ }
protected:
- ~pformat_base() { }
- virtual void format_element(const char *f, const char *l, const char *fmt_spec, ...) = 0;
-
-};
-
-class pfmt : public pformat_base<pfmt>
-{
-public:
- explicit pfmt(const pstring &fmt);
- virtual ~pfmt();
-
- operator pstring() const { return pstring(m_str, pstring::UTF8); }
-
- const char *c_str() { return m_str; }
-
-
-protected:
- void format_element(const char *f, const char *l, const char *fmt_spec, ...) override;
+ pfmt &format_element(const char *l, const unsigned fmt_spec, ...);
private:
- char *m_str;
- char m_str_buf[256];
- std::size_t m_allocated;
+ pstring m_str;
unsigned m_arg;
};
@@ -194,42 +211,18 @@ public:
template<bool enabled, typename... Args>
void log(const pstring & fmt, Args&&... args) const
{
- if (build_enabled && enabled && m_enabled) (*this)(fmt, std::forward<Args>(args)...);
+ if (build_enabled && enabled && m_enabled)
+ vdowrite(xlog(pfmt(fmt), std::forward<Args>(args)...));
}
- void operator ()(const pstring &fmt) const
+ template<typename... Args>
+ void operator ()(const pstring &fmt, Args&&... args) const
{
- if (build_enabled && m_enabled) vdowrite(fmt);
- }
-
- template<typename T1>
- void operator ()(const pstring &fmt, const T1 &v1) const
- {
- if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1));
- }
-
- template<typename T1, typename T2>
- void operator ()(const pstring &fmt, const T1 &v1, const T2 &v2) const
- {
- if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2));
- }
-
- template<typename T1, typename T2, typename T3>
- void operator ()(const pstring &fmt, const T1 &v1, const T2 &v2, const T3 &v3) const
- {
- if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3));
- }
-
- template<typename T1, typename T2, typename T3, typename T4>
- void operator ()(const pstring &fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4) const
- {
- if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4));
- }
-
- template<typename T1, typename T2, typename T3, typename T4, typename T5>
- void operator ()(const pstring &fmt, const T1 &v1, const T2 &v2, const T3 &v3, const T4 &v4, const T5 &v5) const
- {
- if (build_enabled && m_enabled) vdowrite(pfmt(fmt)(v1)(v2)(v3)(v4)(v5));
+ if (build_enabled && m_enabled)
+ {
+ pfmt pf(fmt);
+ vdowrite(xlog(pf, std::forward<Args>(args)...));
+ }
}
void set_enabled(const bool v)
@@ -244,6 +237,14 @@ protected:
virtual void vdowrite(const pstring &ls) const = 0;
private:
+ pfmt &xlog(pfmt &fmt) const { return fmt; }
+
+ template<typename X, typename... Args>
+ pfmt &xlog(pfmt &fmt, X&& x, Args&&... args) const
+ {
+ return xlog(fmt(std::forward<X>(x)), std::forward<Args>(args)...);
+ }
+
bool m_enabled;
};