/** @file quantity.hpp * * Author: Roland Conybeare **/ #pragma once #include "natural_unit.hpp" #include "scaled_unit.hpp" namespace xo { namespace qty { /** @class quantity * @brief represent a scalar quantity with associated units. * * Enforce dimensional consistency at compile time. * sizeof(quantity) == sizeof(Repr). **/ template < typename Repr = double, typename Int = std::int64_t, natural_unit NaturalUnit = natural_unit(), typename Int2x = detail::width2x > class quantity { public: using repr_type = Repr; using unit_type = natural_unit; using ratio_int_type = Int; using ratio_int2x_type = Int2x; public: constexpr quantity() : scale_{0} {} explicit constexpr quantity(Repr scale) : scale_{scale} {} constexpr const repr_type & scale() const { return scale_; } constexpr const unit_type & unit() const { return s_unit; } constexpr nu_abbrev_type abbrev() const { return s_unit.abbrev(); } public: /* need public members so that a quantity instance can be a non-type template parameter (is a structural type) */ static constexpr natural_unit s_unit = NaturalUnit; Repr scale_ = Repr{}; }; namespace qty { // ----- mass ----- inline constexpr auto picograms(double x) { return quantity(x); } inline constexpr auto nanograms(double x) { return quantity(x); } inline constexpr auto micrograms(double x) { return quantity(x); } inline constexpr auto milligrams(double x) { return quantity(x); } inline constexpr auto grams(double x) { return quantity(x); } inline constexpr auto kilograms(double x) { return quantity(x); } inline constexpr auto tonnes(double x) { return quantity(x); } inline constexpr auto kilotonnes(double x) { return quantity(x); } inline constexpr auto megatonnes(double x) { return quantity(x); } inline constexpr auto gigatonnes(double x) { return quantity(x); } // ----- distance ----- inline constexpr auto picometers(double x) { return quantity(x); } inline constexpr auto nanometers(double x) { return quantity(x); } inline constexpr auto micrometers(double x) { return quantity(x); } inline constexpr auto millimeters(double x) { return quantity(x); } inline constexpr auto meters(double x) { return quantity(x); } inline constexpr auto kilometers(double x) { return quantity(x); } inline constexpr auto megameters(double x) { return quantity(x); } inline constexpr auto gigameters(double x) { return quantity(x); } inline constexpr auto lightseconds(double x) { return quantity(x); } inline constexpr auto astronomicalunits(double x) { return quantity(x); } // ----- time ----- inline constexpr auto picoseconds(double x) { return quantity(x); } inline constexpr auto nanoseconds(double x) { return quantity(x); } inline constexpr auto microseconds(double x) { return quantity(x); } inline constexpr auto milliseconds(double x) { return quantity(x); } inline constexpr auto seconds(double x) { return quantity(x); } inline constexpr auto minutes(double x) { return quantity(x); } inline constexpr auto hours(double x) { return quantity(x); } inline constexpr auto days(double x) { return quantity(x); } inline constexpr auto weeks(double x) { return quantity(x); } inline constexpr auto months(double x) { return quantity(x); } inline constexpr auto years(double x) { return quantity(x); } inline constexpr auto year250s(double x) { return quantity(x); } inline constexpr auto year360s(double x) { return quantity(x); } inline constexpr auto year365s(double x) { return quantity(x); } //inline constexpr auto year366s(double x) { return quantity(x); } } } /*namespace qty*/ } /*namespace xo*/ /** end quantity.hpp **/