.. _program_listing_file_src_LouLib_Units_UnitMath.hpp: Program Listing for File UnitMath.hpp ===================================== |exhale_lsh| :ref:`Return to documentation for file ` (``src/LouLib/Units/UnitMath.hpp``) .. |exhale_lsh| unicode:: U+021B0 .. UPWARDS ARROW WITH TIP LEFTWARDS .. code-block:: cpp #ifndef LOULIB_UNITMATH_HPP #define LOULIB_UNITMATH_HPP #include "BaseUnit.hpp" #include namespace LouLib{ namespace Units{ //Standard arithmetic operators template constexpr BaseUnit operator+( const BaseUnit& a, const BaseUnit& b ){ return BaseUnit(a.val() + b.val()); } template constexpr BaseUnit operator-( const BaseUnit& a, const BaseUnit& b ){ return BaseUnit(a.val() - b.val()); } template constexpr BaseUnit, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add> operator *( const BaseUnit& a, const BaseUnit& b ){ return BaseUnit, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add, std::ratio_add>(a.val() * b.val()); } template constexpr BaseUnit, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract> operator /( const BaseUnit& a, const BaseUnit& b ){ return BaseUnit, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract, std::ratio_subtract>(a.val() / b.val()); } template constexpr BaseUnit operator*( const double& a, const BaseUnit& b ){ return BaseUnit(a * b.val()); } template constexpr BaseUnit operator*( const BaseUnit& a, const double& b ){ return BaseUnit(b * a.val()); } template constexpr BaseUnit operator/( const BaseUnit& a, const double& b ){ return BaseUnit(a.val() / b); } template constexpr BaseUnit, L>, std::ratio_subtract, M>, std::ratio_subtract, t>, std::ratio_subtract, Q>, std::ratio_subtract, T>, std::ratio_subtract, N>, std::ratio_subtract, J>, std::ratio_subtract, A>> operator /( const double& a, const BaseUnit& b ){ return BaseUnit, L>, std::ratio_subtract, M>, std::ratio_subtract, t>, std::ratio_subtract, Q>, std::ratio_subtract, T>, std::ratio_subtract, N>, std::ratio_subtract, J>, std::ratio_subtract, A>>(a / b.val()); } template constexpr BaseUnit operator%( const BaseUnit& a, const BaseUnit& b ){ return BaseUnit(std::fmod(a.val(), b.val())); } //Comparison operators template constexpr bool operator==( const BaseUnit& a, const BaseUnit& b ){ return a.val() == b.val(); } template constexpr bool operator!=( const BaseUnit& a, const BaseUnit& b ){ return a.val() != b.val(); } template constexpr bool operator>( const BaseUnit& a, const BaseUnit& b ){ return a.val() > b.val(); } template constexpr bool operator<( const BaseUnit& a, const BaseUnit& b ){ return a.val() < b.val(); } template constexpr bool operator>=( const BaseUnit& a, const BaseUnit& b ){ return a.val() >= b.val(); } template constexpr bool operator<=( const BaseUnit& a, const BaseUnit& b ){ return a.val() <= b.val(); } //Other math operators template constexpr BaseUnit abs( BaseUnit& a ){ return BaseUnit(std::abs(a.val())); } template constexpr BaseUnit>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>> sqrt( BaseUnit& a ){ return BaseUnit>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>, std::ratio_divide>>(std::sqrt(a.val())); } template constexpr BaseUnit>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>> square( BaseUnit& a ){ return BaseUnit>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>, std::ratio_multiply>>(a.val() * a.val()); } template constexpr int signum(const BaseUnit& a){ if(a.val() == 0) return 0; return a.val() > 0 ? 1 : -1; } } } #endif //LOULIB_UNITMATH_HPP