fix constexpr under c++11

This commit is contained in:
Johannes Kapfhammer 2019-10-06 21:55:47 +02:00
parent 33d31af61d
commit 7fc2b533c7
2 changed files with 55 additions and 53 deletions

View File

@ -2,6 +2,7 @@
#include <soi> #include <soi>
signed main() { signed main() {
dbg();
dbg("hi"); dbg("hi");
string s="world"; string s="world";
dbg(s); dbg(s);
@ -18,5 +19,4 @@ signed main() {
dbg(map<int, string>{{3,"three"},{1,"one"}}); dbg(map<int, string>{{3,"three"},{1,"one"}});
dbg(unordered_map<int, string>{{3,"three"},{1,"one"}}); dbg(unordered_map<int, string>{{3,"three"},{1,"one"}});
dbg(unordered_set<int>{3,1,4}); dbg(unordered_set<int>{3,1,4});
dbg();
} }

View File

@ -19,8 +19,8 @@
#ifdef __GNUG__ #ifdef __GNUG__
#include <cstdlib> #include <cstdlib>
#include <memory>
#include <cxxabi.h> #include <cxxabi.h>
#include <memory>
#endif #endif
#if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__)) #if defined(__unix__) || (defined(__APPLE__) && defined(__MACH__))
@ -36,50 +36,48 @@ namespace detail {
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// pretty printing the type name // pretty printing the type name
struct string_view {
struct string_view char const *data;
{ std::size_t size;
char const* data;
std::size_t size;
}; };
template<class T> template <class T> string_view get_name() {
constexpr string_view get_name() char const *p = __PRETTY_FUNCTION__;
{ while (*p++ != '=')
char const* p = __PRETTY_FUNCTION__; ;
while (*p++ != '='); for (; *p == ' '; ++p)
for (; *p == ' '; ++p); ;
char const* p2 = p; char const *p2 = p;
int count = 1; int count = 1;
for (;;++p2) for (;; ++p2) {
{ switch (*p2) {
switch (*p2) case '[':
{ ++count;
case '[': break;
++count; case ']':
break; --count;
case ']': if (!count)
--count; return {p, std::size_t(p2 - p)};
if (!count)
return {p, std::size_t(p2 - p)};
}
} }
return {}; }
return {};
} }
std::string replace_all(std::string str, const std::string& from, const std::string& to) { std::string replace_all(std::string str, const std::string &from,
size_t start_pos = 0; const std::string &to) {
while((start_pos = str.find(from, start_pos)) != std::string::npos) { size_t start_pos = 0;
str.replace(start_pos, from.length(), to); while ((start_pos = str.find(from, start_pos)) != std::string::npos) {
start_pos += to.length(); // Handles case where 'to' is a substring of 'from' str.replace(start_pos, from.length(), to);
} start_pos +=
return str; to.length(); // Handles case where 'to' is a substring of 'from'
}
return str;
} }
std::string sanitize_type(std::string s) { std::string sanitize_type(std::string s) {
auto f = [&](const char *a, const char *b) { auto f = [&](const char *a, const char *b) {
s = replace_all(std::move(s), a, b); s = replace_all(std::move(s), a, b);
}; };
f("std::", ""); f("std::", "");
f("__debug::", ""); f("__debug::", "");
f("__cxx11::", ""); f("__cxx11::", "");
@ -200,38 +198,42 @@ template <typename T> T &&identity(T &&t) { return std::forward<T>(t); }
#if defined(__clang__) #if defined(__clang__)
#define SOI_ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, _14, _15, ...) _15 #define SOI_ARG16(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9, _10, _11, _12, _13, \
#define SOI_IS_NONEMPTY(...) SOI_ARG16(1, ##__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0) _14, _15, ...) \
_15
#define SOI_IS_NONEMPTY(...) \
SOI_ARG16(1, ##__VA_ARGS__, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)
#define SOI_DBG_IMPL_0() \ #define SOI_DBG_IMPL_0() \
soi::detail::dbg_print_status(__FILE__, __LINE__, __func__) soi::detail::dbg_print_status(__FILE__, __LINE__, __func__)
#define SOI_DBG_IMPL_1(...) \ #define SOI_DBG_IMPL_1(...) \
soi::detail::dbg_print((__VA_ARGS__), \ soi::detail::dbg_print( \
soi::detail::sanitized_type_name<decltype(__VA_ARGS__)>(), __FILE__, \ (__VA_ARGS__), \
__LINE__, __func__, #__VA_ARGS__) soi::detail::sanitized_type_name<decltype(__VA_ARGS__)>(), __FILE__, \
__LINE__, __func__, #__VA_ARGS__)
#else #else
#define SOI_IS_NONEMPTY(...) __VA_OPT__(HAS) #define SOI_IS_NONEMPTY(...) __VA_OPT__(HAS)
#define SOI_DBG_IMPL_() \ #define SOI_DBG_IMPL_() \
soi::detail::dbg_print_status(__FILE__, __LINE__, __func__) soi::detail::dbg_print_status(__FILE__, __LINE__, __func__)
#define SOI_DBG_IMPL_HAS(...) \ #define SOI_DBG_IMPL_HAS(...) \
soi::detail::dbg_print((__VA_ARGS__), \ soi::detail::dbg_print( \
soi::detail::sanitized_type_name<decltype(__VA_ARGS__)>(), __FILE__, \ (__VA_ARGS__), \
__LINE__, __func__, #__VA_ARGS__) soi::detail::sanitized_type_name<decltype(__VA_ARGS__)>(), __FILE__, \
__LINE__, __func__, #__VA_ARGS__)
#endif #endif
#define SOI_CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__) #define SOI_CAT(a, ...) PRIMITIVE_CAT(a, __VA_ARGS__)
#define SOI_PRIMITIVE_CAT(a, ...) a ## __VA_ARGS__ #define SOI_PRIMITIVE_CAT(a, ...) a##__VA_ARGS__
#define SOI_DBG_IMPL(is_nonempty, ...) \ #define SOI_DBG_IMPL(is_nonempty, ...) \
SOI_PRIMITIVE_CAT(SOI_DBG_IMPL_, is_nonempty)(__VA_ARGS__) SOI_PRIMITIVE_CAT(SOI_DBG_IMPL_, is_nonempty)(__VA_ARGS__)
#define dbg(...) \ #define dbg(...) SOI_DBG_IMPL(SOI_IS_NONEMPTY(__VA_ARGS__), __VA_ARGS__)
SOI_DBG_IMPL(SOI_IS_NONEMPTY(__VA_ARGS__), __VA_ARGS__)
#endif #endif
#endif // SOI_DBG #endif // SOI_DBG