Class to track data flow and detect a specific pattern
Diff: PatternFinder.h
- 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