2015-06-21 21:02:10 -07:00
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
/* Copyright (c) FIRST 2015. All Rights Reserved. */
|
|
|
|
|
/* Open Source Software - may be modified and shared by FRC teams. The code */
|
|
|
|
|
/* must be accompanied by the FIRST BSD license file in the root directory of */
|
|
|
|
|
/* the project. */
|
|
|
|
|
/*----------------------------------------------------------------------------*/
|
|
|
|
|
|
2015-06-25 23:12:49 -07:00
|
|
|
#include "Value.h"
|
2015-06-21 21:02:10 -07:00
|
|
|
|
|
|
|
|
#include <cassert>
|
2015-06-29 23:08:35 -07:00
|
|
|
#include <cstdlib>
|
2015-06-21 21:02:10 -07:00
|
|
|
#include <cstring>
|
|
|
|
|
|
|
|
|
|
#include "ntcore.h"
|
|
|
|
|
|
2015-06-29 23:08:35 -07:00
|
|
|
using namespace ntimpl;
|
|
|
|
|
|
|
|
|
|
StringValue::StringValue(llvm::StringRef val) {
|
|
|
|
|
len = val.size();
|
|
|
|
|
str = static_cast<char*>(std::malloc(len+1));
|
|
|
|
|
std::memcpy(str, val.data(), len);
|
|
|
|
|
str[len] = '\0';
|
|
|
|
|
}
|
|
|
|
|
|
2015-07-12 23:13:43 -07:00
|
|
|
StringValue& StringValue::operator=(llvm::StringRef val) {
|
|
|
|
|
NT_DisposeString(this);
|
|
|
|
|
str = nullptr;
|
|
|
|
|
len = val.size();
|
|
|
|
|
str = static_cast<char*>(std::malloc(len+1));
|
|
|
|
|
std::memcpy(str, val.data(), len);
|
|
|
|
|
str[len] = '\0';
|
|
|
|
|
return *this;
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-29 23:08:35 -07:00
|
|
|
void Value::SetBooleanArray(llvm::ArrayRef<int> value) {
|
|
|
|
|
// handle type change
|
|
|
|
|
if (NT_Value::type != NT_BOOLEAN_ARRAY) {
|
|
|
|
|
NT_DisposeValue(this);
|
|
|
|
|
data.arr_boolean.arr = nullptr;
|
|
|
|
|
data.arr_boolean.size = 0; // set to zero so size change is hit below
|
|
|
|
|
NT_Value::type = NT_BOOLEAN_ARRAY;
|
|
|
|
|
}
|
|
|
|
|
// handle size change
|
|
|
|
|
if (data.arr_boolean.size != value.size()) {
|
|
|
|
|
std::free(data.arr_boolean.arr);
|
|
|
|
|
data.arr_boolean.arr =
|
|
|
|
|
static_cast<int*>(std::malloc(value.size()*sizeof(int)));
|
|
|
|
|
data.arr_boolean.size = value.size();
|
|
|
|
|
}
|
|
|
|
|
std::copy(value.begin(), value.end(), data.arr_boolean.arr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Value::SetDoubleArray(llvm::ArrayRef<double> value) {
|
|
|
|
|
// handle type change
|
|
|
|
|
if (NT_Value::type != NT_DOUBLE_ARRAY) {
|
|
|
|
|
NT_DisposeValue(this);
|
|
|
|
|
data.arr_double.arr = nullptr;
|
|
|
|
|
data.arr_double.size = 0; // set to zero so size change is hit below
|
|
|
|
|
NT_Value::type = NT_DOUBLE_ARRAY;
|
|
|
|
|
}
|
|
|
|
|
// handle size change
|
|
|
|
|
if (data.arr_double.size != value.size()) {
|
|
|
|
|
std::free(data.arr_double.arr);
|
|
|
|
|
data.arr_double.arr =
|
|
|
|
|
static_cast<double*>(std::malloc(value.size()*sizeof(double)));
|
|
|
|
|
data.arr_double.size = value.size();
|
|
|
|
|
}
|
|
|
|
|
std::copy(value.begin(), value.end(), data.arr_double.arr);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void Value::SetStringArray(std::vector<StringValue>& value) {
|
|
|
|
|
// handle type change
|
|
|
|
|
if (NT_Value::type != NT_STRING_ARRAY) {
|
|
|
|
|
NT_DisposeValue(this);
|
|
|
|
|
data.arr_string.arr = nullptr;
|
|
|
|
|
data.arr_string.size = 0; // set to zero so size change is hit below
|
|
|
|
|
NT_Value::type = NT_STRING_ARRAY;
|
|
|
|
|
}
|
|
|
|
|
// handle size change
|
|
|
|
|
if (data.arr_string.size != value.size()) {
|
|
|
|
|
std::free(data.arr_string.arr);
|
|
|
|
|
data.arr_string.arr =
|
|
|
|
|
static_cast<NT_String*>(std::malloc(value.size()*sizeof(NT_String)));
|
2015-07-03 13:29:31 -07:00
|
|
|
// need to initialize array to avoid invalid frees in std::move below.
|
|
|
|
|
for (size_t i=0; i<value.size(); ++i) {
|
|
|
|
|
data.arr_string.arr[i].str = nullptr;
|
|
|
|
|
data.arr_string.arr[i].len = 0;
|
|
|
|
|
}
|
2015-06-29 23:08:35 -07:00
|
|
|
data.arr_string.size = value.size();
|
|
|
|
|
}
|
|
|
|
|
std::move(value.begin(), value.end(),
|
|
|
|
|
static_cast<StringValue*>(data.arr_string.arr));
|
|
|
|
|
value.clear();
|
|
|
|
|
}
|
|
|
|
|
|
2015-06-28 21:52:06 -07:00
|
|
|
bool ntimpl::operator==(const Value& lhs, const Value& rhs) {
|
|
|
|
|
if (lhs.type() != rhs.type()) return false;
|
|
|
|
|
switch (lhs.type()) {
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_UNASSIGNED:
|
2015-06-25 22:57:43 -07:00
|
|
|
return true; // XXX: is this better being false instead?
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_BOOLEAN:
|
2015-06-25 22:57:43 -07:00
|
|
|
return lhs.data.v_boolean == rhs.data.v_boolean;
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_DOUBLE:
|
2015-06-25 22:57:43 -07:00
|
|
|
return lhs.data.v_double == rhs.data.v_double;
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_STRING:
|
|
|
|
|
case NT_RAW:
|
|
|
|
|
case NT_RPC:
|
2015-06-25 22:57:43 -07:00
|
|
|
if (lhs.data.v_string.len != rhs.data.v_string.len) return false;
|
|
|
|
|
return std::memcmp(lhs.data.v_string.str, rhs.data.v_string.str,
|
|
|
|
|
lhs.data.v_string.len) == 0;
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_BOOLEAN_ARRAY:
|
2015-06-25 22:57:43 -07:00
|
|
|
if (lhs.data.arr_boolean.size != rhs.data.arr_boolean.size) return false;
|
|
|
|
|
return std::memcmp(lhs.data.arr_boolean.arr, rhs.data.arr_boolean.arr,
|
|
|
|
|
lhs.data.arr_boolean.size *
|
|
|
|
|
sizeof(lhs.data.arr_boolean.arr[0])) == 0;
|
2015-06-21 21:02:10 -07:00
|
|
|
case NT_DOUBLE_ARRAY:
|
2015-06-25 22:57:43 -07:00
|
|
|
if (lhs.data.arr_double.size != rhs.data.arr_double.size) return false;
|
|
|
|
|
return std::memcmp(lhs.data.arr_double.arr, rhs.data.arr_double.arr,
|
|
|
|
|
lhs.data.arr_double.size *
|
|
|
|
|
sizeof(lhs.data.arr_double.arr[0])) == 0;
|
|
|
|
|
case NT_STRING_ARRAY: {
|
|
|
|
|
if (lhs.data.arr_string.size != rhs.data.arr_string.size) return false;
|
|
|
|
|
for (size_t i = 0; i < lhs.data.arr_string.size; i++) {
|
|
|
|
|
if (lhs.data.arr_string.arr[i].len != rhs.data.arr_string.arr[i].len)
|
|
|
|
|
return false;
|
|
|
|
|
if (std::memcmp(lhs.data.arr_string.arr[i].str,
|
|
|
|
|
rhs.data.arr_string.arr[i].str,
|
|
|
|
|
lhs.data.arr_string.arr[i].len) != 0)
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
return true;
|
2015-06-21 21:02:10 -07:00
|
|
|
}
|
|
|
|
|
default:
|
2015-06-25 22:57:43 -07:00
|
|
|
// assert(false && "unknown value type");
|
|
|
|
|
return false;
|
|
|
|
|
}
|
2015-06-21 21:02:10 -07:00
|
|
|
}
|