diff --git a/cpp/binary_table.h b/cpp/binary_table.h index eba0d7e..0848b32 100644 --- a/cpp/binary_table.h +++ b/cpp/binary_table.h @@ -416,6 +416,27 @@ inline std::vector decodeFreeList(const std::vector& return freeList; } +// Helper to print BT_Value variant +inline std::string printBTValue(const BT_Value& v) { + if (std::holds_alternative(v)) return std::to_string(std::get(v)); + if (std::holds_alternative(v)) return std::to_string(std::get(v)); + if (std::holds_alternative(v)) return '"' + std::get(v) + '"'; + if (std::holds_alternative>(v)) { + const auto& arr = std::get>(v); + std::ostringstream oss; oss << "["; + for (size_t i = 0; i < arr.size(); ++i) { if (i) oss << ", "; oss << arr[i]; } + oss << "]"; return oss.str(); + } + if (std::holds_alternative>(v)) { + const auto& arr = std::get>(v); + std::ostringstream oss; oss << "["; + for (size_t i = 0; i < arr.size(); ++i) { if (i) oss << ", "; oss << arr[i]; } + oss << "]"; return oss.str(); + } + if (std::holds_alternative(v)) return std::get(v).to_string(true); + return ""; +} + // --- Main function for testing --- #ifdef BINARY_TABLE_MAIN #include @@ -423,12 +444,9 @@ inline std::vector decodeFreeList(const std::vector& int main() { const std::string filename = "example.bin"; - // Remove file if it exists std::remove(filename.c_str()); - // Create file std::ofstream(filename).close(); BinaryTable table(filename); - // No explicit initialise needed, but could be added if desired std::cout << "File dump:" << std::endl; { @@ -438,32 +456,40 @@ int main() { std::cout << "File size: " << data.size() << " bytes\n" << std::endl; } - // Insert arrays table.set("int_array", std::vector{6, 3, 9, 2, 5}); table.set("float_array", std::vector{1.5, 2.5, 3.5}); table.set("empty", std::vector{}); // Modify arrays - BT_UniformArray intArr = std::get(table.get("int_array")); - BT_UniformArray floatArr = std::get(table.get("float_array")); - intArr.set(0, 1); - floatArr.set(1, 4.5); - - std::cout << "int_array pointer: " << intArr._pointer.to_string() << std::endl; - std::cout << "float_array pointer: " << floatArr._pointer.to_string() << std::endl; - - intArr.add(10); - floatArr.add(5.5); - intArr.addAll({420, 69, 1337, 1738}); - floatArr.addAll({6.5, 7.5, 8.5}); - - auto readback1 = intArr.to_string(true); - auto readback2 = floatArr.to_string(true); - BT_UniformArray emptyArr = std::get(table.get("empty")); - auto readback3 = emptyArr.to_string(true); - std::cout << "Readback1: " << readback1 << std::endl; - std::cout << "Readback2: " << readback2 << std::endl; - std::cout << "Readback3: " << readback3 << std::endl; + auto v1 = table.get("int_array"); + auto v2 = table.get("float_array"); + if (std::holds_alternative(v1)) { + BT_UniformArray intArr = std::get(v1); + intArr.set(0, 1); + intArr.add(10); + intArr.addAll({420, 69, 1337, 1738}); + std::cout << "int_array pointer: " << intArr._pointer.to_string() << std::endl; + std::cout << "Readback1: " << intArr.to_string(true) << std::endl; + } else { + std::cout << "int_array is not a BT_UniformArray!\n"; + } + if (std::holds_alternative(v2)) { + BT_UniformArray floatArr = std::get(v2); + floatArr.set(1, 4.5); + floatArr.add(5.5); + floatArr.addAll({6.5, 7.5, 8.5}); + std::cout << "float_array pointer: " << floatArr._pointer.to_string() << std::endl; + std::cout << "Readback2: " << floatArr.to_string(true) << std::endl; + } else { + std::cout << "float_array is not a BT_UniformArray!\n"; + } + auto v3 = table.get("empty"); + if (std::holds_alternative(v3)) { + BT_UniformArray emptyArr = std::get(v3); + std::cout << "Readback3: " << emptyArr.to_string(true) << std::endl; + } else { + std::cout << "empty is not a BT_UniformArray!\n"; + } std::cout << "\nFile dump:" << std::endl; {