Class to track data flow and detect a specific pattern

Revision:
1:038d0018a542
Parent:
0:b8cca837d413
diff -r b8cca837d413 -r 038d0018a542 PatternFinder.h
--- a/PatternFinder.h	Mon Jan 11 04:48:08 2016 +0000
+++ b/PatternFinder.h	Wed Jan 13 05:30:23 2016 +0000
@@ -3,47 +3,52 @@
 #include <stdint.h>
 #include <string.h>
 
-
-template <typename T>
 class PatternFinder
 {
     private:
-    T   *m_PatternReference;
-    T   *m_CurrentPattern;
-    uint32_t m_PatternSize;
-    void ShiftDataInCurrentPattern(T data);
-    bool CheckForPattern(void);
+    uint8_t*    m_RefPattern;
+    uint8_t*    m_CurDataStream;
+    uint32_t    m_PatternSize;
+    uint32_t    m_PatternElementSize;
+    void        ShiftDataInStream(void* data);
+    bool        IsPatternFound(void);
+    
     public:
-    PatternFinder(T* Pattern,uint32_t PatternSize = 1);
+    PatternFinder(void* PatternData, uint32_t PatternLength, uint32_t PatternElementSize = 1);
     ~PatternFinder();  
-    bool CheckPattern(T data);  //returns true if pattern was found in the stream 
+    bool CheckPattern(void* data);  //returns true if pattern was found in the stream
 };
-
-template <class T>
-inline void PatternFinder<T>::ShiftDataInCurrentPattern(T data)
+inline void PatternFinder::ShiftDataInStream(void* data)
 {
-    for(int x = (m_PatternSize-1);x > 0;x--)
-        m_CurrentPattern[x] = m_CurrentPattern[x-1];
-    m_CurrentPattern[0] = data;
+    uint8_t *src;
+    uint8_t *dst;
+    for(int element = (m_PatternSize-1);element > 0; element--)
+    {
+        dst = m_CurDataStream + element*m_PatternElementSize;
+        src = m_CurDataStream + (element-1)*m_PatternElementSize;
+        memcpy(dst,src,m_PatternElementSize);
+    }
+    src = (uint8_t*)data;
+    dst = &m_CurDataStream[0];
+    memcpy(dst,src,m_PatternElementSize);
 }
-template <class T>
-inline bool PatternFinder<T>::CheckForPattern(void)
+
+inline bool PatternFinder::IsPatternFound(void)
 {
     uint32_t NumberOfIdenticalElementsFoundInPattern = 0;
-    for(int x = 0;x < m_PatternSize;x++)
+    for(int x = 0;x < m_PatternSize*m_PatternElementSize;x++)
     {
-        if(m_PatternReference[x] == m_CurrentPattern[x])
+        if(m_CurDataStream[x] == m_RefPattern[x])
         {
             NumberOfIdenticalElementsFoundInPattern++;
         }
     }
-    return NumberOfIdenticalElementsFoundInPattern == m_PatternSize;
+    return (NumberOfIdenticalElementsFoundInPattern == (m_PatternSize*m_PatternElementSize));
 }
 
-template <class T>
-inline bool PatternFinder<T>::CheckPattern(T data)
+inline bool PatternFinder::CheckPattern(void* data)
 {
-    ShiftDataInCurrentPattern(data);
-    return CheckForPattern();
+    ShiftDataInStream(data);
+    return IsPatternFound();
 }
 #endif
\ No newline at end of file