WPILibC++  unspecified
NetworkTableValue.h
1 /*----------------------------------------------------------------------------*/
2 /* Copyright (c) FIRST 2015. All Rights Reserved. */
3 /* Open Source Software - may be modified and shared by FRC teams. The code */
4 /* must be accompanied by the FIRST BSD license file in the root directory of */
5 /* the project. */
6 /*----------------------------------------------------------------------------*/
7 
8 #ifndef NT_VALUE_H_
9 #define NT_VALUE_H_
10 
11 #include <cassert>
12 #include <memory>
13 #include <string>
14 #include <type_traits>
15 #include <vector>
16 
17 #include "llvm/ArrayRef.h"
18 #include "llvm/StringRef.h"
19 
20 #include "ntcore_c.h"
21 
22 namespace nt {
23 
24 using llvm::ArrayRef;
25 using llvm::StringRef;
26 
30 class Value final {
31  struct private_init {};
32 
33  public:
34  Value();
35  Value(NT_Type type, unsigned long long time, const private_init&);
36  ~Value();
37 
42  NT_Type type() const { return m_val.type; }
43 
48  const NT_Value& value() const { return m_val; }
49 
54  unsigned long long last_change() const { return m_val.last_change; }
55 
60  unsigned long long time() const { return m_val.last_change; }
61 
71  bool IsValid() const { return m_val.type != NT_UNASSIGNED; }
72 
77  bool IsBoolean() const { return m_val.type == NT_BOOLEAN; }
78 
83  bool IsDouble() const { return m_val.type == NT_DOUBLE; }
84 
89  bool IsString() const { return m_val.type == NT_STRING; }
90 
95  bool IsRaw() const { return m_val.type == NT_RAW; }
96 
101  bool IsRpc() const { return m_val.type == NT_RPC; }
102 
107  bool IsBooleanArray() const { return m_val.type == NT_BOOLEAN_ARRAY; }
108 
113  bool IsDoubleArray() const { return m_val.type == NT_DOUBLE_ARRAY; }
114 
119  bool IsStringArray() const { return m_val.type == NT_STRING_ARRAY; }
120 
132  bool GetBoolean() const {
133  assert(m_val.type == NT_BOOLEAN);
134  return m_val.data.v_boolean != 0;
135  }
136 
141  double GetDouble() const {
142  assert(m_val.type == NT_DOUBLE);
143  return m_val.data.v_double;
144  }
145 
151  assert(m_val.type == NT_STRING);
152  return m_string;
153  }
154 
159  StringRef GetRaw() const {
160  assert(m_val.type == NT_RAW);
161  return m_string;
162  }
163 
168  StringRef GetRpc() const {
169  assert(m_val.type == NT_RPC);
170  return m_string;
171  }
172 
178  assert(m_val.type == NT_BOOLEAN_ARRAY);
179  return ArrayRef<int>(m_val.data.arr_boolean.arr,
180  m_val.data.arr_boolean.size);
181  }
182 
188  assert(m_val.type == NT_DOUBLE_ARRAY);
189  return ArrayRef<double>(m_val.data.arr_double.arr,
190  m_val.data.arr_double.size);
191  }
192 
198  assert(m_val.type == NT_STRING_ARRAY);
199  return m_string_array;
200  }
201 
216  static std::shared_ptr<Value> MakeBoolean(bool value,
217  unsigned long long time = 0) {
218  auto val = std::make_shared<Value>(NT_BOOLEAN, time, private_init());
219  val->m_val.data.v_boolean = value;
220  return val;
221  }
222 
230  static std::shared_ptr<Value> MakeDouble(double value,
231  unsigned long long time = 0) {
232  auto val = std::make_shared<Value>(NT_DOUBLE, time, private_init());
233  val->m_val.data.v_double = value;
234  return val;
235  }
236 
244  static std::shared_ptr<Value> MakeString(StringRef value,
245  unsigned long long time = 0) {
246  auto val = std::make_shared<Value>(NT_STRING, time, private_init());
247  val->m_string = value;
248  val->m_val.data.v_string.str = const_cast<char*>(val->m_string.c_str());
249  val->m_val.data.v_string.len = val->m_string.size();
250  return val;
251  }
252 
260 #ifdef _MSC_VER
261  template <typename T,
262  typename = std::enable_if_t<std::is_same<T, std::string>>>
263 #else
264  template <typename T,
265  typename std::enable_if<std::is_same<T, std::string>::value>::type>
266 #endif
267  static std::shared_ptr<Value> MakeString(T&& value,
268  unsigned long long time = 0) {
269  auto val = std::make_shared<Value>(NT_STRING, time, private_init());
270  val->m_string = std::move(value);
271  val->m_val.data.v_string.str = const_cast<char*>(val->m_string.c_str());
272  val->m_val.data.v_string.len = val->m_string.size();
273  return val;
274  }
275 
283  static std::shared_ptr<Value> MakeRaw(StringRef value,
284  unsigned long long time = 0) {
285  auto val = std::make_shared<Value>(NT_RAW, time, private_init());
286  val->m_string = value;
287  val->m_val.data.v_raw.str = const_cast<char*>(val->m_string.c_str());
288  val->m_val.data.v_raw.len = val->m_string.size();
289  return val;
290  }
291 
299 #ifdef _MSC_VER
300  template <typename T,
301  typename = std::enable_if_t<std::is_same<T, std::string>>>
302 #else
303  template <typename T,
304  typename std::enable_if<std::is_same<T, std::string>::value>::type>
305 #endif
306  static std::shared_ptr<Value> MakeRaw(T&& value,
307  unsigned long long time = 0) {
308  auto val = std::make_shared<Value>(NT_RAW, time, private_init());
309  val->m_string = std::move(value);
310  val->m_val.data.v_raw.str = const_cast<char*>(val->m_string.c_str());
311  val->m_val.data.v_raw.len = val->m_string.size();
312  return val;
313  }
314 
322  static std::shared_ptr<Value> MakeRpc(StringRef value,
323  unsigned long long time = 0) {
324  auto val = std::make_shared<Value>(NT_RPC, time, private_init());
325  val->m_string = value;
326  val->m_val.data.v_raw.str = const_cast<char*>(val->m_string.c_str());
327  val->m_val.data.v_raw.len = val->m_string.size();
328  return val;
329  }
330 
338  template <typename T>
339  static std::shared_ptr<Value> MakeRpc(T&& value,
340  unsigned long long time = 0) {
341  auto val = std::make_shared<Value>(NT_RPC, time, private_init());
342  val->m_string = std::move(value);
343  val->m_val.data.v_raw.str = const_cast<char*>(val->m_string.c_str());
344  val->m_val.data.v_raw.len = val->m_string.size();
345  return val;
346  }
347 
355  static std::shared_ptr<Value> MakeBooleanArray(ArrayRef<int> value,
356  unsigned long long time = 0);
357 
365  static std::shared_ptr<Value> MakeDoubleArray(ArrayRef<double> value,
366  unsigned long long time = 0);
367 
375  static std::shared_ptr<Value> MakeStringArray(ArrayRef<std::string> value,
376  unsigned long long time = 0);
377 
378  // Note: This function moves the values out of the vector.
379  static std::shared_ptr<Value> MakeStringArray(
380  std::vector<std::string>&& value, unsigned long long time = 0);
381 
384  Value(const Value&) = delete;
385  Value& operator=(const Value&) = delete;
386  friend bool operator==(const Value& lhs, const Value& rhs);
387 
388  private:
389  NT_Value m_val;
390  std::string m_string;
391  std::vector<std::string> m_string_array;
392 };
393 
394 bool operator==(const Value& lhs, const Value& rhs);
395 inline bool operator!=(const Value& lhs, const Value& rhs) {
396  return !(lhs == rhs);
397 }
398 
400 typedef Value NetworkTableValue;
401 
402 } // namespace nt
403 
404 #endif // NT_VALUE_H_
unsigned long long time() const
Get the creation time of the value.
Definition: NetworkTableValue.h:60
bool IsValid() const
Determine if entry value contains a value or is unassigned.
Definition: NetworkTableValue.h:71
NetworkTables Entry Value.
Definition: ntcore_c.h:108
static std::shared_ptr< Value > MakeStringArray(ArrayRef< std::string > value, unsigned long long time=0)
Creates a string array entry value.
Definition: Value.cpp:60
bool IsBooleanArray() const
Determine if entry value contains a boolean array.
Definition: NetworkTableValue.h:107
bool IsString() const
Determine if entry value contains a string.
Definition: NetworkTableValue.h:89
static std::shared_ptr< Value > MakeRpc(T &&value, unsigned long long time=0)
Creates a rpc entry value.
Definition: NetworkTableValue.h:339
ArrayRef< std::string > GetStringArray() const
Get the entry&#39;s string array value.
Definition: NetworkTableValue.h:197
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
Definition: ArrayRef.h:32
StringRef GetRpc() const
Get the entry&#39;s rpc definition value.
Definition: NetworkTableValue.h:168
ArrayRef< int > GetBooleanArray() const
Get the entry&#39;s boolean array value.
Definition: NetworkTableValue.h:177
static std::shared_ptr< Value > MakeRaw(StringRef value, unsigned long long time=0)
Creates a raw entry value.
Definition: NetworkTableValue.h:283
Definition: IEntryNotifier.h:15
static std::shared_ptr< Value > MakeRpc(StringRef value, unsigned long long time=0)
Creates a rpc entry value.
Definition: NetworkTableValue.h:322
bool IsDoubleArray() const
Determine if entry value contains a double array.
Definition: NetworkTableValue.h:113
ArrayRef< double > GetDoubleArray() const
Get the entry&#39;s double array value.
Definition: NetworkTableValue.h:187
static std::shared_ptr< Value > MakeBoolean(bool value, unsigned long long time=0)
Creates a boolean entry value.
Definition: NetworkTableValue.h:216
static std::shared_ptr< Value > MakeBooleanArray(ArrayRef< int > value, unsigned long long time=0)
Creates a boolean array entry value.
Definition: Value.cpp:42
static std::shared_ptr< Value > MakeDouble(double value, unsigned long long time=0)
Creates a double entry value.
Definition: NetworkTableValue.h:230
bool IsBoolean() const
Determine if entry value contains a boolean.
Definition: NetworkTableValue.h:77
NT_Type type() const
Get the data type.
Definition: NetworkTableValue.h:42
bool IsRpc() const
Determine if entry value contains a rpc definition.
Definition: NetworkTableValue.h:101
const NT_Value & value() const
Get the data value stored.
Definition: NetworkTableValue.h:48
double GetDouble() const
Get the entry&#39;s double value.
Definition: NetworkTableValue.h:141
StringRef GetRaw() const
Get the entry&#39;s raw value.
Definition: NetworkTableValue.h:159
static std::shared_ptr< Value > MakeString(T &&value, unsigned long long time=0)
Creates a string entry value.
Definition: NetworkTableValue.h:267
unsigned long long last_change() const
Get the creation time of the value.
Definition: NetworkTableValue.h:54
static std::shared_ptr< Value > MakeRaw(T &&value, unsigned long long time=0)
Creates a raw entry value.
Definition: NetworkTableValue.h:306
bool IsRaw() const
Determine if entry value contains a raw.
Definition: NetworkTableValue.h:95
bool IsDouble() const
Determine if entry value contains a double.
Definition: NetworkTableValue.h:83
bool GetBoolean() const
Get the entry&#39;s boolean value.
Definition: NetworkTableValue.h:132
bool IsStringArray() const
Determine if entry value contains a string array.
Definition: NetworkTableValue.h:119
char * str
String contents (UTF-8).
Definition: ntcore_c.h:98
A network table entry value.
Definition: NetworkTableValue.h:30
static std::shared_ptr< Value > MakeDoubleArray(ArrayRef< double > value, unsigned long long time=0)
Creates a double array entry value.
Definition: Value.cpp:51
StringRef GetString() const
Get the entry&#39;s string value.
Definition: NetworkTableValue.h:150
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:42
static std::shared_ptr< Value > MakeString(StringRef value, unsigned long long time=0)
Creates a string entry value.
Definition: NetworkTableValue.h:244