Add ComparatorApiManager with SmoCallbacks hooks and startup load.
Register comparator types via a dedicated manager and expose lookup/create hooks through SmoCallbacks so stimbuff libs can resolve comparators at load time. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
#ifndef COMPARATOR_API_MANAGER_H
|
||||
#define COMPARATOR_API_MANAGER_H
|
||||
|
||||
#include <cstdint>
|
||||
#include <memory>
|
||||
#include <optional>
|
||||
#include <string>
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
#include <user/comparator.h>
|
||||
#include <user/comparatorApiDesc.h>
|
||||
#include <comparatorLibs/comparatorLib.h>
|
||||
#include <spinscale/co/coQutex.h>
|
||||
#include <spinscale/sharedResourceGroup.h>
|
||||
|
||||
namespace smo {
|
||||
namespace comparator_lib {
|
||||
|
||||
class ComparatorApiManager
|
||||
{
|
||||
public:
|
||||
struct Resources
|
||||
{
|
||||
std::vector<std::shared_ptr<ComparatorLib>> libs;
|
||||
std::unordered_map<
|
||||
uint64_t, std::shared_ptr<cologex::ExportedComparatorTypeDesc>>
|
||||
typeRegistry;
|
||||
};
|
||||
|
||||
static ComparatorApiManager& getInstance()
|
||||
{
|
||||
static ComparatorApiManager instance;
|
||||
return instance;
|
||||
}
|
||||
|
||||
ComparatorLib& loadComparatorLib(const std::string& libraryPath);
|
||||
|
||||
void unloadComparatorLib(const std::string& libraryPath);
|
||||
|
||||
void unloadAllComparatorLibs(void);
|
||||
|
||||
std::optional<std::shared_ptr<ComparatorLib>> getComparatorLib(
|
||||
const std::string& libraryPath);
|
||||
|
||||
std::shared_ptr<cologex::ExportedComparatorTypeDesc> getComparatorType(
|
||||
cologex::ComparatorTypeId typeId);
|
||||
|
||||
std::unique_ptr<cologex::Comparator> getNewComparatorInstance(
|
||||
cologex::ComparatorTypeId typeId);
|
||||
|
||||
std::unique_ptr<cologex::Comparator> getNewComparatorInstance(
|
||||
const std::shared_ptr<cologex::ExportedComparatorTypeDesc>&
|
||||
comparatorType);
|
||||
|
||||
public:
|
||||
sscl::SharedResourceGroup<sscl::co::CoQutex, Resources> s;
|
||||
|
||||
private:
|
||||
ComparatorApiManager()
|
||||
: s("ComparatorApiManager")
|
||||
{}
|
||||
|
||||
~ComparatorApiManager() = default;
|
||||
|
||||
ComparatorApiManager(const ComparatorApiManager&) = delete;
|
||||
ComparatorApiManager& operator=(const ComparatorApiManager&) = delete;
|
||||
};
|
||||
|
||||
} // namespace comparator_lib
|
||||
} // namespace smo
|
||||
|
||||
#endif // COMPARATOR_API_MANAGER_H
|
||||
@@ -0,0 +1,64 @@
|
||||
#ifndef COMPARATOR_LIB_H
|
||||
#define COMPARATOR_LIB_H
|
||||
|
||||
#include <functional>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <user/comparatorApiDesc.h>
|
||||
#include <loadableLib/loadableLibraryManager.h>
|
||||
#include <spinscale/co/coQutex.h>
|
||||
#include <spinscale/sharedResourceGroup.h>
|
||||
|
||||
namespace smo {
|
||||
namespace comparator_lib {
|
||||
|
||||
class ComparatorApiManager;
|
||||
|
||||
class ComparatorLib
|
||||
{
|
||||
private:
|
||||
friend class ComparatorApiManager;
|
||||
|
||||
public:
|
||||
ComparatorLib(
|
||||
std::shared_ptr<loadable_lib::LoadableLibraryManager::LoadedSharedLibrary>
|
||||
_loadedSharedLibrary,
|
||||
SMO_GET_COMPARATOR_LIB_DESC_FN_TYPEDEF descFn)
|
||||
: loadedSharedLibrary(std::move(_loadedSharedLibrary)),
|
||||
SMO_GET_COMPARATOR_LIB_DESC_FN_NAME(descFn),
|
||||
s("ComparatorLib-" + loadedSharedLibrary->libraryPath)
|
||||
{}
|
||||
|
||||
void setComparatorLibDesc(const cologex::ComparatorLibDesc &desc)
|
||||
{
|
||||
if (!cologex::ComparatorLibDesc::sanityCheck(desc))
|
||||
{
|
||||
throw std::runtime_error(
|
||||
std::string(__func__) + ": Sanity check failed for comparator "
|
||||
"library descriptor in library '"
|
||||
+ loadedSharedLibrary->libraryPath + "'");
|
||||
}
|
||||
|
||||
comparatorLibDesc = desc;
|
||||
}
|
||||
|
||||
public:
|
||||
std::shared_ptr<loadable_lib::LoadableLibraryManager::LoadedSharedLibrary>
|
||||
loadedSharedLibrary;
|
||||
|
||||
std::function<SMO_GET_COMPARATOR_LIB_DESC_FN_TYPEDEF>
|
||||
SMO_GET_COMPARATOR_LIB_DESC_FN_NAME;
|
||||
|
||||
cologex::ComparatorLibDesc comparatorLibDesc;
|
||||
|
||||
struct ComparatorLibResources
|
||||
{};
|
||||
|
||||
sscl::SharedResourceGroup<
|
||||
sscl::co::CoQutex, ComparatorLibResources> s;
|
||||
};
|
||||
|
||||
} // namespace comparator_lib
|
||||
} // namespace smo
|
||||
|
||||
#endif // COMPARATOR_LIB_H
|
||||
Reference in New Issue
Block a user