// Copyright 2016 Etix Labs // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #pragma once #include #include #include #include namespace etix { namespace cameradar { //! The interface a cache_manager should implement to be valid class cache_manager_iface { public: virtual ~cache_manager_iface() {} //! Launches the manager configuration //! \return false if failed virtual bool configure(std::shared_ptr configuration) = 0; //! get the name of the cache manager virtual const std::string& get_name() const = 0; //! Replaces all cached streams by the content of the vector given as //! parameter virtual void set_streams(std::vector model) = 0; //! Inserts a single stream to the cache virtual void update_stream(const etix::cameradar::stream_model& newmodel) = 0; //! Gets all cached streams virtual std::vector get_streams() = 0; //! Gets all valid streams which have been accessed virtual std::vector get_valid_streams() = 0; }; class cache_manager_base : public cache_manager_iface { public: cache_manager_base() = default; virtual ~cache_manager_base() = default; //! Launches the cache manager configuration //! \return false if failed virtual bool configure(std::shared_ptr configuration) = 0; //! get the name of the cache manager virtual const std::string& get_name() const = 0; //! Replaces all cached streams by the content of the vector given as //! parameter virtual void set_streams(std::vector model) = 0; //! Updates a single stream to the cache virtual void update_stream(const etix::cameradar::stream_model& newmodel) = 0; //! Gets all cached streams virtual std::vector get_streams() = 0; //! Gets all valid streams which have been accessed virtual std::vector get_valid_streams() = 0; //! Get the manager's instance cache_manager_base& get_instance(); template std::shared_ptr get() { static_assert(std::is_base_of::value, "I must implement cache_manager_base"); std::shared_ptr cache_manager(dynamic_cast(this)); if (not cache_manager) return nullptr; return cache_manager->template get(); } }; //! The representation of a cache manager //! //! This class loads a shared library, and tries to call an extern "C" //! function which should instanciate a new instance of the plugin. class cache_manager { private: static const std::string PLUGIN_EXT; static const std::string default_symbol; //! the name of the cache manager std::string name; //! The path where the manager is located //! should be specified in the configuration file std::string path; //! The symbol entry point of the manager to //! call to create an instance from the shared library std::string symbol; //! The handle to the shared library where is stored the manager void* handle = nullptr; //! The cache manager instance if it is successfully loaded cache_manager_iface* ptr = nullptr; //! Internal function that creates the full path of the cache manager //! //! full path is composed of: the path, the name, the string "_cache-manager" //! and the extension PLUGIN_EXT depending of the platform std::string make_full_path(); public: //! Delete constructor cache_manager() = delete; //! The manager needs a path and a symbol to be instantiated. //! The symbol can be changed if the plugin entry point //! is different than the standard one. cache_manager(const std::string& path, const std::string& name, const std::string& symbol = default_symbol); // //! Copy constructor // cache_manager(cache_manager &other); //! Move constructor cache_manager(cache_manager&& old); ~cache_manager(); //! Creates the instance of the cache_manager //! // \return false if the cache_manager failed to be instantiated or if // the cache_manager is not a valid cache manager, true otherwise bool make_instance(); template std::shared_ptr get() { static_assert(std::is_base_of::value, "I must implement plugin_base"); return this->get(); } //! Helper to access internal loaded cache_manager //! //! Gives access to the methods of the cache_manager using the operator //! -> (e.g.: cache_manager->get_name()); cache_manager_iface* operator->(); const cache_manager_iface* operator->() const; //! helper function to check if a cache_manager is instantiated or not friend bool operator==(std::nullptr_t nullp, const cache_manager& p); //! helper function to check if a cache_manager is instantiated or not friend bool operator==(const cache_manager& p, std::nullptr_t nullp); //! helper function to check if a cache_manager is instantiated or not friend bool operator!=(std::nullptr_t nullp, const cache_manager& p); //! helper function to check if a cache_manager is instantiated or not friend bool operator!=(const cache_manager& p, std::nullptr_t nullp); }; } }