Преглед изворни кода

AK+LibIPC: Make all enums codable

If an enum has a supported underlying type we can provide encoding and
decoding for the enum as well.
Timothy пре 4 година
родитељ
комит
e42484bb65
3 измењених фајлова са 25 додато и 0 уклоњено
  1. 4 0
      AK/Concepts.h
  2. 12 0
      Userland/Libraries/LibIPC/Decoder.h
  3. 9 0
      Userland/Libraries/LibIPC/Encoder.h

+ 4 - 0
AK/Concepts.h

@@ -26,6 +26,9 @@ concept Signed = IsSigned<T>;
 template<typename T>
 concept Unsigned = IsUnsigned<T>;
 
+template<typename T>
+concept Enum = IsEnum<T>;
+
 template<typename T, typename U>
 concept SameAs = IsSame<T, U>;
 
@@ -52,6 +55,7 @@ concept IteratorFunction = requires(Func func, Args... args)
 }
 
 using AK::Concepts::Arithmetic;
+using AK::Concepts::Enum;
 using AK::Concepts::FloatingPoint;
 using AK::Concepts::Integral;
 using AK::Concepts::IteratorFunction;

+ 12 - 0
Userland/Libraries/LibIPC/Decoder.h

@@ -6,6 +6,7 @@
 
 #pragma once
 
+#include <AK/Concepts.h>
 #include <AK/Forward.h>
 #include <AK/NumericLimits.h>
 #include <AK/StdLibExtras.h>
@@ -66,6 +67,17 @@ public:
         return true;
     }
 
+    template<Enum T>
+    bool decode(T& enum_value)
+    {
+        UnderlyingType<T> inner_value;
+        if (!decode(inner_value))
+            return false;
+
+        enum_value = T(inner_value);
+        return true;
+    }
+
     template<typename T>
     bool decode(T& value)
     {

+ 9 - 0
Userland/Libraries/LibIPC/Encoder.h

@@ -6,6 +6,8 @@
 
 #pragma once
 
+#include <AK/Concepts.h>
+#include <AK/StdLibExtras.h>
 #include <LibIPC/Forward.h>
 #include <LibIPC/Message.h>
 
@@ -62,6 +64,13 @@ public:
         return *this;
     }
 
+    template<Enum T>
+    Encoder& operator<<(T const& enum_value)
+    {
+        *this << AK::to_underlying(enum_value);
+        return *this;
+    }
+
     template<typename T>
     Encoder& operator<<(const T& value)
     {