From bd2dd3f00095b5ecc53c202dbd5de84973e4f86b Mon Sep 17 00:00:00 2001 From: Gary Talent Date: Wed, 2 Mar 2022 23:42:12 -0600 Subject: [PATCH] [ox/std] Add Integer_c concept to fix string + and += duplication of std::size_t with some compilers/platforms --- deps/ox/src/ox/std/bstring.hpp | 12 +++---- deps/ox/src/ox/std/fmt.hpp | 2 +- deps/ox/src/ox/std/string.hpp | 49 +++---------------------- deps/ox/src/ox/std/trace.hpp | 59 +++++-------------------------- deps/ox/src/ox/std/typetraits.hpp | 25 +++++++++++++ 5 files changed, 44 insertions(+), 103 deletions(-) diff --git a/deps/ox/src/ox/std/bstring.hpp b/deps/ox/src/ox/std/bstring.hpp index f670f69c..aaaa5f2b 100644 --- a/deps/ox/src/ox/std/bstring.hpp +++ b/deps/ox/src/ox/std/bstring.hpp @@ -29,19 +29,19 @@ class BString { constexpr BString &operator=(char *str) noexcept; - constexpr BString &operator=(int64_t i) noexcept; + constexpr BString &operator=(Integer_c auto i) noexcept; constexpr BString &operator+=(const char *str) noexcept; constexpr BString &operator+=(char *str) noexcept; - constexpr BString &operator+=(int64_t i) noexcept; + constexpr BString &operator+=(Integer_c auto i) noexcept; constexpr BString operator+(const char *str) const noexcept; constexpr BString operator+(char *str) const noexcept; - constexpr BString operator+(int64_t i) const noexcept; + constexpr BString operator+(Integer_c auto i) const noexcept; constexpr bool operator==(const BString &other) const noexcept; @@ -87,7 +87,7 @@ constexpr BString::BString(const char *str) noexcept: m_buff{{0}} { } template -constexpr BString &BString::operator=(int64_t i) noexcept { +constexpr BString &BString::operator=(Integer_c auto i) noexcept { char str[65] = {}; ox_itoa(i, str); return this->operator=(str); @@ -123,7 +123,7 @@ constexpr BString &BString::operator+=(char *str) noexcept { } template -constexpr BString &BString::operator+=(int64_t i) noexcept { +constexpr BString &BString::operator+=(Integer_c auto i) noexcept { char str[65] = {}; ox_itoa(i, str); return this->operator+=(str); @@ -143,7 +143,7 @@ constexpr BString BString::operator+(char *str) const noexcept { } template -constexpr BString BString::operator+(int64_t i) const noexcept { +constexpr BString BString::operator+(Integer_c auto i) const noexcept { char str[65] = {}; ox_itoa(i, str); return this->operator+(str); diff --git a/deps/ox/src/ox/std/fmt.hpp b/deps/ox/src/ox/std/fmt.hpp index 5e5ae8d9..3c3b352d 100644 --- a/deps/ox/src/ox/std/fmt.hpp +++ b/deps/ox/src/ox/std/fmt.hpp @@ -70,7 +70,7 @@ class FmtArg { constexpr FmtArg(const T &v) noexcept { if constexpr(is_bool_v) { out = v ? "true" : "false"; - } else if constexpr(is_integral_v) { + } else if constexpr(is_integer_v) { out = ox_itoa(v, dataStr); } else { out = toCString(v); diff --git a/deps/ox/src/ox/std/string.hpp b/deps/ox/src/ox/std/string.hpp index 699a39a1..04a1266b 100644 --- a/deps/ox/src/ox/std/string.hpp +++ b/deps/ox/src/ox/std/string.hpp @@ -120,13 +120,7 @@ class BasicString { constexpr BasicString &operator+=(char c) noexcept; - constexpr BasicString &operator+=(int i) noexcept; - - constexpr BasicString &operator+=(int64_t i) noexcept; - - constexpr BasicString &operator+=(uint64_t i) noexcept; - - constexpr BasicString &operator+=(std::size_t i) noexcept; + constexpr BasicString &operator+=(Integer_c auto i) noexcept; constexpr BasicString &operator+=(const BasicString &src) noexcept; @@ -136,11 +130,7 @@ class BasicString { constexpr BasicString operator+(char c) const noexcept; - constexpr BasicString operator+(int i) const noexcept; - - constexpr BasicString operator+(int64_t i) const noexcept; - - constexpr BasicString operator+(uint64_t i) const noexcept; + constexpr BasicString operator+(Integer_c auto i) const noexcept; constexpr BasicString operator+(const BasicString &src) const noexcept; @@ -345,26 +335,7 @@ constexpr BasicString &BasicString::operator+= } template -constexpr BasicString &BasicString::operator+=(int i) noexcept { - return this->operator+=(static_cast(i)); -} - -template -constexpr BasicString &BasicString::operator+=(int64_t i) noexcept { - char str[65] = {}; - ox_itoa(i, str); - return this->operator+=(str); -} - -template -constexpr BasicString &BasicString::operator+=(uint64_t i) noexcept { - char str[65] = {}; - ox_itoa(i, str); - return this->operator+=(str); -} - -template -constexpr BasicString &BasicString::operator+=(std::size_t i) noexcept { +constexpr BasicString &BasicString::operator+=(Integer_c auto i) noexcept { char str[65] = {}; ox_itoa(i, str); return this->operator+=(str); @@ -401,19 +372,7 @@ constexpr BasicString BasicString::operator+(c } template -constexpr BasicString BasicString::operator+(int i) const noexcept { - return this->operator+(static_cast(i)); -} - -template -constexpr BasicString BasicString::operator+(int64_t i) const noexcept { - char str[65] = {}; - ox_itoa(i, str); - return *this + str; -} - -template -constexpr BasicString BasicString::operator+(uint64_t i) const noexcept { +constexpr BasicString BasicString::operator+(Integer_c auto i) const noexcept { char str[65] = {}; ox_itoa(i, str); return *this + str; diff --git a/deps/ox/src/ox/std/trace.hpp b/deps/ox/src/ox/std/trace.hpp index ea17d914..8472ccf0 100644 --- a/deps/ox/src/ox/std/trace.hpp +++ b/deps/ox/src/ox/std/trace.hpp @@ -17,6 +17,7 @@ #include "fmt.hpp" #include "hashmap.hpp" #include "string.hpp" +#include "typetraits.hpp" #include "units.hpp" extern "C" { @@ -110,23 +111,7 @@ class OutStream { oxTraceHook(m_msg.file, m_msg.line, m_msg.ch, m_msg.msg.c_str()); } - constexpr OutStream &operator<<(short v) noexcept; - - constexpr OutStream &operator<<(int v) noexcept; - - constexpr OutStream &operator<<(long v) noexcept; - - constexpr OutStream &operator<<(long long v) noexcept; - - constexpr OutStream &operator<<(unsigned char v) noexcept; - - constexpr OutStream &operator<<(unsigned short v) noexcept; - - constexpr OutStream &operator<<(unsigned int v) noexcept; - - constexpr OutStream &operator<<(unsigned long v) noexcept; - - constexpr OutStream &operator<<(unsigned long long v) noexcept; + constexpr OutStream &operator<<(Integer_c auto v) noexcept; constexpr OutStream &operator<<(char v) noexcept { if (m_msg.msg.len()) { @@ -185,40 +170,12 @@ class OutStream { }; -constexpr OutStream &OutStream::operator<<(short v) noexcept { - return appendSignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(int v) noexcept { - return appendSignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(long v) noexcept { - return appendSignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(long long v) noexcept { - return appendSignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(unsigned char v) noexcept { - return appendUnsignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(unsigned short v) noexcept { - return appendUnsignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(unsigned int v) noexcept { - return appendUnsignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(unsigned long v) noexcept { - return appendUnsignedInt(v); -} - -constexpr OutStream &OutStream::operator<<(unsigned long long v) noexcept { - return appendUnsignedInt(v); +constexpr OutStream &OutStream::operator<<(Integer_c auto v) noexcept { + if (m_msg.msg.len()) { + m_msg.msg += m_delimiter; + } + m_msg.msg += v; + return *this; } diff --git a/deps/ox/src/ox/std/typetraits.hpp b/deps/ox/src/ox/std/typetraits.hpp index 4b9031f4..f3820cc6 100644 --- a/deps/ox/src/ox/std/typetraits.hpp +++ b/deps/ox/src/ox/std/typetraits.hpp @@ -75,6 +75,31 @@ template<> struct is_integral: true_type {}; template constexpr bool is_integral_v = is_integral::value; + +// is_integer ///////////////////////////////////////////////////////////////// + +template struct is_integer: false_type {}; +template<> struct is_integer : true_type {}; +template<> struct is_integer : true_type {}; +template<> struct is_integer : true_type {}; +template<> struct is_integer: true_type {}; +template<> struct is_integer : true_type {}; +template<> struct is_integer: true_type {}; + +// some of these need to be done with the actual language syntax because no one +// can agree on what an (u)int64_t is... +template<> struct is_integer: true_type {}; +template<> struct is_integer: true_type {}; +template<> struct is_integer: true_type {}; +template<> struct is_integer: true_type {}; + +template +constexpr bool is_integer_v = is_integral::value; + +template +concept Integer_c = is_integer::value; + + template struct is_char: false_type {}; template<> struct is_char : true_type {}; template