Class to track data flow and detect a specific pattern

Files at this revision

API Documentation at this revision

Comitter:
chris215
Date:
Wed Jan 13 05:30:23 2016 +0000
Parent:
0:b8cca837d413
Commit message:
Removed templates and changed to using void* to make the class more generic.

Changed in this revision

PatternFinder.cpp Show annotated file Show diff for this revision Revisions of this file
PatternFinder.h Show annotated file Show diff for this revision Revisions of this file
--- a/PatternFinder.cpp	Mon Jan 11 04:48:08 2016 +0000
+++ b/PatternFinder.cpp	Wed Jan 13 05:30:23 2016 +0000
@@ -1,39 +1,27 @@
 #include "PatternFinder.h"
-// make the linker aware of some possible types
-template class PatternFinder<uint8_t>;
-template class PatternFinder<int8_t>;
-template class PatternFinder<uint16_t>;
-template class PatternFinder<int16_t>;
-template class PatternFinder<uint32_t>;
-template class PatternFinder<int32_t>;
-template class PatternFinder<uint64_t>;
-template class PatternFinder<int64_t>;
-template class PatternFinder<char>;
-template class PatternFinder<wchar_t>;
-
-template <class T>
-PatternFinder<T>::PatternFinder(T* Pattern,uint32_t PatternSize)
+PatternFinder::PatternFinder(void* PatternData, uint32_t PatternLength, uint32_t PatternElementSize)
 {
-    m_PatternSize = PatternSize;
-    m_PatternReference = new T[PatternSize];
+    m_PatternSize = PatternLength;
+    m_PatternElementSize = PatternElementSize;
+    m_RefPattern = new uint8_t[m_PatternSize*m_PatternElementSize];
     
-    T *src = Pattern;
-    T *dst = &m_PatternReference[PatternSize-1];
+    uint8_t *src = (uint8_t*)PatternData;
+    uint8_t *dst = (uint8_t*)m_RefPattern + (m_PatternSize-1)*m_PatternElementSize;
     //We must invert the given pattern so that it better fits the matching algorithm
-    for(int x = 0; x < PatternSize ;x++)
+    for(int x = 0; x < m_PatternSize ;x++)
     {
-        *dst-- = *src++;
-
+        memcpy(dst,src,m_PatternElementSize);
+        dst-=m_PatternElementSize;
+        src+=m_PatternElementSize;
     }
-    m_CurrentPattern = new T[PatternSize];  
+    m_CurDataStream = new uint8_t[m_PatternSize*m_PatternElementSize];  
     return;
 }
 
-template <class T>
-PatternFinder<T>::~PatternFinder()
+PatternFinder::~PatternFinder()
 {
-    delete [] m_PatternReference;
-    delete [] m_CurrentPattern;
+    delete [] m_RefPattern;
+    delete [] m_CurDataStream;
     return;
 }
 
--- 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