Extended MaximInterface

Dependents:   mbed_DS28EC20_GPIO

Committer:
reARMnimator
Date:
Mon Jan 06 15:54:55 2020 +0000
Revision:
10:de4b8812877d
Parent:
7:471901a04573
Fixed inappropriate include path.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
IanBenzMaxim 0:f77ad7f72d04 1 /*******************************************************************************
IanBenzMaxim 0:f77ad7f72d04 2 * Copyright (C) 2017 Maxim Integrated Products, Inc., All Rights Reserved.
IanBenzMaxim 0:f77ad7f72d04 3 *
IanBenzMaxim 0:f77ad7f72d04 4 * Permission is hereby granted, free of charge, to any person obtaining a
IanBenzMaxim 0:f77ad7f72d04 5 * copy of this software and associated documentation files (the "Software"),
IanBenzMaxim 0:f77ad7f72d04 6 * to deal in the Software without restriction, including without limitation
IanBenzMaxim 0:f77ad7f72d04 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
IanBenzMaxim 0:f77ad7f72d04 8 * and/or sell copies of the Software, and to permit persons to whom the
IanBenzMaxim 0:f77ad7f72d04 9 * Software is furnished to do so, subject to the following conditions:
IanBenzMaxim 0:f77ad7f72d04 10 *
IanBenzMaxim 0:f77ad7f72d04 11 * The above copyright notice and this permission notice shall be included
IanBenzMaxim 0:f77ad7f72d04 12 * in all copies or substantial portions of the Software.
IanBenzMaxim 0:f77ad7f72d04 13 *
IanBenzMaxim 0:f77ad7f72d04 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
IanBenzMaxim 0:f77ad7f72d04 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
IanBenzMaxim 0:f77ad7f72d04 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IanBenzMaxim 0:f77ad7f72d04 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
IanBenzMaxim 0:f77ad7f72d04 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
IanBenzMaxim 0:f77ad7f72d04 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
IanBenzMaxim 0:f77ad7f72d04 20 * OTHER DEALINGS IN THE SOFTWARE.
IanBenzMaxim 0:f77ad7f72d04 21 *
IanBenzMaxim 0:f77ad7f72d04 22 * Except as contained in this notice, the name of Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
IanBenzMaxim 0:f77ad7f72d04 24 * Products, Inc. Branding Policy.
IanBenzMaxim 0:f77ad7f72d04 25 *
IanBenzMaxim 0:f77ad7f72d04 26 * The mere transfer of this software does not imply any licenses
IanBenzMaxim 0:f77ad7f72d04 27 * of trade secrets, proprietary technology, copyrights, patents,
IanBenzMaxim 0:f77ad7f72d04 28 * trademarks, maskwork rights, or any other form of intellectual
IanBenzMaxim 0:f77ad7f72d04 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
IanBenzMaxim 0:f77ad7f72d04 30 * ownership rights.
IanBenzMaxim 0:f77ad7f72d04 31 *******************************************************************************/
IanBenzMaxim 0:f77ad7f72d04 32
IanBenzMaxim 0:f77ad7f72d04 33 #ifndef MaximInterface_FlagSet
IanBenzMaxim 0:f77ad7f72d04 34 #define MaximInterface_FlagSet
IanBenzMaxim 0:f77ad7f72d04 35
IanBenzMaxim 0:f77ad7f72d04 36 #include <stddef.h>
IanBenzMaxim 0:f77ad7f72d04 37 #include <bitset>
IanBenzMaxim 0:f77ad7f72d04 38
IanBenzMaxim 0:f77ad7f72d04 39 namespace MaximInterface {
IanBenzMaxim 0:f77ad7f72d04 40
IanBenzMaxim 7:471901a04573 41 /// @brief
IanBenzMaxim 0:f77ad7f72d04 42 /// Provides functionality similar to std::bitset except using a bit flag,
IanBenzMaxim 0:f77ad7f72d04 43 /// typically of an enum type, as the indexer.
IanBenzMaxim 0:f77ad7f72d04 44 template <typename Flag, size_t flagBits> class FlagSet {
IanBenzMaxim 0:f77ad7f72d04 45 public:
IanBenzMaxim 0:f77ad7f72d04 46 class reference {
IanBenzMaxim 0:f77ad7f72d04 47 public:
IanBenzMaxim 0:f77ad7f72d04 48 reference(FlagSet & flagSet, Flag flag) : flagSet(&flagSet), flag(flag) {}
IanBenzMaxim 6:a8c83a2e6fa4 49
IanBenzMaxim 0:f77ad7f72d04 50 reference & operator=(bool x) {
IanBenzMaxim 0:f77ad7f72d04 51 flagSet->set(flag, x);
IanBenzMaxim 0:f77ad7f72d04 52 return *this;
IanBenzMaxim 0:f77ad7f72d04 53 }
IanBenzMaxim 6:a8c83a2e6fa4 54
IanBenzMaxim 0:f77ad7f72d04 55 reference & operator=(const reference & x) {
IanBenzMaxim 0:f77ad7f72d04 56 return operator=(static_cast<bool>(x));
IanBenzMaxim 0:f77ad7f72d04 57 }
IanBenzMaxim 6:a8c83a2e6fa4 58
IanBenzMaxim 0:f77ad7f72d04 59 operator bool() const { return flagSet->test(flag); }
IanBenzMaxim 6:a8c83a2e6fa4 60
IanBenzMaxim 0:f77ad7f72d04 61 bool operator~() const { return reference(*this).flip(); }
IanBenzMaxim 6:a8c83a2e6fa4 62
IanBenzMaxim 0:f77ad7f72d04 63 reference & flip() {
IanBenzMaxim 0:f77ad7f72d04 64 *this = !*this;
IanBenzMaxim 0:f77ad7f72d04 65 return *this;
IanBenzMaxim 0:f77ad7f72d04 66 }
IanBenzMaxim 0:f77ad7f72d04 67
IanBenzMaxim 0:f77ad7f72d04 68 private:
IanBenzMaxim 0:f77ad7f72d04 69 FlagSet * flagSet;
IanBenzMaxim 0:f77ad7f72d04 70 Flag flag;
IanBenzMaxim 0:f77ad7f72d04 71 };
IanBenzMaxim 0:f77ad7f72d04 72
IanBenzMaxim 0:f77ad7f72d04 73 FlagSet() : bits() {}
IanBenzMaxim 6:a8c83a2e6fa4 74
IanBenzMaxim 0:f77ad7f72d04 75 FlagSet(unsigned long val) : bits(val) {}
IanBenzMaxim 0:f77ad7f72d04 76
IanBenzMaxim 0:f77ad7f72d04 77 template <typename CharT, typename Traits, typename Alloc>
IanBenzMaxim 0:f77ad7f72d04 78 explicit FlagSet(
IanBenzMaxim 0:f77ad7f72d04 79 const std::basic_string<CharT, Traits, Alloc> & str,
IanBenzMaxim 0:f77ad7f72d04 80 typename std::basic_string<CharT, Traits, Alloc>::size_type pos = 0,
IanBenzMaxim 0:f77ad7f72d04 81 typename std::basic_string<CharT, Traits, Alloc>::size_type n =
IanBenzMaxim 0:f77ad7f72d04 82 std::basic_string<CharT, Traits, Alloc>::npos)
IanBenzMaxim 0:f77ad7f72d04 83 : bits(str, pos, n) {}
IanBenzMaxim 0:f77ad7f72d04 84
IanBenzMaxim 0:f77ad7f72d04 85 bool operator==(const FlagSet & rhs) const { return bits == rhs.bits; }
IanBenzMaxim 6:a8c83a2e6fa4 86
IanBenzMaxim 0:f77ad7f72d04 87 bool operator!=(const FlagSet & rhs) const { return !operator==(rhs); }
IanBenzMaxim 0:f77ad7f72d04 88
IanBenzMaxim 6:a8c83a2e6fa4 89 /// @name Element access
IanBenzMaxim 6:a8c83a2e6fa4 90 /// @{
IanBenzMaxim 7:471901a04573 91
IanBenzMaxim 0:f77ad7f72d04 92 bool operator[](Flag flag) const { return test(flag); }
IanBenzMaxim 6:a8c83a2e6fa4 93
IanBenzMaxim 0:f77ad7f72d04 94 reference operator[](Flag flag) { return reference(*this, flag); }
IanBenzMaxim 6:a8c83a2e6fa4 95
IanBenzMaxim 0:f77ad7f72d04 96 bool test(Flag flag) const { return (bits.to_ulong() & flag) == flag; }
IanBenzMaxim 6:a8c83a2e6fa4 97
IanBenzMaxim 0:f77ad7f72d04 98 bool any() const { return bits.any(); }
IanBenzMaxim 6:a8c83a2e6fa4 99
IanBenzMaxim 0:f77ad7f72d04 100 bool none() const { return bits.none(); }
IanBenzMaxim 6:a8c83a2e6fa4 101
IanBenzMaxim 0:f77ad7f72d04 102 size_t count() const { return bits.count(); }
IanBenzMaxim 7:471901a04573 103
IanBenzMaxim 6:a8c83a2e6fa4 104 /// @}
IanBenzMaxim 0:f77ad7f72d04 105
IanBenzMaxim 6:a8c83a2e6fa4 106 /// @name Capacity
IanBenzMaxim 6:a8c83a2e6fa4 107 /// @{
IanBenzMaxim 7:471901a04573 108
IanBenzMaxim 0:f77ad7f72d04 109 size_t size() const { return bits.size(); }
IanBenzMaxim 7:471901a04573 110
IanBenzMaxim 6:a8c83a2e6fa4 111 /// @}
IanBenzMaxim 0:f77ad7f72d04 112
IanBenzMaxim 6:a8c83a2e6fa4 113 /// @name Modifiers
IanBenzMaxim 6:a8c83a2e6fa4 114 /// @{
IanBenzMaxim 7:471901a04573 115
IanBenzMaxim 0:f77ad7f72d04 116 FlagSet & operator&=(const FlagSet & other) {
IanBenzMaxim 0:f77ad7f72d04 117 bits &= other.bits;
IanBenzMaxim 0:f77ad7f72d04 118 return *this;
IanBenzMaxim 0:f77ad7f72d04 119 }
IanBenzMaxim 6:a8c83a2e6fa4 120
IanBenzMaxim 0:f77ad7f72d04 121 FlagSet & operator|=(const FlagSet & other) {
IanBenzMaxim 0:f77ad7f72d04 122 bits |= other.bits;
IanBenzMaxim 0:f77ad7f72d04 123 return *this;
IanBenzMaxim 0:f77ad7f72d04 124 }
IanBenzMaxim 6:a8c83a2e6fa4 125
IanBenzMaxim 0:f77ad7f72d04 126 FlagSet & operator^=(const FlagSet & other) {
IanBenzMaxim 0:f77ad7f72d04 127 bits ^= other.bits;
IanBenzMaxim 0:f77ad7f72d04 128 return *this;
IanBenzMaxim 0:f77ad7f72d04 129 }
IanBenzMaxim 6:a8c83a2e6fa4 130
IanBenzMaxim 0:f77ad7f72d04 131 FlagSet operator~() const { return ~bits; }
IanBenzMaxim 0:f77ad7f72d04 132
IanBenzMaxim 0:f77ad7f72d04 133 FlagSet & set() {
IanBenzMaxim 0:f77ad7f72d04 134 bits.set();
IanBenzMaxim 0:f77ad7f72d04 135 return *this;
IanBenzMaxim 0:f77ad7f72d04 136 }
IanBenzMaxim 6:a8c83a2e6fa4 137
IanBenzMaxim 0:f77ad7f72d04 138 FlagSet & set(Flag flag, bool value = true) {
IanBenzMaxim 0:f77ad7f72d04 139 if (value) {
IanBenzMaxim 0:f77ad7f72d04 140 bits |= flag;
IanBenzMaxim 0:f77ad7f72d04 141 } else {
IanBenzMaxim 0:f77ad7f72d04 142 bits &= ~std::bitset<flagBits>(flag);
IanBenzMaxim 0:f77ad7f72d04 143 }
IanBenzMaxim 0:f77ad7f72d04 144 return *this;
IanBenzMaxim 0:f77ad7f72d04 145 }
IanBenzMaxim 6:a8c83a2e6fa4 146
IanBenzMaxim 0:f77ad7f72d04 147 FlagSet & reset() {
IanBenzMaxim 0:f77ad7f72d04 148 bits.reset();
IanBenzMaxim 0:f77ad7f72d04 149 return *this;
IanBenzMaxim 0:f77ad7f72d04 150 }
IanBenzMaxim 6:a8c83a2e6fa4 151
IanBenzMaxim 0:f77ad7f72d04 152 FlagSet & reset(Flag flag) { return set(flag, false); }
IanBenzMaxim 6:a8c83a2e6fa4 153
IanBenzMaxim 0:f77ad7f72d04 154 FlagSet & flip() {
IanBenzMaxim 0:f77ad7f72d04 155 bits.flip();
IanBenzMaxim 0:f77ad7f72d04 156 return *this;
IanBenzMaxim 0:f77ad7f72d04 157 }
IanBenzMaxim 6:a8c83a2e6fa4 158
IanBenzMaxim 0:f77ad7f72d04 159 FlagSet & flip(Flag flag) {
IanBenzMaxim 0:f77ad7f72d04 160 bits ^= flag;
IanBenzMaxim 0:f77ad7f72d04 161 return *this;
IanBenzMaxim 0:f77ad7f72d04 162 }
IanBenzMaxim 7:471901a04573 163
IanBenzMaxim 6:a8c83a2e6fa4 164 /// @}
IanBenzMaxim 0:f77ad7f72d04 165
IanBenzMaxim 6:a8c83a2e6fa4 166 /// @name Conversions
IanBenzMaxim 6:a8c83a2e6fa4 167 /// @{
IanBenzMaxim 7:471901a04573 168
IanBenzMaxim 0:f77ad7f72d04 169 template <typename CharT, typename Traits, typename Allocator>
IanBenzMaxim 0:f77ad7f72d04 170 std::basic_string<CharT, Traits, Allocator> to_string() const {
IanBenzMaxim 0:f77ad7f72d04 171 return bits.template to_string<CharT, Traits, Allocator>();
IanBenzMaxim 0:f77ad7f72d04 172 }
IanBenzMaxim 6:a8c83a2e6fa4 173
IanBenzMaxim 0:f77ad7f72d04 174 unsigned long to_ulong() const { return bits.to_ulong(); }
IanBenzMaxim 7:471901a04573 175
IanBenzMaxim 6:a8c83a2e6fa4 176 /// @}
IanBenzMaxim 0:f77ad7f72d04 177
IanBenzMaxim 0:f77ad7f72d04 178 private:
IanBenzMaxim 0:f77ad7f72d04 179 std::bitset<flagBits> bits;
IanBenzMaxim 0:f77ad7f72d04 180
IanBenzMaxim 0:f77ad7f72d04 181 template <typename CharT, typename Traits>
IanBenzMaxim 0:f77ad7f72d04 182 friend std::basic_ostream<CharT, Traits> &
IanBenzMaxim 0:f77ad7f72d04 183 operator<<(std::basic_ostream<CharT, Traits> & os, const FlagSet & x);
IanBenzMaxim 0:f77ad7f72d04 184
IanBenzMaxim 0:f77ad7f72d04 185 template <typename CharT, class Traits>
IanBenzMaxim 0:f77ad7f72d04 186 friend std::basic_istream<CharT, Traits> &
IanBenzMaxim 0:f77ad7f72d04 187 operator>>(std::basic_istream<CharT, Traits> & is, FlagSet & x);
IanBenzMaxim 0:f77ad7f72d04 188 };
IanBenzMaxim 0:f77ad7f72d04 189
IanBenzMaxim 0:f77ad7f72d04 190 template <typename Flag, size_t flagBits>
IanBenzMaxim 0:f77ad7f72d04 191 FlagSet<Flag, flagBits> operator&(const FlagSet<Flag, flagBits> & lhs,
IanBenzMaxim 0:f77ad7f72d04 192 const FlagSet<Flag, flagBits> & rhs) {
IanBenzMaxim 0:f77ad7f72d04 193 return FlagSet<Flag, flagBits>(lhs) &= rhs;
IanBenzMaxim 0:f77ad7f72d04 194 }
IanBenzMaxim 0:f77ad7f72d04 195
IanBenzMaxim 0:f77ad7f72d04 196 template <typename Flag, size_t flagBits>
IanBenzMaxim 0:f77ad7f72d04 197 FlagSet<Flag, flagBits> operator|(const FlagSet<Flag, flagBits> & lhs,
IanBenzMaxim 0:f77ad7f72d04 198 const FlagSet<Flag, flagBits> & rhs) {
IanBenzMaxim 0:f77ad7f72d04 199 return FlagSet<Flag, flagBits>(lhs) |= rhs;
IanBenzMaxim 0:f77ad7f72d04 200 }
IanBenzMaxim 0:f77ad7f72d04 201
IanBenzMaxim 0:f77ad7f72d04 202 template <typename Flag, size_t flagBits>
IanBenzMaxim 0:f77ad7f72d04 203 FlagSet<Flag, flagBits> operator^(const FlagSet<Flag, flagBits> & lhs,
IanBenzMaxim 0:f77ad7f72d04 204 const FlagSet<Flag, flagBits> & rhs) {
IanBenzMaxim 0:f77ad7f72d04 205 return FlagSet<Flag, flagBits>(lhs) ^= rhs;
IanBenzMaxim 0:f77ad7f72d04 206 }
IanBenzMaxim 0:f77ad7f72d04 207
IanBenzMaxim 0:f77ad7f72d04 208 template <typename CharT, typename Traits, typename Flag, size_t flagBits>
IanBenzMaxim 0:f77ad7f72d04 209 std::basic_ostream<CharT, Traits> &
IanBenzMaxim 0:f77ad7f72d04 210 operator<<(std::basic_ostream<CharT, Traits> & os,
IanBenzMaxim 0:f77ad7f72d04 211 const FlagSet<Flag, flagBits> & x) {
IanBenzMaxim 0:f77ad7f72d04 212 os << x.bits;
IanBenzMaxim 0:f77ad7f72d04 213 return os;
IanBenzMaxim 0:f77ad7f72d04 214 }
IanBenzMaxim 0:f77ad7f72d04 215
IanBenzMaxim 0:f77ad7f72d04 216 template <typename CharT, class Traits, typename Flag, size_t flagBits>
IanBenzMaxim 0:f77ad7f72d04 217 std::basic_istream<CharT, Traits> &
IanBenzMaxim 0:f77ad7f72d04 218 operator>>(std::basic_istream<CharT, Traits> & is,
IanBenzMaxim 0:f77ad7f72d04 219 FlagSet<Flag, flagBits> & x) {
IanBenzMaxim 0:f77ad7f72d04 220 is >> x.bits;
IanBenzMaxim 0:f77ad7f72d04 221 return is;
IanBenzMaxim 0:f77ad7f72d04 222 }
IanBenzMaxim 0:f77ad7f72d04 223
IanBenzMaxim 0:f77ad7f72d04 224 } // namespace MaximInterface
IanBenzMaxim 0:f77ad7f72d04 225
IanBenzMaxim 6:a8c83a2e6fa4 226 #endif