quantity_cast_impl refactored to use compile time branching rather than concepts

This commit is contained in:
Mateusz Pusz
2019-10-08 21:20:06 +02:00
parent 3f8cee0931
commit 4ba818bb78

View File

@@ -93,19 +93,17 @@ namespace units {
template<typename To, typename CR, typename CRep, bool NumIsOne = false, bool DenIsOne = false> template<typename To, typename CR, typename CRep, bool NumIsOne = false, bool DenIsOne = false>
struct quantity_cast_impl { struct quantity_cast_impl {
template<typename Q> template<typename Q>
requires treat_as_floating_point<CRep>
static constexpr To cast(const Q& q) static constexpr To cast(const Q& q)
{ {
if constexpr(treat_as_floating_point<CRep>) {
return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * (static_cast<CRep>(CR::num) / return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * (static_cast<CRep>(CR::num) /
static_cast<CRep>(CR::den)))); static_cast<CRep>(CR::den))));
} }
template<typename Q> else {
requires !treat_as_floating_point<CRep>
static constexpr To cast(const Q& q)
{
return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * static_cast<CRep>(CR::num) / return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * static_cast<CRep>(CR::num) /
static_cast<CRep>(CR::den))); static_cast<CRep>(CR::den)));
} }
}
}; };
template<typename To, typename CR, typename CRep> template<typename To, typename CR, typename CRep>
@@ -120,17 +118,15 @@ namespace units {
template<typename To, typename CR, typename CRep> template<typename To, typename CR, typename CRep>
struct quantity_cast_impl<To, CR, CRep, true, false> { struct quantity_cast_impl<To, CR, CRep, true, false> {
template<Quantity Q> template<Quantity Q>
requires treat_as_floating_point<CRep>
static constexpr To cast(const Q& q) static constexpr To cast(const Q& q)
{ {
if constexpr(treat_as_floating_point<CRep>) {
return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * (CRep{1} / static_cast<CRep>(CR::den)))); return To(static_cast<To::rep>(static_cast<CRep>(q.count()) * (CRep{1} / static_cast<CRep>(CR::den))));
} }
template<Quantity Q> else {
requires !treat_as_floating_point<CRep>
static constexpr To cast(const Q& q)
{
return To(static_cast<To::rep>(static_cast<CRep>(q.count()) / static_cast<CRep>(CR::den))); return To(static_cast<To::rep>(static_cast<CRep>(q.count()) / static_cast<CRep>(CR::den)));
} }
}
}; };
template<typename To, typename CR, typename CRep> template<typename To, typename CR, typename CRep>