| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- #pragma once
- #if !defined(NDEBUG) && defined(JVALIDATE_TRACE)
- #include <iostream>
- #include <map>
- #include <source_location>
- #include <string_view>
- #include <jvalidate/_macro.h>
- #include <jvalidate/detail/on_block_exit.h>
- namespace jvalidate::detail {
- template <typename K, typename V>
- std::ostream & operator<<(std::ostream & os, std::map<K, V> const & value) {
- os << '{';
- std::string_view div;
- for (auto const & [k, v] : value) {
- os << std::exchange(div, ", ") << k << ':' << ' ' << v;
- }
- return os << '}';
- }
- template <typename V> std::ostream & operator<<(std::ostream & os, std::vector<V> const & value) {
- os << '[';
- std::string_view div;
- for (auto const & v : value) {
- os << std::exchange(div, ", ") << v;
- }
- return os << ']';
- }
- template <typename V> std::ostream & operator<<(std::ostream & os, std::set<V> const & value) {
- os << '[';
- std::string_view div;
- for (auto const & v : value) {
- os << std::exchange(div, ", ") << v;
- }
- return os << ']';
- }
- }
- namespace jvalidate::detail {
- inline size_t g_debug_trace_depth = 0;
- }
- #define JVALIDATE_NAME(x) JVALIDATE_CONCAT(__, JVALIDATE_CONCAT(x, __LINE__))
- #define JVALIDATE_DEBUG(expression) \
- do { \
- using ::jvalidate::detail::operator<<; \
- auto JVALIDATE_NAME(here) = std::source_location::current(); \
- std::string_view JVALIDATE_NAME(fname) = JVALIDATE_NAME(here).file_name(); \
- JVALIDATE_NAME(fname).remove_prefix(JVALIDATE_NAME(fname).find_last_of('/') + 1); \
- std::cerr << std::string(2 * ::jvalidate::detail::g_depth, ' ') << JVALIDATE_NAME(fname) \
- << ':' << JVALIDATE_NAME(here).line() << ' ' << expression << std::endl; \
- } while (false)
- #define JVALIDATE_DEBUG_INDENTED_SCOPE() \
- ::jvalidate::detail::OnBlockExit JVALIDATE_NAME(indent_scope) = \
- (++::jvalidate::detail::g_debug_trace_depth, \
- []() { --::jvalidate::detail::g_debug_trace_depth; })
- #else
- #define JVALIDATE_DEBUG(...)
- #define JVALIDATE_DEBUG_INDENTED_SCOPE()
- #endif
|