00001 #ifndef __STATE_TABLE_H__ 00002 #define __STATE_TABLE_H__ 00003 00004 #include <vector> 00005 #include <string> 00006 00007 namespace MetaCC 00008 { 00021 class StateTable 00022 { 00025 class edges_list_t 00026 { 00027 int m_dst_states[256]; 00028 int m_masks[256]; 00029 public: 00031 void set_state(int index, int dst_state, uint8 mask) { m_dst_states[index] = dst_state; m_masks[index] = mask; } 00033 int get_state(int index) const { return m_dst_states[index]; } 00035 uint8 get_mask(int index) const { return m_masks[index]; } 00036 }; 00037 00038 std::vector<edges_list_t> m_states; 00039 public: 00046 int add_state(); 00047 00049 static std::string bin_str(uint8 v) { 00050 std::string s; 00051 for (int i=7;i>=0;i--) s += ((v>>i) & 0x01) + '0'; 00052 return s; 00053 } 00054 00056 static std::string mask_str(uint8 v) { 00057 std::string s; 00058 for (int i=7;i>=0;i--) s += ((v>>i) & 0x01)?'d':'x'; 00059 return s; 00060 } 00061 00085 bool learn(int src_state, const char *patt_str, int dest_state, uint8 value = 0, uint8 mask = 0); 00086 00091 int states_count() const { return m_states.size(); } 00092 00096 int get_state_edge(int state_id, uint8 v) const { return m_states[state_id].get_state(v); } 00097 }; 00098 00099 } 00100 00101 #endif