Refactor code to avoid typepunning tricks

Change-Id: Iecefa233561ddbef3e04f395f12fb56cd76ffd42
diff --git a/applications/message_process/include/message_process.hpp b/applications/message_process/include/message_process.hpp
index 51f474d..e820b60 100644
--- a/applications/message_process/include/message_process.hpp
+++ b/applications/message_process/include/message_process.hpp
@@ -55,6 +55,7 @@
     bool read(uint8_t *dst, uint32_t length);
     bool write(const Vec *vec, size_t length);
     bool write(const uint32_t type, const void *src = nullptr, uint32_t length = 0);
+    bool skip(uint32_t length);
 
     template <typename T>
     bool read(T &dst) {
@@ -62,6 +63,15 @@
     }
 
     template <typename T>
+    bool readOrSkip(T &dst, uint32_t expectedLength) {
+        if (expectedLength == sizeof(dst)) {
+            return read(reinterpret_cast<uint8_t *>(&dst), sizeof(dst));
+        } else {
+            return skip(expectedLength);
+        }
+    }
+
+    template <typename T>
     bool write(const uint32_t type, const T &src) {
         return write(type, reinterpret_cast<const void *>(&src), sizeof(src));
     }