diff --git a/ntcore/src/main/native/cpp/LocalStorage.h b/ntcore/src/main/native/cpp/LocalStorage.h index f4e15d404c..007e2b51a6 100644 --- a/ntcore/src/main/native/cpp/LocalStorage.h +++ b/ntcore/src/main/native/cpp/LocalStorage.h @@ -246,13 +246,29 @@ class LocalStorage final : public net::ILocalStorage { template Timestamped::Value> GetAtomic( - NT_Handle subentry, typename TypeInfo::View defaultValue); + NT_Handle subentry, typename TypeInfo::View defaultValue) { + std::scoped_lock lock{m_mutex}; + Value* value = m_impl.GetSubEntryValue(subentry); + if (value && (IsNumericConvertibleTo(*value) || IsType(*value))) { + return GetTimestamped(*value); + } else { + return {0, 0, CopyValue(defaultValue)}; + } + } template Timestamped::SmallRet> GetAtomic( NT_Handle subentry, wpi::SmallVectorImpl::SmallElem>& buf, - typename TypeInfo::View defaultValue); + typename TypeInfo::View defaultValue) { + std::scoped_lock lock{m_mutex}; + Value* value = m_impl.GetSubEntryValue(subentry); + if (value && (IsNumericConvertibleTo(*value) || IsType(*value))) { + return GetTimestamped(*value, buf); + } else { + return {0, 0, CopyValue(defaultValue, buf)}; + } + } std::vector ReadQueueValue(NT_Handle subentry, unsigned int types) { std::scoped_lock lock{m_mutex}; @@ -265,7 +281,14 @@ class LocalStorage final : public net::ILocalStorage { template std::vector::Value>> ReadQueue( - NT_Handle subentry); + NT_Handle subentry) { + std::scoped_lock lock{m_mutex}; + auto subscriber = m_impl.GetSubEntry(subentry); + if (!subscriber) { + return {}; + } + return subscriber->pollStorage.Read(); + } // // Backwards compatible user functions @@ -665,41 +688,4 @@ class LocalStorage final : public net::ILocalStorage { Impl m_impl; }; -template -Timestamped::Value> LocalStorage::GetAtomic( - NT_Handle subentry, typename TypeInfo::View defaultValue) { - std::scoped_lock lock{m_mutex}; - Value* value = m_impl.GetSubEntryValue(subentry); - if (value && (IsNumericConvertibleTo(*value) || IsType(*value))) { - return GetTimestamped(*value); - } else { - return {0, 0, CopyValue(defaultValue)}; - } -} - -template -Timestamped::SmallRet> LocalStorage::GetAtomic( - NT_Handle subentry, - wpi::SmallVectorImpl::SmallElem>& buf, - typename TypeInfo::View defaultValue) { - std::scoped_lock lock{m_mutex}; - Value* value = m_impl.GetSubEntryValue(subentry); - if (value && (IsNumericConvertibleTo(*value) || IsType(*value))) { - return GetTimestamped(*value, buf); - } else { - return {0, 0, CopyValue(defaultValue, buf)}; - } -} - -template -std::vector::Value>> LocalStorage::ReadQueue( - NT_Handle subentry) { - std::scoped_lock lock{m_mutex}; - auto subscriber = m_impl.GetSubEntry(subentry); - if (!subscriber) { - return {}; - } - return subscriber->pollStorage.Read(); -} - } // namespace nt