Adds SetDefault methods to NetworkTables (#54)

There was no way to atomically check for a key in the table,
and then setting if it if non existant. Back before persistent
this was not a problem, however now it is, as its possible for
values to be added before team's robot programs start. This makes
the old method of calling Put*** methods in RobotInit invalid.
This adds SetDefault methods, which do this atomically.
This commit is contained in:
Thad House
2016-07-13 00:31:03 -07:00
committed by Peter Johnson
parent 6615a34e99
commit 58092c5190
15 changed files with 785 additions and 1 deletions

View File

@@ -124,6 +124,12 @@ void NT_GetEntryValue(const char *name, size_t name_len,
ConvertToC(*v, value);
}
int NT_SetDefaultEntryValue(const char* name, size_t name_len,
const struct NT_Value *set_value) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
ConvertFromC(*set_value));
}
int NT_SetEntryValue(const char *name, size_t name_len,
const struct NT_Value *value) {
return nt::SetEntryValue(StringRef(name, name_len), ConvertFromC(*value));
@@ -701,6 +707,57 @@ NT_String *NT_GetValueStringArray(const struct NT_Value *value,
return arr;
}
int NT_SetDefaultEntryBoolean(const char *name, size_t name_len,
int default_boolean) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeBoolean(default_boolean != 0));
}
int NT_SetDefaultEntryDouble(const char *name, size_t name_len,
double default_double) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeDouble(default_double));
}
int NT_SetDefaultEntryString(const char *name, size_t name_len,
const char *default_value, size_t default_len) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeString(StringRef(default_value,
default_len)));
}
int NT_SetDefaultEntryRaw(const char *name, size_t name_len,
const char *default_value, size_t default_len) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeString(StringRef(default_value,
default_len)));
}
int NT_SetDefaultEntryBooleanArray(const char *name, size_t name_len,
const int *default_value,
size_t default_size) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeBooleanArray(llvm::makeArrayRef(default_value, default_size)));
}
int NT_SetDefaultEntryDoubleArray(const char *name, size_t name_len, const double *default_value,
size_t default_size) {
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeDoubleArray(llvm::makeArrayRef(default_value, default_size)));
}
int NT_SetDefaultEntryStringArray(const char *name, size_t name_len,
const struct NT_String* default_value,
size_t default_size) {
std::vector<std::string> vec;
vec.reserve(default_size);
for (size_t i = 0; i < default_size; ++i)
vec.push_back(ConvertFromC(default_value[i]));
return nt::SetDefaultEntryValue(StringRef(name, name_len),
Value::MakeStringArray(std::move(vec)));
}
int NT_GetEntryBoolean(const char *name, size_t name_len,
unsigned long long *last_change, int *v_boolean) {
auto v = nt::GetEntryValue(StringRef(name, name_len));