Commit 314970e4 authored by Dominik Charousset's avatar Dominik Charousset

Add parse function for timespans

parent 3836cdc9
......@@ -62,6 +62,8 @@ void parse(parse_state& ps, double& x);
// -- CAF types ----------------------------------------------------------------
void parse(parse_state& ps, timespan& x);
void parse(parse_state& ps, atom_value& x);
void parse(parse_state& ps, uri& x);
......
......@@ -40,7 +40,7 @@ namespace parser {
/// Reads a timespan.
template <class Iterator, class Sentinel, class Consumer>
void read_timespan(state<Iterator, Sentinel>& ps, Consumer& consumer,
void read_timespan(state<Iterator, Sentinel>& ps, Consumer&& consumer,
optional<int64_t> num = none) {
using namespace std::chrono;
struct interim_consumer {
......@@ -56,7 +56,7 @@ void read_timespan(state<Iterator, Sentinel>& ps, Consumer& consumer,
timespan result;
auto g = make_scope_guard([&] {
if (ps.code <= pec::trailing_character)
consumer.value(result);
consumer.value(std::move(result));
});
// clang-format off
start();
......
......@@ -24,6 +24,7 @@
#include "caf/detail/parser/read_floating_point.hpp"
#include "caf/detail/parser/read_signed_integer.hpp"
#include "caf/detail/parser/read_string.hpp"
#include "caf/detail/parser/read_timespan.hpp"
#include "caf/detail/parser/read_unsigned_integer.hpp"
#include "caf/detail/parser/read_uri.hpp"
#include "caf/uri_builder.hpp"
......@@ -56,6 +57,8 @@ PARSE_IMPL(float, floating_point)
PARSE_IMPL(double, floating_point)
PARSE_IMPL(timespan, timespan)
void parse(parse_state& ps, atom_value& x) {
parser::read_atom(ps, make_consumer(x), true);
}
......
......@@ -30,6 +30,28 @@ using namespace caf;
namespace {
using std::chrono::duration_cast;
timespan operator"" _ns(unsigned long long x) {
return duration_cast<timespan>(std::chrono::nanoseconds(x));
}
timespan operator"" _us(unsigned long long x) {
return duration_cast<timespan>(std::chrono::microseconds(x));
}
timespan operator"" _ms(unsigned long long x) {
return duration_cast<timespan>(std::chrono::milliseconds(x));
}
timespan operator"" _s(unsigned long long x) {
return duration_cast<timespan>(std::chrono::seconds(x));
}
timespan operator"" _h(unsigned long long x) {
return duration_cast<timespan>(std::chrono::hours(x));
}
template <class T>
expected<T> read(string_view str) {
T result;
......@@ -122,6 +144,22 @@ CAF_TEST(invalid floating point numbers) {
CHECK_INVALID(double, "++10e-10", pec::unexpected_character);
}
CAF_TEST(valid timespans) {
CAF_CHECK_EQUAL(read<timespan>("12ns"), 12_ns);
CAF_CHECK_EQUAL(read<timespan>("34us"), 34_us);
CAF_CHECK_EQUAL(read<timespan>("56ms"), 56_ms);
CAF_CHECK_EQUAL(read<timespan>("78s"), 78_s);
CAF_CHECK_EQUAL(read<timespan>("60min"), 1_h);
CAF_CHECK_EQUAL(read<timespan>("90h"), 90_h);
}
CAF_TEST(invalid timespans) {
CAF_CHECK_EQUAL(read<timespan>("12"), pec::unexpected_eof);
CAF_CHECK_EQUAL(read<timespan>("12nas"), pec::unexpected_character);
CAF_CHECK_EQUAL(read<timespan>("34usec"), pec::trailing_character);
CAF_CHECK_EQUAL(read<timespan>("56m"), pec::unexpected_eof);
}
CAF_TEST(valid atom values) {
CAF_CHECK_EQUAL(read<atom_value>("foo"), atom("foo"));
CAF_CHECK_EQUAL(read<atom_value>("'foo'"), atom("foo"));
......
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