diff --git a/ntcore/src/main/native/cpp/Value.cpp b/ntcore/src/main/native/cpp/Value.cpp index c54a2ac63e..6d1e73bcd1 100644 --- a/ntcore/src/main/native/cpp/Value.cpp +++ b/ntcore/src/main/native/cpp/Value.cpp @@ -18,7 +18,6 @@ #include "Value_internal.h" #include "networktables/NetworkTableValue.h" -#include "ntcore_cpp.h" using namespace nt; @@ -70,35 +69,6 @@ void StringArrayStorage::InitNtStrings() { } } -Value::Value() { - m_val.type = NT_UNASSIGNED; - m_val.last_change = 0; - m_val.server_time = 0; - m_size = 0; -} - -Value::Value(NT_Type type, size_t size, int64_t time, const private_init&) - : Value{type, size, time == 0 ? nt::Now() : time, 1, private_init{}} {} - -Value::Value(NT_Type type, size_t size, int64_t time, int64_t serverTime, - const private_init&) { - m_val.type = type; - m_val.last_change = time; - m_val.server_time = serverTime; - if (m_val.type == NT_BOOLEAN_ARRAY) { - m_val.data.arr_boolean.arr = nullptr; - } else if (m_val.type == NT_INTEGER_ARRAY) { - m_val.data.arr_int.arr = nullptr; - } else if (m_val.type == NT_FLOAT_ARRAY) { - m_val.data.arr_float.arr = nullptr; - } else if (m_val.type == NT_DOUBLE_ARRAY) { - m_val.data.arr_double.arr = nullptr; - } else if (m_val.type == NT_STRING_ARRAY) { - m_val.data.arr_string.arr = nullptr; - } - m_size = size; -} - Value Value::MakeBooleanArray(std::span value, int64_t time) { Value val{NT_BOOLEAN_ARRAY, value.size() * sizeof(int), time, private_init{}}; auto data = AllocateArray(value.size()); diff --git a/ntcore/src/main/native/include/networktables/NetworkTableValue.h b/ntcore/src/main/native/include/networktables/NetworkTableValue.h index 80cee51f41..2dcd65e979 100644 --- a/ntcore/src/main/native/include/networktables/NetworkTableValue.h +++ b/ntcore/src/main/native/include/networktables/NetworkTableValue.h @@ -20,6 +20,9 @@ namespace nt { +// Forward declare here to avoid circular dependency on ntcore_cpp.h +int64_t Now(); + #if __GNUC__ >= 13 #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wmaybe-uninitialized" @@ -33,10 +36,41 @@ class Value final { struct private_init {}; public: - Value(); - Value(NT_Type type, size_t size, int64_t time, const private_init&); + Value() { + m_val.type = NT_UNASSIGNED; + m_val.last_change = 0; + m_val.server_time = 0; + } + + Value(NT_Type type, size_t size, int64_t time, const private_init&) + : Value{type, size, time == 0 ? Now() : time, 1, private_init{}} {} + Value(NT_Type type, size_t size, int64_t time, int64_t serverTime, - const private_init&); + const private_init&) + : m_size{size} { + m_val.type = type; + m_val.last_change = time; + m_val.server_time = serverTime; + switch (type) { + case NT_BOOLEAN_ARRAY: + m_val.data.arr_boolean.arr = nullptr; + break; + case NT_INTEGER_ARRAY: + m_val.data.arr_int.arr = nullptr; + break; + case NT_FLOAT_ARRAY: + m_val.data.arr_float.arr = nullptr; + break; + case NT_DOUBLE_ARRAY: + m_val.data.arr_double.arr = nullptr; + break; + case NT_STRING_ARRAY: + m_val.data.arr_string.arr = nullptr; + break; + default: + break; + } + } explicit operator bool() const { return m_val.type != NT_UNASSIGNED; }