#pragma once #include #include #include #include namespace DB { /** Allows you to open a dynamic library and get a pointer to a function from it. */ class SharedLibrary : private boost::noncopyable { public: explicit SharedLibrary(const std::string & path, int flags = RTLD_LAZY); ~SharedLibrary(); template Func get(const std::string & name) { return reinterpret_cast(getImpl(name)); } template Func tryGet(const std::string & name) { return reinterpret_cast(getImpl(name, true)); } private: void * getImpl(const std::string & name, bool no_throw = false); void * handle = nullptr; }; using SharedLibraryPtr = std::shared_ptr; }