25 #ifndef MOTION_CONTROLLER_UNITS_HXX__
26 #define MOTION_CONTROLLER_UNITS_HXX__
28 #include "Exception.hpp"
30 #include <type_traits>
40 template<
class R,
class P>
41 Value operator*(
const Value &value, std::chrono::duration<R, P> duration)
45 case Unit::MILLIMETERS_PER_MINUTE:
49 std::chrono::duration_cast<std::chrono::minutes>(duration).count())};
50 case Unit::METERS_PER_SECOND:
54 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
55 case Unit::MILLIMETERS_PER_SECOND:
59 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
60 case Unit::MILLIMETERS_PER_SECOND_SQUARED:
62 Unit::MILLIMETERS_PER_SECOND,
64 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
65 default:
throw Exception{ErrorCode::IncompatibleUnits};
69 template<
class R,
class P>
70 Value operator/(
const Value &value, std::chrono::duration<R, P> duration)
74 case Unit::MILLIMETERS:
75 if (std::is_same<
typename std::chrono::duration<R, P>::period,
76 std::chrono::minutes::period>::value)
79 Unit::MILLIMETERS_PER_MINUTE,
80 (value.value / duration.count())};
86 Unit::MILLIMETERS_PER_SECOND,
88 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
92 Unit::METERS_PER_SECOND,
94 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
95 case Unit::MILLIMETERS_PER_SECOND:
97 Unit::MILLIMETERS_PER_SECOND_SQUARED,
99 std::chrono::duration_cast<std::chrono::seconds>(duration).count())};
100 default:
throw Exception{ErrorCode::IncompatibleUnits};
108 inline operator bool()
const
110 return (
const_cast<const IOPort &
>(*m_port))[m_offset];
115 m_port->
value |= (value_type(1) << m_offset);
117 m_port->
value &= ~(value_type(1) << m_offset);
121 inline size_type offset()
const {
return m_offset; }
122 bool operator==(
const reference &ref)
const
124 return m_offset == ref.m_offset && m_port == ref.m_port;
126 bool operator!=(
const reference &ref)
const {
return !(ref == *
this); }
130 m_offset{offset}, m_port{port} {};
146 m_offset{ref.m_offset}, m_port{ref.m_port} {};
149 inline operator bool()
const {
return (*m_port)[m_offset]; }
150 inline size_type offset()
const {
return m_offset; }
153 return m_offset == ref.m_offset && m_port == ref.m_port;
155 bool operator!=(
const reference &ref)
const {
return !(ref == *
this); }
159 m_offset{offset}, m_port{port} {};
172 reference *operator->() {
return &_ref; }
173 bool operator==(
const iterator &it)
const {
return _ref == it._ref; }
174 bool operator!=(
const iterator &it)
const {
return _ref != it._ref; }
212 bool operator==(
const const_iterator &it)
const {
return it._ref == _ref; }
213 bool operator!=(
const const_iterator &it)
const {
return it._ref != _ref; }
247 inline IOPort::const_iterator IOPort::end()
const
249 return const_iterator{const_reference{
size,
this}};
252 inline IOPort::const_iterator IOPort::const_begin()
const
257 inline IOPort::const_iterator IOPort::const_end()
const
262 inline IOPort::iterator IOPort::begin()
264 return iterator{reference{0,
this}};
267 inline IOPort::iterator IOPort::end()
269 return iterator{reference{
size,
this}};
280 struct hash<
smc::units::Unit>
282 size_t operator()(
const smc::units::Unit &x)
const
284 using type =
typename std::underlying_type<smc::units::Unit>::type;
285 return std::hash<type>()(
static_cast<type
>(x));
main motion-lib namespace
value_type value
port value
size_type size
size in bits