From d6cb55ef08f51c9ebef57e5bbcb95b03a65972a9 Mon Sep 17 00:00:00 2001 From: Lane Kolbly Date: Mon, 22 Jun 2020 18:06:38 -0500 Subject: uhd: Create discoverable feature registry implementation Classes which want to implement discoverable_feature can simply inherit from this registry and get access to an ergonomic map-backed registry of features. --- host/lib/CMakeLists.txt | 1 + host/lib/features/CMakeLists.txt | 12 +++++++ .../lib/features/discoverable_feature_registry.cpp | 34 ++++++++++++++++++ .../features/discoverable_feature_registry.hpp | 42 ++++++++++++++++++++++ 4 files changed, 89 insertions(+) create mode 100644 host/lib/features/CMakeLists.txt create mode 100644 host/lib/features/discoverable_feature_registry.cpp create mode 100644 host/lib/include/uhdlib/features/discoverable_feature_registry.hpp (limited to 'host/lib') diff --git a/host/lib/CMakeLists.txt b/host/lib/CMakeLists.txt index c5046420a..c0b39faea 100644 --- a/host/lib/CMakeLists.txt +++ b/host/lib/CMakeLists.txt @@ -83,6 +83,7 @@ LIBUHD_REGISTER_COMPONENT("DPDK" ENABLE_DPDK ON "ENABLE_MPMD;DPDK_FOUND" OFF OFF ######################################################################## INCLUDE_SUBDIRECTORY(include) INCLUDE_SUBDIRECTORY(cal) +INCLUDE_SUBDIRECTORY(features) INCLUDE_SUBDIRECTORY(ic_reg_maps) INCLUDE_SUBDIRECTORY(types) INCLUDE_SUBDIRECTORY(convert) diff --git a/host/lib/features/CMakeLists.txt b/host/lib/features/CMakeLists.txt new file mode 100644 index 000000000..2cdd1dd56 --- /dev/null +++ b/host/lib/features/CMakeLists.txt @@ -0,0 +1,12 @@ +# +# Copyright 2020 Ettus Research, a National Instruments Brand +# +# SPDX-License-Identifier: GPL-3.0-or-later +# + +######################################################################## +# This file included, use CMake directory variables +######################################################################## +LIBUHD_APPEND_SOURCES( + ${CMAKE_CURRENT_SOURCE_DIR}/discoverable_feature_registry.cpp +) diff --git a/host/lib/features/discoverable_feature_registry.cpp b/host/lib/features/discoverable_feature_registry.cpp new file mode 100644 index 000000000..5bed6a06e --- /dev/null +++ b/host/lib/features/discoverable_feature_registry.cpp @@ -0,0 +1,34 @@ +// +// Copyright 2020 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#include +#include +#include +#include + +namespace uhd { namespace features { + +std::vector +discoverable_feature_registry::enumerate_features() +{ + std::vector features; + for (auto& entry : _features) { + features.push_back(entry.second->get_feature_name()); + } + return features; +} + +discoverable_feature::sptr discoverable_feature_registry::get_feature_ptr( + discoverable_feature::feature_id_t feature_id) +{ + auto it = _features.find(feature_id); + if (it == _features.end()) { + return discoverable_feature::sptr(); + } + return it->second; +} + +}} // namespace uhd::features diff --git a/host/lib/include/uhdlib/features/discoverable_feature_registry.hpp b/host/lib/include/uhdlib/features/discoverable_feature_registry.hpp new file mode 100644 index 000000000..f27f1a4f1 --- /dev/null +++ b/host/lib/include/uhdlib/features/discoverable_feature_registry.hpp @@ -0,0 +1,42 @@ +// +// Copyright 2020 Ettus Research, a National Instruments Brand +// +// SPDX-License-Identifier: GPL-3.0-or-later +// + +#pragma once + +#include +#include +#include +#include +#include +#include + +namespace uhd { namespace features { + +/*! Map-based registry to implement discoverable_feature_getter_iface + */ +class discoverable_feature_registry : public virtual discoverable_feature_getter_iface +{ +public: + virtual ~discoverable_feature_registry() = default; + + std::vector enumerate_features() override; + + template + void register_feature(std::shared_ptr feature) + { + if (!_features.emplace(T::get_feature_id(), feature).second) { + UHD_ASSERT_THROW(false); + } + } + +private: + discoverable_feature::sptr get_feature_ptr( + discoverable_feature::feature_id_t feature_id) override; + + std::map _features; +}; + +}} // namespace uhd::features -- cgit v1.2.3