Add support down to femtosecond precision

* Requires platform specific use of 128bit integral representation
  (e.g. std::chrono::duration<__int128_t, std::femto>).
This commit is contained in:
Howard Hinnant
2017-09-09 10:30:39 -04:00
parent 5f01382e24
commit 481771ef5e
4 changed files with 140 additions and 49 deletions

View File

@@ -94,7 +94,7 @@ main()
{
using D = decimal_format_seconds<milliseconds>;
static_assert(D::width == 3, "");
static_assert(is_same<D::precision, make_precision<D::width>::type>{}, "");
static_assert(is_same<D::precision, make_precision<D::rep, D::width>::type>{}, "");
D dfs{seconds{3}};
assert(dfs.seconds() == seconds{3});
assert(dfs.to_duration() == seconds{3});
@@ -106,7 +106,7 @@ main()
{
using D = decimal_format_seconds<milliseconds>;
static_assert(D::width == 3, "");
static_assert(is_same<D::precision, make_precision<D::width>::type>{}, "");
static_assert(is_same<D::precision, make_precision<D::rep, D::width>::type>{}, "");
D dfs{milliseconds{3}};
assert(dfs.seconds() == seconds{0});
assert(dfs.to_duration() == milliseconds{3});
@@ -118,7 +118,7 @@ main()
{
using D = decimal_format_seconds<microfortnights>;
static_assert(D::width == 4, "");
using S = make_precision<D::width>::type;
using S = make_precision<D::rep, D::width>::type;
static_assert(is_same<D::precision, S>{}, "");
D dfs{microfortnights{3}};
assert(dfs.seconds() == seconds{3});
@@ -132,7 +132,7 @@ main()
using CT = common_type<seconds, microfortnights>::type;
using D = decimal_format_seconds<CT>;
static_assert(D::width == 4, "");
using S = make_precision<D::width>::type;
using S = make_precision<D::rep, D::width>::type;
static_assert(is_same<D::precision, S>{}, "");
D dfs{microfortnights{3}};
assert(dfs.seconds() == seconds{3});

View File

@@ -40,24 +40,24 @@ main()
using namespace std;
using namespace std::chrono;
static_assert(make_precision<0>::width == 0, "");
static_assert(is_same<make_precision<0>::type, duration<int64_t, ratio<1, 1>>>{}, "");
static_assert(make_precision<int64_t, 0>::width == 0, "");
static_assert(is_same<make_precision<int64_t, 0>::type, duration<int64_t, ratio<1, 1>>>{}, "");
static_assert(make_precision<1>::width == 1, "");
static_assert(is_same<make_precision<1>::type, duration<int64_t, ratio<1, 10>>>{}, "");
static_assert(make_precision<int64_t, 1>::width == 1, "");
static_assert(is_same<make_precision<int64_t, 1>::type, duration<int64_t, ratio<1, 10>>>{}, "");
static_assert(make_precision<2>::width == 2, "");
static_assert(is_same<make_precision<2>::type, duration<int64_t, ratio<1, 100>>>{}, "");
static_assert(make_precision<int64_t, 2>::width == 2, "");
static_assert(is_same<make_precision<int64_t, 2>::type, duration<int64_t, ratio<1, 100>>>{}, "");
static_assert(make_precision<3>::width == 3, "");
static_assert(is_same<make_precision<3>::type, duration<int64_t, ratio<1, 1000>>>{}, "");
static_assert(make_precision<int64_t, 3>::width == 3, "");
static_assert(is_same<make_precision<int64_t, 3>::type, duration<int64_t, ratio<1, 1000>>>{}, "");
static_assert(make_precision<18>::width == 18, "");
static_assert(is_same<make_precision<18>::type, duration<int64_t, ratio<1, 1000000000000000000>>>{}, "");
static_assert(make_precision<int64_t, 18>::width == 18, "");
static_assert(is_same<make_precision<int64_t, 18>::type, duration<int64_t, ratio<1, 1000000000000000000>>>{}, "");
static_assert(make_precision<19>::width == 6, "");
static_assert(is_same<make_precision<19>::type, microseconds>{}, "");
static_assert(make_precision<int64_t, 19>::width == 6, "");
static_assert(is_same<make_precision<int64_t, 19>::type, microseconds>{}, "");
static_assert(make_precision<20>::width == 6, "");
static_assert(is_same<make_precision<20>::type, microseconds>{}, "");
static_assert(make_precision<int64_t, 20>::width == 6, "");
static_assert(is_same<make_precision<int64_t, 20>::type, microseconds>{}, "");
}