#include #include #include #include #include using namespace std; /***************************************************************************** * * Splitt structure we are about to cast :) * *****************************************************************************/ // prototype C++ const int A_Flag_width = 2; const int A_FrameID_width = 6; const int A_Link_width = 8; const int A_SplittID_width = 8; const int A_Empty_width = 8; typedef struct { DWORD32 A_Flag : A_Flag_width; DWORD32 A_FrameID : A_FrameID_width; DWORD32 A_Link: A_Link_width; DWORD32 A_SplittID : A_SplittID_width; DWORD32 A_Empty: A_Empty_width; DWORD32 B_CRC; char * Data; } splitt_struct; /****************************************************************************/ /***************************************************************************** * * This is the nice C variant :) * *****************************************************************************/ // define shit C typedef char structure; typedef structure * p_structure; #define MEMBER_POINTER(number,t) (t *)((p_structure)Example + number * sizeof(t)) #define MEMBER_VALUE(number,t) (*MEMBER_POINTER(number, t)) #define SUBMEMBER_CLEAR(member, t, start, end) do { MEMBER_VALUE(member, t) &= ~(((SIZE_MAX << end) >> (end + start)) << start); } while (0); #define SUBMEMBER_GET(member, t, start, end) ((MEMBER_VALUE(member, t) << end) >> (end + start)) #define SUBMEMBER_SET(member, t, val, start, end) do { SUBMEMBER_CLEAR(member, t, start, end); MEMBER_VALUE(member, t) |= val << start ; } while (0); #define MEMBER_LAST_BIT(t) (8 * sizeof(t) - 1) #define END_OFFSET(t, end) (MEMBER_LAST_BIT(t) - end) typedef structure Splitt; typedef p_structure p_Splitt; #define splitt Example #define A 0 #define CRC 1 #define DATA 2 #define A_flag_start 0 #define A_flag_end END_OFFSET(size_t, 1) #define A_FID_start 2 #define A_FID_end END_OFFSET(size_t, 7) #define A_Link_start 8 #define A_Link_end END_OFFSET(size_t, 15) #define A_SID_start 16 #define A_SID_end END_OFFSET(size_t, 23) #define A_Empty_start 24 #define A_Empty_end END_OFFSET(size_t, 31) #define splitt_flag_get (SUBMEMBER_GET(A, DWORD32, A_flag_start, A_flag_end)) #define splitt_flag_set(val) SUBMEMBER_SET(A, DWORD32, val, A_flag_start, A_flag_end) #define splitt_FID_get (SUBMEMBER_GET(A, DWORD32, A_FID_start, A_FID_end)) #define splitt_FID_set(val) SUBMEMBER_SET(A, DWORD32, val, A_FID_start, A_FID_end) #define splitt_link_get (SUBMEMBER_GET(A, DWORD32, A_Link_start, A_Link_end)) #define splitt_link_set(val) SUBMEMBER_SET(A, DWORD32, val, A_Link_start, A_Link_end) #define splitt_SID_get (SUBMEMBER_GET(A, DWORD32, A_SID_start, A_SID_end)) #define splitt_SID_set(val) SUBMEMBER_SET(A, DWORD32, val, A_SID_start, A_SID_end) #define splitt_empty_get (SUBMEMBER_GET(A, DWORD32, A_Empty_start, A_Empty_end)) #define splitt_empty_set(val) SUBMEMBER_SET(A, DWORD32, val, A_Empty_start, A_Empty_end) #define p_splitt_CRC (MEMBER_POINTER(CRC, DWORD32)) #define splitt_CRC (*p_splitt_CRC) #define splitt_data MEMBER_POINTER(DATA, p_Splitt) /****************************************************************************/ /***************************************************************************** * * Test all cells separately and all together * *****************************************************************************/ int main(int argc, char* argv[]) { splitt_struct reference; const int sizeee = 100; p_Splitt splitt = new char[sizeee]; srand ((unsigned)time(0)); const int NUMBER_OF_TESTS = 100; for (int i = 0; i < sizeee; i++) splitt[i] = 0; cout << "TESTING FLAG" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { DWORD32 random = rand() % 4; reference.A_Flag = random; splitt_flag_set(random); if (reference.A_Flag != splitt_flag_get) cout << reference.A_Flag << " != " << splitt_flag_get << "\t\t\trandom was : " << random << endl; } for (int i = 0; i < sizeee; i++) Example[i] = 0; cout << "TESTING FID" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { DWORD32 random = rand() % 64; reference.A_FrameID = random; splitt_FID_set(random); if (reference.A_FrameID != splitt_FID_get) cout << reference.A_FrameID << " != " << splitt_FID_get << "\t\t\trandom was : " << random << endl; } for (int i = 0; i < sizeee; i++) Example[i] = 0; cout << "TESTING LINK" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { DWORD32 random = rand() % 256; reference.A_Link = random; splitt_link_set(random); if (reference.A_Link != splitt_link_get) cout << reference.A_Link << " != " << splitt_link_get << "\t\t\trandom was : " << random << endl; } for (int i = 0; i < sizeee; i++) Example[i] = 0; cout << "TESTING SID" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { DWORD32 random = rand() % 255; reference.A_SplittID = random; splitt_SID_set(random); if (reference.A_SplittID != splitt_SID_get) cout << reference.A_SplittID << " != " << splitt_SID_get << "\t\t\trandom was : " << random << endl; } for (int i = 0; i < sizeee; i++) Example[i] = 0; cout << "TESTING ALL TOGETHER" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { int range1 = 4; int range2 = 64; int range3 = 255; DWORD32 random1 = rand() % range1; DWORD32 random2 = rand() % range2; DWORD32 random3 = rand() % range3; reference.A_Flag = random1; reference.A_FrameID = random2; reference.A_Link = random3; reference.A_SplittID = random3; reference.A_Empty = random3; splitt_flag_set(random1); splitt_FID_set(random2); splitt_link_set(random3); splitt_SID_set(random3); splitt_empty_set(random3); if (reference.A_Flag != splitt_flag_get) cout << reference.A_Flag << " != " << splitt_flag_get << endl; if (reference.A_FrameID != splitt_FID_get) cout << reference.A_FrameID << " != " << splitt_FID_get << endl; if (reference.A_Link != splitt_link_get) cout << reference.A_Link << " != " << splitt_link_get << endl; if (reference.A_SplittID != splitt_SID_get) cout << reference.A_SplittID << " != " << splitt_SID_get << endl; if (reference.A_Empty != splitt_empty_get) cout << reference.A_Empty << " != " << splitt_empty_get << endl; } cout << "TESTING CRC" << endl; for (int i = 0; i < NUMBER_OF_TESTS; i++) { DWORD32 random = rand(); reference.B_CRC = random; splitt_CRC = random; if (reference.B_CRC != splitt_CRC) cout << reference.B_CRC << " != " << splitt_CRC << "\t\t\trandom was : " << random << endl; } for (int i = 0; i < sizeee; i++) Example[i] = 0; cin.get(); return 0; }