// Copyright (c) 2011 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef BASE_SCOPED_NATIVE_LIBRARY_H_ #define BASE_SCOPED_NATIVE_LIBRARY_H_ #include "base/base_export.h" #include "base/native_library.h" #include "base/scoped_generic.h" namespace base { class FilePath; struct BASE_EXPORT NativeLibraryTraits { // It's assumed that this is a fast inline function with little-to-no // penalty for duplicate calls. This must be a static function even // for stateful traits. static NativeLibrary InvalidValue() { return nullptr; } // This free function will not be called if library == InvalidValue()! static void Free(NativeLibrary library); }; // A class which encapsulates a base::NativeLibrary object available only in a // scope. // This class automatically unloads the loaded library in its destructor. class BASE_EXPORT ScopedNativeLibrary : public ScopedGeneric { public: // Initializes with a NULL library. ScopedNativeLibrary(); // Takes ownership of the given library handle. explicit ScopedNativeLibrary(NativeLibrary library); // Opens the given library and manages its lifetime. explicit ScopedNativeLibrary(const FilePath& library_path); // Move constructor. Takes ownership of handle stored in |scoped_library| ScopedNativeLibrary(ScopedNativeLibrary&& scoped_library); // Move assignment operator. Takes ownership of handle stored in // |scoped_library|. ScopedNativeLibrary& operator=(ScopedNativeLibrary&& scoped_library) = default; ScopedNativeLibrary(const ScopedNativeLibrary&) = delete; ScopedNativeLibrary& operator=(const ScopedNativeLibrary&) = delete; ~ScopedNativeLibrary() override; void* GetFunctionPointer(const char* function_name) const; const NativeLibraryLoadError* GetError() const; private: NativeLibraryLoadError error_; }; } // namespace base #endif // BASE_SCOPED_NATIVE_LIBRARY_H_