Squashed 'third_party/ntcore_2016/' content from commit d8de5e4
Change-Id: Id4839f41b6a620d8bae58dcf1710016671cc4992
git-subtree-dir: third_party/ntcore_2016
git-subtree-split: d8de5e4f19e612e7102172c0dbf152ce82d3d63a
diff --git a/include/networktables/NetworkTable.h b/include/networktables/NetworkTable.h
new file mode 100644
index 0000000..0a2b692
--- /dev/null
+++ b/include/networktables/NetworkTable.h
@@ -0,0 +1,379 @@
+/*----------------------------------------------------------------------------*/
+/* 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. */
+/*----------------------------------------------------------------------------*/
+
+#ifndef NETWORKTABLE_H_
+#define NETWORKTABLE_H_
+
+#include <functional>
+#include <mutex>
+#include <vector>
+
+#include "tables/ITable.h"
+
+/**
+ * A network table that knows its subtable path.
+ */
+class NetworkTable : public ITable {
+ private:
+ struct private_init {};
+
+ std::string m_path;
+ std::mutex m_mutex;
+ typedef std::pair<ITableListener*, unsigned int> Listener;
+ std::vector<Listener> m_listeners;
+
+ static std::string s_ip_address;
+ static std::string s_persistent_filename;
+ static bool s_client;
+ static bool s_running;
+ static unsigned int s_port;
+
+ public:
+ NetworkTable(llvm::StringRef path, const private_init&);
+ virtual ~NetworkTable();
+
+ /**
+ * The path separator for sub-tables and keys
+ *
+ */
+ static const char PATH_SEPARATOR_CHAR;
+
+ /**
+ * @throws IOException
+ */
+ static void Initialize();
+ static void Shutdown();
+
+ /**
+ * set that network tables should be a client
+ * This must be called before initialize or GetTable
+ */
+ static void SetClientMode();
+
+ /**
+ * set that network tables should be a server
+ * This must be called before initialize or GetTable
+ */
+ static void SetServerMode();
+
+ /**
+ * set the team the robot is configured for (this will set the mdns address
+ * that network tables will connect to in client mode)
+ * This must be called before initialize or GetTable
+ * @param team the team number
+ */
+ static void SetTeam(int team);
+
+ /**
+ * @param address the adress that network tables will connect to in client
+ * mode
+ */
+ static void SetIPAddress(llvm::StringRef address);
+
+ /**
+ * @param port the port number that network tables will connect to in client
+ * mode or listen to in server mode
+ */
+ static void SetPort(unsigned int port);
+
+ /**
+ * Sets the persistent filename.
+ * @param filename the filename that the network tables server uses for
+ * automatic loading and saving of persistent values
+ */
+ static void SetPersistentFilename(llvm::StringRef filename);
+
+ /**
+ * Sets the network identity.
+ * This is provided in the connection info on the remote end.
+ * @param name identity
+ */
+ static void SetNetworkIdentity(llvm::StringRef name);
+
+ /**
+ * Deletes ALL keys in ALL subtables. Use with caution!
+ */
+ static void GlobalDeleteAll();
+
+ /**
+ * Flushes all updated values immediately to the network.
+ * Note: This is rate-limited to protect the network from flooding.
+ * This is primarily useful for synchronizing network updates with
+ * user code.
+ */
+ static void Flush();
+
+ /**
+ * Set the periodic update rate.
+ *
+ * @param interval update interval in seconds (range 0.1 to 1.0)
+ */
+ static void SetUpdateRate(double interval);
+
+ /**
+ * Saves persistent keys to a file. The server does this automatically.
+ *
+ * @param filename file name
+ * @return Error (or nullptr).
+ */
+ static const char* SavePersistent(llvm::StringRef filename);
+
+ /**
+ * Loads persistent keys from a file. The server does this automatically.
+ *
+ * @param filename file name
+ * @param warn callback function called for warnings
+ * @return Error (or nullptr).
+ */
+ static const char* LoadPersistent(
+ llvm::StringRef filename,
+ std::function<void(size_t line, const char* msg)> warn);
+
+ /**
+ * Gets the table with the specified key. If the table does not exist, a new
+ *table will be created.<br>
+ * This will automatically initialize network tables if it has not been
+ *already
+ *
+ * @param key
+ * the key name
+ * @return the network table requested
+ */
+ static std::shared_ptr<NetworkTable> GetTable(llvm::StringRef key);
+
+ void AddTableListener(ITableListener* listener) override;
+ void AddTableListener(ITableListener* listener,
+ bool immediateNotify) override;
+ void AddTableListenerEx(ITableListener* listener,
+ unsigned int flags) override;
+ void AddTableListener(llvm::StringRef key, ITableListener* listener,
+ bool immediateNotify) override;
+ void AddTableListenerEx(llvm::StringRef key, ITableListener* listener,
+ unsigned int flags) override;
+ void AddSubTableListener(ITableListener* listener) override;
+ void AddSubTableListener(ITableListener* listener, bool localNotify) override;
+ void RemoveTableListener(ITableListener* listener) override;
+
+ /**
+ * Returns the table at the specified key. If there is no table at the
+ * specified key, it will create a new table
+ *
+ * @param key
+ * the key name
+ * @return the networktable to be returned
+ */
+ std::shared_ptr<ITable> GetSubTable(llvm::StringRef key) const override;
+
+ /**
+ * Determines whether the given key is in this table.
+ *
+ * @param key the key to search for
+ * @return true if the table as a value assigned to the given key
+ */
+ bool ContainsKey(llvm::StringRef key) const override;
+
+ /**
+ * Determines whether there exists a non-empty subtable for this key
+ * in this table.
+ *
+ * @param key the key to search for
+ * @return true if there is a subtable with the key which contains at least
+ * one key/subtable of its own
+ */
+ bool ContainsSubTable(llvm::StringRef key) const override;
+
+ /**
+ * @param types bitmask of types; 0 is treated as a "don't care".
+ * @return keys currently in the table
+ */
+ std::vector<std::string> GetKeys(int types = 0) const override;
+
+ /**
+ * @return subtables currently in the table
+ */
+ std::vector<std::string> GetSubTables() const override;
+
+ /**
+ * Makes a key's value persistent through program restarts.
+ *
+ * @param key the key to make persistent
+ */
+ void SetPersistent(llvm::StringRef key) override;
+
+ /**
+ * Stop making a key's value persistent through program restarts.
+ * The key cannot be null.
+ *
+ * @param key the key name
+ */
+ void ClearPersistent(llvm::StringRef key) override;
+
+ /**
+ * Returns whether the value is persistent through program restarts.
+ * The key cannot be null.
+ *
+ * @param key the key name
+ */
+ bool IsPersistent(llvm::StringRef key) const override;
+
+ /**
+ * Sets flags on the specified key in this table. The key can
+ * not be null.
+ *
+ * @param key the key name
+ * @param flags the flags to set (bitmask)
+ */
+ void SetFlags(llvm::StringRef key, unsigned int flags) override;
+
+ /**
+ * Clears flags on the specified key in this table. The key can
+ * not be null.
+ *
+ * @param key the key name
+ * @param flags the flags to clear (bitmask)
+ */
+ void ClearFlags(llvm::StringRef key, unsigned int flags) override;
+
+ /**
+ * Returns the flags for the specified key.
+ *
+ * @param key the key name
+ * @return the flags, or 0 if the key is not defined
+ */
+ unsigned int GetFlags(llvm::StringRef key) const override;
+
+ /**
+ * Deletes the specified key in this table.
+ *
+ * @param key the key name
+ */
+ void Delete(llvm::StringRef key) override;
+
+ /**
+ * Put a number in the table
+ *
+ * @param key the key to be assigned to
+ * @param value the value that will be assigned
+ * @return False if the table key already exists with a different type
+ */
+ bool PutNumber(llvm::StringRef key, double value) override;
+
+ /**
+ * Gets the number associated with the given name.
+ *
+ * @param key the key to look up
+ * @return the value associated with the given key
+ * @throws TableKeyNotDefinedException if there is no value associated with
+ * the given key
+ * @deprecated This exception-raising method has been replaced by the
+ * default-taking method.
+ */
+ NT_DEPRECATED("Raises an exception if key not found; "
+ "use GetNumber(StringRef key, double defaultValue) instead")
+ virtual double GetNumber(llvm::StringRef key) const override;
+
+ /**
+ * Gets the number associated with the given name.
+ *
+ * @param key the key to look up
+ * @param defaultValue the value to be returned if no value is found
+ * @return the value associated with the given key or the given default value
+ * if there is no value associated with the key
+ */
+ virtual double GetNumber(llvm::StringRef key,
+ double defaultValue) const override;
+
+ /**
+ * Put a string in the table
+ *
+ * @param key the key to be assigned to
+ * @param value the value that will be assigned
+ * @return False if the table key already exists with a different type
+ */
+ virtual bool PutString(llvm::StringRef key, llvm::StringRef value) override;
+
+ /**
+ * Gets the string associated with the given name.
+ *
+ * @param key the key to look up
+ * @return the value associated with the given key
+ * @throws TableKeyNotDefinedException if there is no value associated with
+ * the given key
+ * @deprecated This exception-raising method has been replaced by the
+ * default-taking method.
+ */
+ NT_DEPRECATED("Raises an exception if key not found; "
+ "use GetString(StringRef key, StringRef defaultValue) instead")
+ virtual std::string GetString(llvm::StringRef key) const override;
+
+ /**
+ * Gets the string associated with the given name. If the key does not
+ * exist or is of different type, it will return the default value.
+ *
+ * @param key the key to look up
+ * @param defaultValue the value to be returned if no value is found
+ * @return the value associated with the given key or the given default value
+ * if there is no value associated with the key
+ */
+ virtual std::string GetString(llvm::StringRef key,
+ llvm::StringRef defaultValue) const override;
+
+ /**
+ * Put a boolean in the table
+ *
+ * @param key the key to be assigned to
+ * @param value the value that will be assigned
+ * @return False if the table key already exists with a different type
+ */
+ virtual bool PutBoolean(llvm::StringRef key, bool value) override;
+
+ /**
+ * Gets the boolean associated with the given name.
+ *
+ * @param key the key to look up
+ * @return the value associated with the given key
+ * @throws TableKeyNotDefinedException if there is no value associated with
+ * the given key
+ * @deprecated This exception-raising method has been replaced by the
+ * default-taking method.
+ */
+ NT_DEPRECATED("Raises an exception if key not found; "
+ "use GetBoolean(StringRef key, bool defaultValue) instead")
+ virtual bool GetBoolean(llvm::StringRef key) const override;
+
+ /**
+ * Gets the boolean associated with the given name. If the key does not
+ * exist or is of different type, it will return the default value.
+ *
+ * @param key the key to look up
+ * @param defaultValue the value to be returned if no value is found
+ * @return the value associated with the given key or the given default value
+ * if there is no value associated with the key
+ */
+ virtual bool GetBoolean(llvm::StringRef key,
+ bool defaultValue) const override;
+
+ /**
+ * Put a value in the table
+ *
+ * @param key the key to be assigned to
+ * @param value the value that will be assigned
+ * @return False if the table key already exists with a different type
+ */
+ bool PutValue(llvm::StringRef key, std::shared_ptr<nt::Value> value) override;
+
+ /**
+ * Gets the value associated with a key as an object
+ *
+ * @param key the key of the value to look up
+ * @return the value associated with the given key, or nullptr if the key
+ * does not exist
+ */
+ std::shared_ptr<nt::Value> GetValue(llvm::StringRef key) const override;
+};
+
+#endif // NETWORKTABLE_H_