/* * Copyright (C) 2018-2023 Intel Corporation * * SPDX-License-Identifier: MIT * */ #pragma once #include namespace NEO { struct ConvertibleProcAddr { template operator T *() const { static_assert(std::is_function::value, "Cannot convert to non-function and non-void* type"); return reinterpret_cast(ptr); } operator void *() const { return ptr; } void *ptr = nullptr; }; class OsLibrary { protected: OsLibrary() = default; public: virtual ~OsLibrary() = default; static OsLibrary *load(const std::string &name); static OsLibrary *load(const std::string &name, std::string *errorValue); static const std::string createFullSystemPath(const std::string &name); ConvertibleProcAddr operator[](const std::string &name) { return ConvertibleProcAddr{getProcAddress(name)}; } virtual void *getProcAddress(const std::string &procName) = 0; virtual bool isLoaded() = 0; virtual std::string getFullPath() = 0; }; } // namespace NEO