From 86d4899a54af62c659f5c41a23b4c4e7a5270c5d Mon Sep 17 00:00:00 2001 From: Peter Johnson Date: Sun, 12 Nov 2017 21:57:28 -0800 Subject: [PATCH] Make NetworkTable constructor private/package-private. (#253) Users should be using either NetworkTableInstance.getTable() or NetworkTable.getSubTable(). --- .../java/edu/wpi/first/networktables/NetworkTable.java | 5 ++++- src/main/native/cpp/networktables/NetworkTable.cpp | 4 ++-- .../native/cpp/networktables/NetworkTableInstance.cpp | 9 ++++++--- src/main/native/include/networktables/NetworkTable.h | 9 ++++++++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/src/main/java/edu/wpi/first/networktables/NetworkTable.java b/src/main/java/edu/wpi/first/networktables/NetworkTable.java index 812939fe81..2ff3c2917b 100644 --- a/src/main/java/edu/wpi/first/networktables/NetworkTable.java +++ b/src/main/java/edu/wpi/first/networktables/NetworkTable.java @@ -28,7 +28,10 @@ public final class NetworkTable { private final String pathWithSep; private final NetworkTableInstance inst; - public NetworkTable(NetworkTableInstance inst, String path) { + /** + * Constructor. Use NetworkTableInstance.getTable() or getSubTable() instead. + */ + NetworkTable(NetworkTableInstance inst, String path) { this.path = path; this.pathWithSep = path + PATH_SEPARATOR; this.inst = inst; diff --git a/src/main/native/cpp/networktables/NetworkTable.cpp b/src/main/native/cpp/networktables/NetworkTable.cpp index d351c39302..0f5872607a 100644 --- a/src/main/native/cpp/networktables/NetworkTable.cpp +++ b/src/main/native/cpp/networktables/NetworkTable.cpp @@ -124,7 +124,7 @@ std::shared_ptr NetworkTable::GetTable(StringRef key) { return NetworkTableInstance::GetDefault().GetTable(key); } -NetworkTable::NetworkTable(NT_Inst inst, StringRef path) +NetworkTable::NetworkTable(NT_Inst inst, StringRef path, const private_init&) : m_inst(inst), m_path(path) {} NetworkTable::~NetworkTable() { @@ -282,7 +282,7 @@ std::shared_ptr NetworkTable::GetSubTable(StringRef key) const { llvm::SmallString<128> path(m_path); path += PATH_SEPARATOR_CHAR; path += key; - return std::make_shared(m_inst, path); + return std::make_shared(m_inst, path, private_init{}); } bool NetworkTable::ContainsKey(StringRef key) const { diff --git a/src/main/native/cpp/networktables/NetworkTableInstance.cpp b/src/main/native/cpp/networktables/NetworkTableInstance.cpp index 1e62f865bc..1e11edcbc7 100644 --- a/src/main/native/cpp/networktables/NetworkTableInstance.cpp +++ b/src/main/native/cpp/networktables/NetworkTableInstance.cpp @@ -13,14 +13,17 @@ using namespace nt; std::shared_ptr NetworkTableInstance::GetTable( StringRef key) const { if (key.empty() || key == "/") { - return std::make_shared(m_handle, ""); + return std::make_shared(m_handle, "", + NetworkTable::private_init{}); } else if (key[0] == NetworkTable::PATH_SEPARATOR_CHAR) { - return std::make_shared(m_handle, key); + return std::make_shared(m_handle, key, + NetworkTable::private_init{}); } else { llvm::SmallString<128> path; path += NetworkTable::PATH_SEPARATOR_CHAR; path += key; - return std::make_shared(m_handle, path); + return std::make_shared(m_handle, path, + NetworkTable::private_init{}); } } diff --git a/src/main/native/include/networktables/NetworkTable.h b/src/main/native/include/networktables/NetworkTable.h index b3a8f2fa05..b867187951 100644 --- a/src/main/native/include/networktables/NetworkTable.h +++ b/src/main/native/include/networktables/NetworkTable.h @@ -50,8 +50,15 @@ class NetworkTable final : public ITable { static bool s_running; static unsigned int s_port; + struct private_init {}; + friend class NetworkTableInstance; + public: - NetworkTable(NT_Inst inst, StringRef path); + /** + * Constructor. Use NetworkTableInstance::GetTable() or GetSubTable() + * instead. + */ + NetworkTable(NT_Inst inst, StringRef path, const private_init&); virtual ~NetworkTable(); /**