#pragma once #include #include #include #include #include BEGIN_AH_NAMESPACE using analog_t = uint16_t; using pin_int_t = uint_fast16_t; constexpr pin_int_t NO_PIN_INT = (std::numeric_limits::max() >> 1) + 1; namespace ExtIO { struct pin_t { constexpr pin_t() = default; constexpr pin_t(pin_int_t pin) : pin(pin) {} pin_int_t pin = NO_PIN_INT; static_assert(std::is_unsigned::value, "Error: pin_t should be an unsigned integer type"); pin_t &operator+=(pin_int_t b) { this->pin += b; return *this; } pin_t &operator++() { ++pin; return *this; } pin_t operator++(int) { pin_t t = *this; ++pin; return t; } pin_t &operator-=(pin_int_t b) { this->pin -= b; return *this; } pin_t &operator--() { --pin; return *this; } pin_t operator--(int) { pin_t t = *this; --pin; return t; } }; constexpr inline bool operator==(pin_t a, pin_t b) { return a.pin == b.pin; } constexpr inline bool operator<(pin_t a, pin_t b) { return a.pin < b.pin; } constexpr inline bool operator<=(pin_t a, pin_t b) { return a.pin <= b.pin; } constexpr inline bool operator>(pin_t a, pin_t b) { return a.pin > b.pin; } constexpr inline bool operator>=(pin_t a, pin_t b) { return a.pin >= b.pin; } constexpr inline bool operator!=(pin_t a, pin_t b) { return !(a == b); } constexpr inline pin_int_t operator-(pin_t a, pin_t b) { return a.pin - b.pin; } constexpr inline pin_t operator-(pin_t a, pin_int_t b) { return a.pin - b; } constexpr inline pin_t operator+(pin_t a, pin_int_t b) { return a.pin + b; } constexpr inline pin_t operator+(pin_int_t a, pin_t b) { return a + b.pin; } constexpr inline pin_t operator*(pin_t a, pin_int_t b) { return a.pin * b; } constexpr inline pin_t operator*(pin_int_t a, pin_t b) { return a * b.pin; } inline Print &operator<<(Print &os, pin_t p) { using AH::operator<<; return os << +p.pin; } #ifndef ARDUINO inline std::ostream &operator<<(std::ostream &os, pin_t p) { return os << +p.pin; } #endif } // namespace ExtIO using ExtIO::pin_t; #ifdef NO_PIN #undef NO_PIN #endif constexpr pin_t NO_PIN {}; template using PinList = Array; END_AH_NAMESPACE