Line data Source code
1 : /* ✔ */ 2 : 3 : #pragma once 4 : 5 : #include <AH/Arduino-Wrapper.h> // Print 6 : #include <Settings/NamespaceSettings.hpp> 7 : 8 : BEGIN_CS_NAMESPACE 9 : 10 : /** 11 : * A type-safe class for MIDI USB Cable numbers. 12 : */ 13 : class Cable { 14 : public: 15 : /** 16 : * @brief Create a MIDI Cable object. 17 : * 18 : * @param zeroBasedCable 19 : * The zero-based cable (0 is the first cable). 20 : */ 21 746 : explicit constexpr Cable(uint8_t zeroBasedCable) 22 746 : : zeroBasedCable(zeroBasedCable) {} 23 : 24 : /** 25 : * @brief Get the cable as an integer. 26 : * 27 : * @return The zero-based cable (0 is the first cable). 28 : */ 29 1296 : constexpr uint8_t getRaw() const { return zeroBasedCable; } 30 : 31 : /** 32 : * @brief Get the cable as an integer. 33 : * 34 : * @return The one-based cable (1 is the first cable). 35 : */ 36 17 : constexpr uint8_t getOneBased() const { return zeroBasedCable + 1; } 37 : 38 : /** 39 : * @brief Create a cable. 40 : * 41 : * @param oneBasedCable 42 : * The cable number (1 is the first cable). 43 : */ 44 : static constexpr Cable createCable(uint8_t oneBasedCable) { 45 : return Cable {static_cast<uint8_t>(oneBasedCable - 1)}; 46 : } 47 : 48 : /** 49 : * @brief Check if two cables are the same. 50 : * 51 : * @param rhs 52 : * The other cable to compare this cable to. 53 : */ 54 318 : constexpr bool operator==(const Cable &rhs) const { 55 318 : return this->zeroBasedCable == rhs.zeroBasedCable; 56 : } 57 : 58 : /** 59 : * @brief Check if two cables are the different. 60 : * 61 : * @param rhs 62 : * The other cable to compare this cable to. 63 : */ 64 33 : constexpr bool operator!=(const Cable &rhs) const { 65 33 : return this->zeroBasedCable != rhs.zeroBasedCable; 66 : } 67 : 68 : /** 69 : * @brief Add an offset. 70 : * 71 : * @param rhs 72 : * The offset to add to this cable. 73 : */ 74 : Cable &operator+=(uint8_t rhs) { 75 : this->zeroBasedCable += rhs; 76 : return *this; 77 : } 78 : 79 : /** 80 : * @brief Add an offset to a cable. 81 : * 82 : * @param rhs 83 : * The offset to add to the cable. 84 : */ 85 : Cable operator+(uint8_t rhs) const { 86 : Cable copy = *this; 87 : copy += rhs; 88 : return copy; 89 : } 90 : 91 : /** 92 : * @brief Subtract an offset. 93 : * 94 : * @param rhs 95 : * The offset to subtract from this cable. 96 : */ 97 : Cable &operator-=(uint8_t rhs) { 98 : this->zeroBasedCable -= rhs; 99 : return *this; 100 : } 101 : 102 : /** 103 : * @brief Subtract an offset from a cable. 104 : * 105 : * @param rhs 106 : * The offset to subtract from the cable. 107 : */ 108 : Cable operator-(uint8_t rhs) const { 109 : Cable copy = *this; 110 : copy -= rhs; 111 : return copy; 112 : } 113 : 114 : private: 115 : uint8_t zeroBasedCable : 4; 116 : }; 117 : 118 : constexpr Cable Cable_1 = Cable::createCable(1); 119 : constexpr Cable Cable_2 = Cable::createCable(2); 120 : constexpr Cable Cable_3 = Cable::createCable(3); 121 : constexpr Cable Cable_4 = Cable::createCable(4); 122 : constexpr Cable Cable_5 = Cable::createCable(5); 123 : constexpr Cable Cable_6 = Cable::createCable(6); 124 : constexpr Cable Cable_7 = Cable::createCable(7); 125 : constexpr Cable Cable_8 = Cable::createCable(8); 126 : constexpr Cable Cable_9 = Cable::createCable(9); 127 : constexpr Cable Cable_10 = Cable::createCable(10); 128 : constexpr Cable Cable_11 = Cable::createCable(11); 129 : constexpr Cable Cable_12 = Cable::createCable(12); 130 : constexpr Cable Cable_13 = Cable::createCable(13); 131 : constexpr Cable Cable_14 = Cable::createCable(14); 132 : constexpr Cable Cable_15 = Cable::createCable(15); 133 : constexpr Cable Cable_16 = Cable::createCable(16); 134 : 135 : constexpr Cable CABLE_1 CS_DEPREC("Use Cable_1 instead") = Cable_1; 136 : constexpr Cable CABLE_2 CS_DEPREC("Use Cable_2 instead") = Cable_2; 137 : constexpr Cable CABLE_3 CS_DEPREC("Use Cable_3 instead") = Cable_3; 138 : constexpr Cable CABLE_4 CS_DEPREC("Use Cable_4 instead") = Cable_4; 139 : constexpr Cable CABLE_5 CS_DEPREC("Use Cable_5 instead") = Cable_5; 140 : constexpr Cable CABLE_6 CS_DEPREC("Use Cable_6 instead") = Cable_6; 141 : constexpr Cable CABLE_7 CS_DEPREC("Use Cable_7 instead") = Cable_7; 142 : constexpr Cable CABLE_8 CS_DEPREC("Use Cable_8 instead") = Cable_8; 143 : constexpr Cable CABLE_9 CS_DEPREC("Use Cable_9 instead") = Cable_9; 144 : constexpr Cable CABLE_10 CS_DEPREC("Use Cable_10 instead") = Cable_10; 145 : constexpr Cable CABLE_11 CS_DEPREC("Use Cable_11 instead") = Cable_11; 146 : constexpr Cable CABLE_12 CS_DEPREC("Use Cable_12 instead") = Cable_12; 147 : constexpr Cable CABLE_13 CS_DEPREC("Use Cable_13 instead") = Cable_13; 148 : constexpr Cable CABLE_14 CS_DEPREC("Use Cable_14 instead") = Cable_14; 149 : constexpr Cable CABLE_15 CS_DEPREC("Use Cable_15 instead") = Cable_15; 150 : constexpr Cable CABLE_16 CS_DEPREC("Use Cable_16 instead") = Cable_16; 151 : 152 : Print &operator<<(Print &, Cable); 153 : 154 : END_CS_NAMESPACE