Commit 27959b35 authored by Dominik Charousset's avatar Dominik Charousset

Support function pointers in deep_to_string

parent 0858179b
...@@ -19,7 +19,6 @@ ...@@ -19,7 +19,6 @@
#pragma once #pragma once
#include <chrono> #include <chrono>
#include <functional>
#include <string> #include <string>
#include <type_traits> #include <type_traits>
#include <vector> #include <vector>
...@@ -64,7 +63,7 @@ public: ...@@ -64,7 +63,7 @@ public:
template <class... Ts> template <class... Ts>
void operator()(Ts&&... xs) { void operator()(Ts&&... xs) {
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
/// Prints a separator to the result string. /// Prints a separator to the result string.
...@@ -201,9 +200,8 @@ public: ...@@ -201,9 +200,8 @@ public:
} }
template <class T> template <class T>
enable_if_t<std::is_pointer<T>::value enable_if_t<!std::is_same<decay_t<T>, void>::value>
&& !std::is_same<decay_t<T>, void>::value> consume(T*& ptr) {
consume(T ptr) {
if (ptr) { if (ptr) {
result_ += '*'; result_ += '*';
consume(*ptr); consume(*ptr);
...@@ -275,55 +273,65 @@ public: ...@@ -275,55 +273,65 @@ public:
} }
template <class T, class... Ts> template <class T, class... Ts>
void traverse(meta::hex_formatted_t, T& x, Ts&&... xs) { void traverse(const meta::hex_formatted_t&, const T& x, const Ts&... xs) {
sep(); sep();
append_hex(result_, reinterpret_cast<uint8_t*>(deconst(x).data()), append_hex(result_, reinterpret_cast<uint8_t*>(deconst(x).data()),
x.size()); x.size());
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
template <class T, class... Ts> template <class T, class... Ts>
void traverse(meta::omittable_if_none_t, T& x, Ts&&... xs) { void traverse(const meta::omittable_if_none_t&, const T& x, const Ts&... xs) {
if (x != none) { if (x != none) {
sep(); sep();
consume(x); consume(x);
} }
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
template <class T, class... Ts> template <class T, class... Ts>
void traverse(meta::omittable_if_empty_t, T& x, Ts&&... xs) { void traverse(const meta::omittable_if_empty_t&, const T& x,
const Ts&... xs) {
if (!x.empty()) { if (!x.empty()) {
sep(); sep();
consume(x); consume(x);
} }
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
template <class T, class... Ts> template <class T, class... Ts>
void traverse(meta::omittable_t, T&, Ts&&... xs) { void traverse(const meta::omittable_t&, const T&, const Ts&... xs) {
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
template <class... Ts> template <class... Ts>
void traverse(meta::type_name_t x, Ts&&... xs) { void traverse(const meta::type_name_t& x, const Ts&... xs) {
sep(); sep();
result_ += x.value; result_ += x.value;
result_ += '('; result_ += '(';
traverse(std::forward<Ts>(xs)...); traverse(xs...);
result_ += ')'; result_ += ')';
} }
template <class... Ts> template <class... Ts>
void traverse(const meta::annotation&, Ts&&... xs) { void traverse(const meta::annotation&, const Ts&... xs) {
traverse(std::forward<Ts>(xs)...); traverse(xs...);
} }
template <class T, class... Ts> template <class T, class... Ts>
enable_if_t<!meta::is_annotation<T>::value> traverse(T&& x, Ts&&... xs) { enable_if_t<!meta::is_annotation<T>::value && !is_callable<T>::value>
traverse(const T& x, const Ts&... xs) {
sep(); sep();
consume(deconst(x)); consume(deconst(x));
traverse(std::forward<Ts>(xs)...); traverse(xs...);
}
template <class T, class... Ts>
enable_if_t<!meta::is_annotation<T>::value && is_callable<T>::value>
traverse(const T&, const Ts&... xs) {
sep();
result_ += "<fun>";
traverse(xs...);
} }
private: private:
......
...@@ -24,6 +24,14 @@ ...@@ -24,6 +24,14 @@
using namespace caf; using namespace caf;
namespace {
void foobar() {
// nop
}
} // namespace <anonymous>
CAF_TEST(timespans) { CAF_TEST(timespans) {
CAF_CHECK_EQUAL(deep_to_string(timespan{1}), "1ns"); CAF_CHECK_EQUAL(deep_to_string(timespan{1}), "1ns");
CAF_CHECK_EQUAL(deep_to_string(timespan{1000}), "1us"); CAF_CHECK_EQUAL(deep_to_string(timespan{1000}), "1us");
...@@ -31,3 +39,9 @@ CAF_TEST(timespans) { ...@@ -31,3 +39,9 @@ CAF_TEST(timespans) {
CAF_CHECK_EQUAL(deep_to_string(timespan{1000000000}), "1s"); CAF_CHECK_EQUAL(deep_to_string(timespan{1000000000}), "1s");
CAF_CHECK_EQUAL(deep_to_string(timespan{60000000000}), "1min"); CAF_CHECK_EQUAL(deep_to_string(timespan{60000000000}), "1min");
} }
CAF_TEST(pointers) {
auto i = 42;
CAF_CHECK_EQUAL(deep_to_string(&i), "*42");
CAF_CHECK_EQUAL(deep_to_string(foobar), "<fun>");
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment