srdhelper: Add SrdIntEnum with various helper methods.
authorUwe Hermann <uwe@hermann-uwe.de>
Wed, 1 Jan 2020 17:59:13 +0000 (18:59 +0100)
committerUwe Hermann <uwe@hermann-uwe.de>
Fri, 10 Jan 2020 17:55:24 +0000 (18:55 +0100)
decoders/common/srdhelper/mod.py

index e37345a0b34f1a416c5c6b407cc746ad9b80ae4c..e1fac3df97c7b03e7866181bb48a1baf0ba0c18f 100644 (file)
@@ -17,6 +17,9 @@
 ## along with this program; if not, see <http://www.gnu.org/licenses/>.
 ##
 
+from enum import IntEnum, unique
+from itertools import chain
+
 # Return the specified BCD number (max. 8 bits) as integer.
 def bcd2int(b):
     return (b & 0x0f) + ((b >> 4) * 10)
@@ -34,3 +37,35 @@ def bitunpack(num, minbits=0):
         num >>= 1
         minbits -= 1
     return tuple(res)
+
+@unique
+class SrdIntEnum(IntEnum):
+    @classmethod
+    def _prefix(cls, p):
+        return tuple([a.value for a in cls if a.name.startswith(p)])
+
+    @classmethod
+    def prefixes(cls, prefix_list):
+        if isinstance(prefix_list, str):
+            prefix_list = prefix_list.split()
+        return tuple(chain(*[cls._prefix(p) for p in prefix_list]))
+
+    @classmethod
+    def _suffix(cls, s):
+        return tuple([a.value for a in cls if a.name.endswith(s)])
+
+    @classmethod
+    def suffixes(cls, suffix_list):
+        if isinstance(suffix_list, str):
+            suffix_list = suffix_list.split()
+        return tuple(chain(*[cls._suffix(s) for s in suffix_list]))
+
+    @classmethod
+    def from_list(cls, name, l):
+        # Manually construct (Python 3.4 is missing the 'start' argument).
+        # Python defaults to start=1, but we want start=0.
+        return cls(name, [(l[i], i) for i in range(len(l))])
+
+    @classmethod
+    def from_str(cls, name, s):
+        return cls.from_list(name, s.split())