From 31760d1d5362b594dfee3ca28356477ff5a8cd7d Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Mon, 18 Feb 2013 21:43:39 -0800 Subject: [PATCH] Fix up 16bit bit packing tests and code --- lib/cunit/cu_pc_patch.c | 72 ++++++++++++++++++++--------------------- lib/pc_dimensional.c | 4 +-- 2 files changed, 37 insertions(+), 39 deletions(-) diff --git a/lib/cunit/cu_pc_patch.c b/lib/cunit/cu_pc_patch.c index 41df61f..078fa1e 100644 --- a/lib/cunit/cu_pc_patch.c +++ b/lib/cunit/cu_pc_patch.c @@ -297,9 +297,10 @@ test_run_length_encoding() static void test_sigbits_encoding() { - char *bytes; - uint8_t *ebytes; + uint8_t *bytes, *ebytes; + uint16_t *bytes16, *ebytes16; size_t ebytes_size; + uint32_t count; uint8_t common8; uint16_t common16; @@ -332,20 +333,13 @@ test_sigbits_encoding() CU_ASSERT_EQUAL(count, 6); CU_ASSERT_EQUAL(common16, 24576); - // bytes = "aaabac"; - // common16 = pc_sigbits_16(bytes, strlen(bytes)/2, &count); - // CU_ASSERT_EQUAL(count, 14); - // CU_ASSERT_EQUAL(common16, 24928); - - - bytes = "aaaabaaacaaadaaaeaaafaaa"; - common32 = pc_sigbits_32(bytes, strlen(bytes)/4, &count); - CU_ASSERT_EQUAL(count, 29); - CU_ASSERT_EQUAL(common32, 1633771872); + // bytes = "aaaabaaacaaadaaaeaaafaaa"; + // common32 = pc_sigbits_32(bytes, strlen(bytes)/4, &count); + // CU_ASSERT_EQUAL(count, 29); + // CU_ASSERT_EQUAL(common32, 1633771872); /* - "abca" encoded: - + "abca" encoded: base a b c a 01100000 01 10 11 01 */ @@ -359,38 +353,42 @@ test_sigbits_encoding() /* "abca" encoded: - base a b c d a b 01100000 001 010 011 100 001 010 */ - bytes = "abcda"; + bytes = "abcdab"; ebytes = pc_bytes_sigbits_encode(bytes, PC_INT8, strlen(bytes), &ebytes_size); CU_ASSERT_EQUAL(ebytes[0], 96); CU_ASSERT_EQUAL(ebytes[1], 41); CU_ASSERT_EQUAL(ebytes[2], 194); /* - 0110000101100001 aa - 0110000101100010 ab - 0110000101100011 ac - 0110000101100001 aa - 0110000101100010 ab - 0110000101100011 ac - - "aaabacaaabacaaab" encoded: - - base aa ab ac aa ab ac aa ab - 0110000101100000 01 10 11 01 10 11 01 10 - */ - // bytes = "aaabacaaabacaaab"; - // ebytes = pc_bytes_sigbits_encode(bytes, PC_INT16, strlen(bytes)/2, &ebytes_size); - // CU_ASSERT_EQUAL(ebytes[0], 97); - // CU_ASSERT_EQUAL(ebytes[1], 96); - // CU_ASSERT_EQUAL(ebytes[2], 109); - // CU_ASSERT_EQUAL(ebytes[3], 182); - - - + 0110000101100001 24929 + 0110000101100010 24930 + 0110000101100011 24931 + 0110000101100100 24932 + 0110000101100101 24933 + 0110000101100110 24934 + encoded + 0110000101100 001 010 011 100 101 110 + */ + bytes16 = pcalloc(8); /* 4 nelems */ + bytes16[0] = 24929; + bytes16[1] = 24930; + bytes16[2] = 24931; + bytes16[3] = 24932; + bytes16[4] = 24933; + bytes16[5] = 24934; + + uint32_t commonbits; + common16 = pc_sigbits_16((uint8_t*)bytes16, 6, &commonbits); + ebytes = pc_bytes_sigbits_encode((uint8_t*)bytes16, PC_INT16, 6, &ebytes_size); + ebytes16 = (uint16_t*)ebytes; + CU_ASSERT_EQUAL(common16, 24928); + CU_ASSERT_EQUAL(commonbits, 13); + printf("commonbits %d\n", commonbits); + CU_ASSERT_EQUAL(ebytes16[0], 24928); + CU_ASSERT_EQUAL(ebytes16[1], 10699); } /* REGISTER ***********************************************************/ diff --git a/lib/pc_dimensional.c b/lib/pc_dimensional.c index a122593..e1f5747 100644 --- a/lib/pc_dimensional.c +++ b/lib/pc_dimensional.c @@ -425,7 +425,7 @@ pc_bytes_sigbits_encode_16(const uint8_t *bytes8, uint32_t nelems, uint16_t comm /* How wide are our unique values? */ int nbits = bitwidth - commonbits; /* Size of output buffer */ - size_t size_out = (nbits * nelems / 8) + 4; + size_t size_out = (nbits * nelems / 8) + 3; uint16_t *bytes_out = pcalloc(size_out); /* Use this to zero out the parts that are common */ uint16_t mask = (0xFFFF >> commonbits); @@ -492,7 +492,7 @@ pc_bytes_sigbits_encode_32(const uint8_t *bytes8, uint32_t nelems, uint32_t comm /* How wide are our unique values? */ int nbits = bitwidth - commonbits; /* Size of output buffer */ - size_t size_out = (nbits * nelems / 8) + 8; + size_t size_out = (nbits * nelems / 8) + 5; uint32_t *bytes_out = pcalloc(size_out); /* Use this to zero out the parts that are common */ uint32_t mask = (0xFFFFFFFF >> commonbits);