34 #ifndef ASTROTYPES_UNITS_TIME_H
35 #define ASTROTYPES_UNITS_TIME_H
38 namespace astrotypes {
42 typedef boost::units::time_dimension
Time ;
47 typedef ModifiedJulianClock::time_point
MJD ;
48 typedef J2000Clock::time_point
J2000 ;
55 template <
typename TimeUnit,
typename NumericalRep>
58 , typename
std ::enable_if<boost::units::is_unit_of_dimension<TimeUnit, boost::units::time_dimension>::value>::type>
59 :
public boost::units::quantity<TimeUnit, NumericalRep>
61 typedef boost::units::quantity<TimeUnit, NumericalRep> BaseT;
62 typedef std::chrono::duration<NumericalRep, typename boost_unit_to_std_ratio<TimeUnit>::type> chrono_duration;
66 typedef NumericalRep
rep ;
67 typedef typename chrono_duration::period
period ;
76 explicit Quantity (chrono_duration
const & d) : BaseT(d.count()) {}
82 template <
typename UnitType,
typename OtherDataType>
83 explicit Quantity (boost::units::quantity<UnitType, OtherDataType>
const & quantity) : BaseT(quantity) {}
88 operator chrono_duration
const & ()
const {
duration_cast <chrono_duration>(*this); };
89 operator chrono_duration& () {
duration_cast <chrono_duration>(*this); };
95 template <
typename DurationType,
typename PeriodType>
96 explicit Quantity (std::chrono::duration<DurationType, PeriodType>
const & duration)
97 : BaseT(
std ::chrono::
duration_cast <
std ::chrono::duration<DurationType,
std ::ratio<1, 1>>>(duration).count()
103 template <
typename UnitType,
typename OtherDataType>
106 static_cast< BaseT&
> (*this) = BaseT(o);
120 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
121 inline bool operator<(std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
123 return c < pss::astrotypes::units::duration_cast<std::chrono::duration<Rep, Ratio>>(b);
126 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
127 inline bool operator> (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
132 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
133 inline bool operator<=(std::chrono::duration<Rep, Ratio>
const & lhs, boost::units::quantity<Unit, Rep2>
const & rhs){
return !(lhs > rhs); }
135 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
136 inline bool operator>= (std::chrono::duration<Rep, Ratio>
const & lhs, boost::units::quantity<Unit, Rep2>
const & rhs){
return !(lhs < rhs); }
138 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
139 inline bool operator== (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
144 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
145 inline bool operator!= (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
158 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
159 boost::units::quantity<Unit, Rep2>
operator+ (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
164 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
165 boost::units::quantity<Unit, Rep2>
operator- (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
170 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
171 boost::units::quantity<Unit, Rep2>&
operator+= (boost::units::quantity<Unit, Rep2>& b, std::chrono::duration<Rep, Ratio>
const & c)
176 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
177 boost::units::quantity<Unit, Rep2>&
operator-= (boost::units::quantity<Unit, Rep2>& b, std::chrono::duration<Rep, Ratio>
const & c)
183 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
184 auto operator/ (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
185 -> decltype(boost::units::quantity<Unit, Rep2>()/boost::units::quantity<Unit, Rep>())
191 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
192 bool operator<(boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
194 return b < pss::astrotypes::units::duration_cast<boost::units::quantity<Unit, Rep2>>(c);
197 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
198 bool operator> (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
203 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
204 inline bool operator<=(boost::units::quantity<Unit, Rep2>
const & lhs, std::chrono::duration<Rep, Ratio>
const & rhs){
return !(lhs > rhs); }
206 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
207 inline bool operator>= (boost::units::quantity<Unit, Rep2>
const & lhs, std::chrono::duration<Rep, Ratio>
const & rhs){
return !(lhs < rhs); }
209 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
210 bool operator== (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
215 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
216 bool operator!= (boost::units::quantity<Unit, Rep2>
const & b, std::chrono::duration<Rep, Ratio>
const & c)
227 template <
typename Unit,
typename Rep,
typename T2>
228 struct common_type<
boost ::units::quantity<Unit, Rep>, T2> :
public std::common_type<Rep, T2>
231 template <
typename Unit,
typename Rep,
typename T2>
232 struct common_type<T2,
boost ::units::quantity<Unit, Rep>> :
public std::common_type<T2, Rep>
236 template <
typename Ratio,
typename Rep>
237 std::chrono::duration<Rep, Ratio> abs(std::chrono::duration<Rep, Ratio>
const & v) {
238 return std::chrono::duration<Rep, Ratio>(std::abs(v.count()));
244 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
245 std::chrono::duration<Rep, Ratio>
operator+ (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
250 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
251 std::chrono::duration<Rep, Ratio>
operator- (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
256 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
257 std::chrono::duration<Rep, Ratio>&
operator+= (std::chrono::duration<Rep, Ratio>& c, boost::units::quantity<Unit, Rep2>
const & b)
262 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
263 std::chrono::duration<Rep, Ratio>&
operator-= (std::chrono::duration<Rep, Ratio>& c, boost::units::quantity<Unit, Rep2>
const & b)
268 template <
typename Ratio,
typename Rep,
typename Unit,
typename Rep2>
269 auto operator/ (std::chrono::duration<Rep, Ratio>
const & c, boost::units::quantity<Unit, Rep2>
const & b)
270 -> decltype(boost::units::quantity<Unit, Rep>()/boost::units::quantity<Unit, Rep2>())
278 #endif // ASTROTYPES_UNITS_TIME_H
bool operator==(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c)
bool operator>=(boost::units::quantity< Unit, Rep2 > const &lhs, std::chrono::duration< Rep, Ratio > const &rhs)
JulianClock::time_point JulianDate
std::chrono::duration< Rep, Ratio > operator+(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b)
boost::units::time_dimension Time
std::chrono::duration< Rep, Ratio > & operator+=(std::chrono::duration< Rep, Ratio > &c, boost::units::quantity< Unit, Rep2 > const &b)
bool operator>(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b)
bool operator!=(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b)
Quantity(boost::units::quantity< UnitType, OtherDataType > const &quantity)
Conversion from other boost::units::quantity types.
ModifiedJulianClock::time_point MJD
Quantity(std::chrono::duration< DurationType, PeriodType > const &duration)
Conversion from std::chrono::duration types.
auto operator/(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c) -> decltype(boost::units::quantity< Unit, Rep2 >()/boost::units::quantity< Unit, Rep >())
Quantity(chrono_duration const &d)
std::chrono::duration< Rep, Ratio > operator-(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b)
boost::units::quantity< Unit, Rep2 > & operator-=(boost::units::quantity< Unit, Rep2 > &b, std::chrono::duration< Rep, Ratio > const &c)
bool operator>=(std::chrono::duration< Rep, Ratio > const &lhs, boost::units::quantity< Unit, Rep2 > const &rhs)
bool operator>(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c)
boost::units::quantity< Unit, Rep2 > operator-(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c)
bool operator!=(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c)
auto operator/(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b) -> decltype(boost::units::quantity< Unit, Rep >()/boost::units::quantity< Unit, Rep2 >())
constexpr std::enable_if< boost::units::is_quantity< BoostQuantity >::value &&boost::units::is_unit_of_dimension< typename BoostQuantity::unit_type, boost::units::time_dimension >::value &&!is_equivalent< BoostQuantity, std::chrono::duration< ChronoNumericalRep, PeriodType > >::value, BoostQuantity >::type duration_cast(const std::chrono::duration< ChronoNumericalRep, PeriodType > &duration)
Mimic the std::duration_cast to convert to/from boost::units::quantity tyeps.
J2000Clock::time_point J2000
boost::units::quantity< Unit, Rep2 > operator+(boost::units::quantity< Unit, Rep2 > const &b, std::chrono::duration< Rep, Ratio > const &c)
Quantity()
Default empty constructor.
bool operator==(std::chrono::duration< Rep, Ratio > const &c, boost::units::quantity< Unit, Rep2 > const &b)
boost::units::quantity< Unit, Rep2 > & operator+=(boost::units::quantity< Unit, Rep2 > &b, std::chrono::duration< Rep, Ratio > const &c)
chrono_duration::period period
ModifiedJulianClock::time_point ModifiedJulianDate
Quantity & operator=(boost::units::quantity< UnitType, OtherDataType > const &o)
copy ssignment
std::chrono::duration< Rep, Ratio > & operator-=(std::chrono::duration< Rep, Ratio > &c, boost::units::quantity< Unit, Rep2 > const &b)