// Copyright 2023 PingCAP, Inc. // // 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 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); ~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; } // namespace DB