// #define PK_UUID_CLOCK CLOCK_REALTIME_ALARM #define PK_IMPL_STN #define PK_IMPL_UUID #include "../pkmacros.h" #include "../pkuuid.h" #include "../pktmr.h" #include #include #include void print_uuid_v7_breakdown(FILE *f, struct pk_uuid id) { fprintf(f, "-------------------------------------------\n"); fprintf(f, "field bits value\n"); fprintf(f, "-------------------------------------------\n"); fprintf(f, "unix_ts_ms 48 0x"); fprintf(f, "%.2x", id.uuid[0]); fprintf(f, "%.2x", id.uuid[1]); fprintf(f, "%.2x", id.uuid[2]); fprintf(f, "%.2x", id.uuid[3]); fprintf(f, "%.2x", id.uuid[4]); fprintf(f, "%.2x", id.uuid[5]); fprintf(f, "\n"); fprintf(f, "ver 4 0x"); fprintf(f, "%.x", (id.uuid[6] & 0xF0) >> 4); fprintf(f, "\n"); fprintf(f, "rand_a 12 0x"); fprintf(f, "%.1x", (id.uuid[6] & 0x0F)); fprintf(f, "%.2x", id.uuid[7]); fprintf(f, "\n"); fprintf(f, "var 2 0b"); fprintf(f, "%c", (id.uuid[8] & 0x80) ? '1' : '0'); fprintf(f, "%c", (id.uuid[8] & 0x40) ? '1' : '0'); fprintf(f, "\n"); fprintf(f, "rand_b 62 0b"); fprintf(f, "%c", (id.uuid[8] & 0x20) ? '1' : '0'); fprintf(f, "%c", (id.uuid[8] & 0x10) ? '1' : '0'); fprintf(f, ", 0x"); fprintf(f, "%.x", (id.uuid[8] & 0x0F)); fprintf(f, "%.2x", id.uuid[9]); fprintf(f, "%.2x", id.uuid[10]); fprintf(f, "%.2x", id.uuid[11]); fprintf(f, "%.2x", id.uuid[12]); fprintf(f, "%.2x", id.uuid[13]); fprintf(f, "%.2x", id.uuid[14]); fprintf(f, "%.2x", id.uuid[15]); fprintf(f, "\n"); fprintf(f, "-------------------------------------------\n"); } int main(int argc, char *argv[]) { (void)argc; (void)argv; pk_uuid_init(time(NULL)); const struct pk_uuid example_id = { .uuid = { 0x01, 0x7F, 0x22, 0xE2, 0x79, 0xB0, 0x7C, 0xC3, 0x98, 0xC4, 0xDC, 0x0C, 0x0C, 0x07, 0x39, 0x8F } }; fprintf(stdout, "\n"); { struct pk_uuid id; id = pk_uuid_zed; fprintf(stdout, "[%s] zed: " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); } { struct pk_uuid id; id = pk_uuid_max; fprintf(stdout, "[%s] one: " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); } { struct pk_uuid id1, id2; bool equals; id1 = pk_uuid_zed; id2 = pk_uuid_zed; equals = id1 == id2; fprintf(stdout, "[%s] equals (zed, zed): %c\n", __FILE__, equals ? '1' : '0'); if (equals != true) exit(1); id1 = pk_uuid_new_v7(); id2 = pk_uuid_new_v7(); equals = id1 == id2; fprintf(stdout, "[%s] equals (rand, rand): %c\n", __FILE__, equals ? '1' : '0'); if (equals != false) exit(1); } { const int count = 4; struct pk_uuid ids[count]; for (int i = 0; i < count; ++i) { ids[i] = pk_uuid_new_v7(); } for (int i = 0; i < count; ++i) { fprintf(stdout, "[%s] new: " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(ids[i])); } for (int i = 0; i < count; ++i) { fprintf(stdout, "\n"); print_uuid_v7_breakdown(stdout, ids[i]); fprintf(stdout, "[%s] new: " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(ids[i])); } fprintf(stdout, "\n"); } { double ms; const int count = 1000; struct pk_uuid ids[count]; struct pk_tmr tmr; pk_tmr_start(tmr); for (int i = 0; i < count; ++i) { ids[i] = pk_uuid_new_v7(); } pk_tmr_stop(tmr); fprintf(stdout, "generated %i ids...\n", count); ms = pk_tmr_duration_dbl_mili(tmr); fprintf(stdout, "elapsed time : %f ms\n", ms); fprintf(stdout, "elapsed time (avg): %f ms\n", ms / (double)count); fprintf(stdout, pk_uuid_printf_format "\n", pk_uuid_printf_var(ids[0])); fprintf(stdout, pk_uuid_printf_format "\n", pk_uuid_printf_var(ids[99])); } // << { std::stringstream ss; ss << example_id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] expected: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f\n", __FILE__); fprintf(stdout, "[%s] result : %s\n", __FILE__, ss.str().c_str()); if (ss.str() != "017f22e2-79b0-7cc3-98c4-dc0c0c07398f") return 1; } // >> { struct pk_uuid id = pk_uuid_max; std::istringstream ssi("017f22e2-79b0-7cc3-98c4-dc0c0c07398fX"); ssi >> id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] leftovers: ", __FILE__); ssi >> std::cout.rdbuf(); std::cout << std::endl; fprintf(stdout, "[%s] excpected: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); for (int i = 0; i < 16; ++i) { if (example_id.uuid[i] != id.uuid[i]) return 1; } } // >> { struct pk_uuid id = pk_uuid_max; const char *ssi = "017f22e2-79b0-7cc3-98c4-dc0c0c07398f"; ssi >> id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] excpected: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); for (int i = 0; i < 16; ++i) { if (example_id.uuid[i] != id.uuid[i]) return 1; } } // << { struct pk_uuid id; const char *ssi = "017f22e2-79b0-7cc3-98c4-dc0c0c07398f"; id << ssi; fprintf(stdout, "\n"); fprintf(stdout, "[%s] excpected: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); for (int i = 0; i < 16; ++i) { if (example_id.uuid[i] != id.uuid[i]) return 1; } } // >> { struct pk_uuid id = pk_uuid_max; const char *ssi = "017f22e2-79b0-7cc3-98c4-dc0c0c07398fX"; const char *res = ssi >> id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] leftovers: %.2s\n", __FILE__, res); fprintf(stdout, "[%s] excpected: 017f22e2-79b0-7cc3-98c4-dc0c0c07398f\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); if (res[0] != 'X') exit(1); for (int i = 0; i < 16; ++i) { if (example_id.uuid[i] != id.uuid[i]) return 1; } } // >> err { struct pk_uuid id = example_id; const char *ssi = "gnud"; ssi >> id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] excpected: 00000000-0000-0000-0000-000000000000\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); for (int i = 0; i < 16; ++i) { if (pk_uuid_zed.uuid[i] != id.uuid[i]) return 1; } } // >> err { struct pk_uuid id = example_id; std::istringstream ssi("gnud"); ssi >> id; fprintf(stdout, "\n"); fprintf(stdout, "[%s] leftovers: ", __FILE__); ssi >> std::cout.rdbuf(); std::cout << std::endl; fprintf(stdout, "[%s] excpected: 00000000-0000-0000-0000-000000000000\n", __FILE__); fprintf(stdout, "[%s] result : " pk_uuid_printf_format "\n", __FILE__, pk_uuid_printf_var(id)); for (int i = 0; i < 16; ++i) { if (pk_uuid_zed.uuid[i] != id.uuid[i]) return 1; } } pk_uuid_teardown(); return 0; }