[ntcore] Cache GetEntry(name) values (#4531)

These are typically cached at higher levels anyway, but cache at lowest
C++ layer as well for consistency with NT3.
This commit is contained in:
Peter Johnson
2022-10-27 23:34:58 -07:00
committed by GitHub
parent dcda09f90a
commit 1c3c86e9f1
2 changed files with 17 additions and 4 deletions

View File

@@ -83,6 +83,7 @@ struct TopicData {
unsigned int flags{0}; // for NT3 APIs
std::string propertiesStr{"{}"}; // cached string for GetTopicInfo() et al
wpi::json properties = wpi::json::object();
NT_Entry entry{0}; // cached entry for GetEntry()
bool onNetwork{false}; // true if there are any remote publishers
@@ -2331,11 +2332,15 @@ NT_Entry LocalStorage::GetEntry(std::string_view name) {
// Get the topic data
auto* topic = m_impl->GetOrCreateTopic(name);
// Create subscriber
auto* subscriber = m_impl->AddLocalSubscriber(topic, {});
if (topic->entry == 0) {
// Create subscriber
auto* subscriber = m_impl->AddLocalSubscriber(topic, {});
// Create entry
return m_impl->AddEntry(subscriber)->handle;
// Create entry
topic->entry = m_impl->AddEntry(subscriber)->handle;
}
return topic->entry;
}
std::string LocalStorage::GetEntryName(NT_Handle subentryHandle) {

View File

@@ -63,6 +63,14 @@ TEST_F(LocalStorageTest, GetEntryEmptyName) {
EXPECT_EQ(storage.GetEntry(""), 0u);
}
TEST_F(LocalStorageTest, GetEntryCached) {
EXPECT_CALL(network, Subscribe(_, wpi::SpanEq({std::string{"tocache"}}),
IsPubSubOptions({})));
auto entry1 = storage.GetEntry("tocache");
EXPECT_EQ(entry1, storage.GetEntry("tocache"));
}
TEST_F(LocalStorageTest, GetTopicName) {
EXPECT_EQ(storage.GetTopicName(fooTopic), "foo");
EXPECT_EQ(storage.GetTopicName(barTopic), "bar");