14 #include <type_traits>
17 #include "llvm/ArrayRef.h"
18 #include "llvm/StringRef.h"
25 using llvm::StringRef;
29 struct private_init {};
33 Value(NT_Type type,
const private_init&);
36 NT_Type type()
const {
return m_val.type; }
37 const NT_Value& value()
const {
return m_val; }
38 unsigned long long last_change()
const {
return m_val.last_change; }
43 bool IsBoolean()
const {
return m_val.type == NT_BOOLEAN; }
44 bool IsDouble()
const {
return m_val.type == NT_DOUBLE; }
45 bool IsString()
const {
return m_val.type == NT_STRING; }
46 bool IsRaw()
const {
return m_val.type == NT_RAW; }
47 bool IsRpc()
const {
return m_val.type == NT_RPC; }
48 bool IsBooleanArray()
const {
return m_val.type == NT_BOOLEAN_ARRAY; }
49 bool IsDoubleArray()
const {
return m_val.type == NT_DOUBLE_ARRAY; }
50 bool IsStringArray()
const {
return m_val.type == NT_STRING_ARRAY; }
55 bool GetBoolean()
const {
56 assert(m_val.type == NT_BOOLEAN);
57 return m_val.data.v_boolean != 0;
59 double GetDouble()
const {
60 assert(m_val.type == NT_DOUBLE);
61 return m_val.data.v_double;
63 StringRef GetString()
const {
64 assert(m_val.type == NT_STRING);
67 StringRef GetRaw()
const {
68 assert(m_val.type == NT_RAW);
71 StringRef GetRpc()
const {
72 assert(m_val.type == NT_RPC);
75 ArrayRef<int> GetBooleanArray()
const {
76 assert(m_val.type == NT_BOOLEAN_ARRAY);
77 return ArrayRef<int>(m_val.data.arr_boolean.arr,
78 m_val.data.arr_boolean.size);
80 ArrayRef<double> GetDoubleArray()
const {
81 assert(m_val.type == NT_DOUBLE_ARRAY);
82 return ArrayRef<double>(m_val.data.arr_double.arr,
83 m_val.data.arr_double.size);
85 ArrayRef<std::string> GetStringArray()
const {
86 assert(m_val.type == NT_STRING_ARRAY);
87 return m_string_array;
90 static std::shared_ptr<Value> MakeBoolean(
bool value) {
91 auto val = std::make_shared<Value>(NT_BOOLEAN, private_init());
92 val->m_val.data.v_boolean = value;
95 static std::shared_ptr<Value> MakeDouble(
double value) {
96 auto val = std::make_shared<Value>(NT_DOUBLE, private_init());
97 val->m_val.data.v_double = value;
100 static std::shared_ptr<Value> MakeString(StringRef value) {
101 auto val = std::make_shared<Value>(NT_STRING, private_init());
102 val->m_string = value;
103 val->m_val.data.v_string.str =
const_cast<char*
>(val->m_string.c_str());
104 val->m_val.data.v_string.len = val->m_string.size();
108 template <
typename T,
109 typename = std::enable_if_t<std::is_same<T, std::string>>>
111 template <
typename T,
112 typename std::enable_if<std::is_same<T, std::string>::value>::type>
114 static std::shared_ptr<Value> MakeString(T&& value) {
115 auto val = std::make_shared<Value>(NT_STRING, private_init());
116 val->m_string = std::move(value);
117 val->m_val.data.v_string.str =
const_cast<char*
>(val->m_string.c_str());
118 val->m_val.data.v_string.len = val->m_string.size();
121 static std::shared_ptr<Value> MakeRaw(StringRef value) {
122 auto val = std::make_shared<Value>(NT_RAW, private_init());
123 val->m_string = value;
124 val->m_val.data.v_raw.str =
const_cast<char*
>(val->m_string.c_str());
125 val->m_val.data.v_raw.len = val->m_string.size();
129 template <
typename T,
130 typename = std::enable_if_t<std::is_same<T, std::string>>>
132 template <
typename T,
133 typename std::enable_if<std::is_same<T, std::string>::value>::type>
135 static std::shared_ptr<Value> MakeRaw(T&& value) {
136 auto val = std::make_shared<Value>(NT_RAW, private_init());
137 val->m_string = std::move(value);
138 val->m_val.data.v_raw.str =
const_cast<char*
>(val->m_string.c_str());
139 val->m_val.data.v_raw.len = val->m_string.size();
142 static std::shared_ptr<Value> MakeRpc(StringRef value) {
143 auto val = std::make_shared<Value>(NT_RPC, private_init());
144 val->m_string = value;
145 val->m_val.data.v_raw.str =
const_cast<char*
>(val->m_string.c_str());
146 val->m_val.data.v_raw.len = val->m_string.size();
149 template <
typename T>
150 static std::shared_ptr<Value> MakeRpc(T&& value) {
151 auto val = std::make_shared<Value>(NT_RPC, private_init());
152 val->m_string = std::move(value);
153 val->m_val.data.v_raw.str =
const_cast<char*
>(val->m_string.c_str());
154 val->m_val.data.v_raw.len = val->m_string.size();
158 static std::shared_ptr<Value> MakeBooleanArray(ArrayRef<int> value);
159 static std::shared_ptr<Value> MakeDoubleArray(ArrayRef<double> value);
160 static std::shared_ptr<Value> MakeStringArray(ArrayRef<std::string> value);
163 static std::shared_ptr<Value> MakeStringArray(
164 std::vector<std::string>&& value);
168 friend bool operator==(
const Value& lhs,
const Value& rhs);
172 std::string m_string;
173 std::vector<std::string> m_string_array;
176 bool operator==(
const Value& lhs,
const Value& rhs);
177 inline bool operator!=(
const Value& lhs,
const Value& rhs) {
178 return !(lhs == rhs);
183 #endif // NT_VALUE_H_
NetworkTables Entry Value.
Definition: ntcore_c.h:89
NetworkTables Entry Value.
Definition: nt_Value.h:28