Compare commits

..

No commits in common. "e724f201fc1ad16ba653d6dc244dd686cc5f7b3d" and "cca34a1ad7656dd0f9a50fddbf79ba390a4822e5" have entirely different histories.

3 changed files with 48 additions and 66 deletions

View File

@ -2,7 +2,6 @@
#include <soi> #include <soi>
signed main() { signed main() {
dbg();
dbg("hi"); dbg("hi");
string s="world"; string s="world";
dbg(s); dbg(s);
@ -19,4 +18,5 @@ 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

@ -28,7 +28,6 @@
#include <tuple> #include <tuple>
#include <type_traits> #include <type_traits>
#include <unordered_set> #include <unordered_set>
#include <unordered_map>
#include <utility> #include <utility>
#include <valarray> #include <valarray>
#include <vector> #include <vector>

View File

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