#ifndef SENSE_API_PROVIDER_DESC_H #define SENSE_API_PROVIDER_DESC_H #include #include #include #include #include #include namespace hk { namespace sense_api { /* C++ version of the C struct above, which Harikoff uses to manage the * lib and connect implexors to it. */ class SenseApiDesc { public: class ExportedImplexorApiDesc { public: const std::string name; }; public: SenseApiDesc(const CSenseApiDesc& cDesc) : cDescriptor(cDesc), name(cDesc.name) {} std::reference_wrapper cDescriptor; std::string name; // These options affect the sense api lib's behaviour globally. std::vector options; // These are the implexors whose APIs this lib exports. std::vector exportedImplexorApis; }; class SenseApiLib { public: typedef const CSenseApiDesc* (SenseApiDescGetterFn)(void); public: SenseApiLib(const std::string& path) : libraryPath(path), handle(nullptr, reinterpret_cast(&dlclose)) {} public: std::string libraryPath; std::unique_ptr handle; /** * @brief Every sense API lib is required to provide a function that returns * a CSenseApiDesc struct. This struct states which API the lib uses to * connect Harikoff to the sense provider it supports. * * This getter function should be visible to dlsym() so that Harikoff can * find it in the lib after loading it, and call it. */ std::function getSenseApiDescriptor; /** * @brief Harikoff will call the `getSenseApiDescriptor` getter function and * use the data it provides in order to fill out this descriptor. */ std::unique_ptr apiDescriptor; }; } // namespace sense_api } // namespace hk #endif // SENSE_API_PROVIDER_DESC_H