GSL preconditions added (to be replaced with C++20 Contracts)

This commit is contained in:
Mateusz Pusz
2019-04-05 17:46:01 +02:00
parent 15dd7462ec
commit f94a7b92ea
3 changed files with 14 additions and 1 deletions

View File

@ -30,7 +30,10 @@ class UnitsConan(ConanFile):
url = "https://github.com/mpusz/units" url = "https://github.com/mpusz/units"
description = "Physical Units library for C++" description = "Physical Units library for C++"
settings = "os", "compiler", "build_type", "arch" settings = "os", "compiler", "build_type", "arch"
requires = ( "cmcstl2/2019.03.18@mpusz/stable" ) requires = (
"cmcstl2/2019.03.18@mpusz/stable",
"gsl-lite/0.33.0@nonstd-lite/stable"
)
generators = "cmake" generators = "cmake"
def build(self): def build(self):

View File

@ -51,6 +51,7 @@ target_compile_features(units INTERFACE cxx_std_20)
target_link_libraries(units target_link_libraries(units
INTERFACE INTERFACE
CONAN_PKG::cmcstl2 CONAN_PKG::cmcstl2
CONAN_PKG::gsl-lite
) )
target_include_directories(units target_include_directories(units
INTERFACE INTERFACE

View File

@ -24,6 +24,7 @@
#include "unit.h" #include "unit.h"
#include <limits> #include <limits>
#include <gsl/gsl-lite.hpp>
namespace units { namespace units {
@ -262,6 +263,8 @@ namespace units {
constexpr operator/(const Rep1& v, constexpr operator/(const Rep1& v,
const quantity<D, U, Rep2>& q) const quantity<D, U, Rep2>& q)
{ {
Expects(q != std::decay_t<decltype(q)>(0));
using dim = dim_invert_t<D>; using dim = dim_invert_t<D>;
using ret = quantity<dim, upcasting_traits_t<unit<dim, std::ratio<U::ratio::den, U::ratio::num>>>, std::common_type_t<Rep1, Rep2>>; using ret = quantity<dim, upcasting_traits_t<unit<dim, std::ratio<U::ratio::den, U::ratio::num>>>, std::common_type_t<Rep1, Rep2>>;
using den = quantity<D, U, std::common_type_t<Rep1, Rep2>>; using den = quantity<D, U, std::common_type_t<Rep1, Rep2>>;
@ -273,6 +276,8 @@ namespace units {
constexpr operator/(const quantity<D, U, Rep1>& q, constexpr operator/(const quantity<D, U, Rep1>& q,
const Rep2& v) const Rep2& v)
{ {
Expects(v != Rep2{0});
using ret = quantity<D, U, std::common_type_t<Rep1, Rep2>>; using ret = quantity<D, U, std::common_type_t<Rep1, Rep2>>;
return ret(ret(q).count() / v); return ret(ret(q).count() / v);
} }
@ -282,6 +287,8 @@ namespace units {
constexpr operator/(const quantity<D, U1, Rep1>& lhs, constexpr operator/(const quantity<D, U1, Rep1>& lhs,
const quantity<D, U2, Rep2>& rhs) const quantity<D, U2, Rep2>& rhs)
{ {
Expects(rhs != std::decay_t<decltype(rhs)>(0));
using cq = std::common_type_t<quantity<D, U1, Rep1>, quantity<D, U2, Rep2>>; using cq = std::common_type_t<quantity<D, U1, Rep1>, quantity<D, U2, Rep2>>;
return cq(lhs).count() / cq(rhs).count(); return cq(lhs).count() / cq(rhs).count();
} }
@ -292,6 +299,8 @@ namespace units {
constexpr operator/(const quantity<D1, U1, Rep1>& lhs, constexpr operator/(const quantity<D1, U1, Rep1>& lhs,
const quantity<D2, U2, Rep2>& rhs) const quantity<D2, U2, Rep2>& rhs)
{ {
Expects(rhs != std::decay_t<decltype(rhs)>(0));
using dim = dimension_divide_t<D1, D2>; using dim = dimension_divide_t<D1, D2>;
using ret = quantity<dim, upcasting_traits_t<unit<dim, std::ratio_divide<typename U1::ratio, typename U2::ratio>>>, std::common_type_t<Rep1, Rep2>>; using ret = quantity<dim, upcasting_traits_t<unit<dim, std::ratio_divide<typename U1::ratio, typename U2::ratio>>>, std::common_type_t<Rep1, Rep2>>;
return ret(lhs.count() / rhs.count()); return ret(lhs.count() / rhs.count());