// 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 PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_ #define PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_ #include "ppapi/c/pp_resource.h" #include "ppapi/shared_impl/ppapi_shared_export.h" namespace ppapi { class Resource; // This is a version of scoped_refptr but for PP_Resources. class PPAPI_SHARED_EXPORT ScopedPPResource { public: struct PassRef {}; ScopedPPResource(); // Takes one reference to the given resource. explicit ScopedPPResource(PP_Resource resource); // Assumes responsibility for one ref that the resource already has. explicit ScopedPPResource(const PassRef&, PP_Resource resource); // Helper to get the PP_Resource out of the given object and take a reference // to it. explicit ScopedPPResource(Resource* resource); // Implicit copy constructor allowed. ScopedPPResource(const ScopedPPResource& other); ~ScopedPPResource(); ScopedPPResource& operator=(PP_Resource resource); ScopedPPResource& operator=(const ScopedPPResource& resource); // Returns the PP_Resource without affecting the refcounting. PP_Resource get() const { return id_; } operator PP_Resource() const { return id_; } // Returns the PP_Resource, passing the reference to the caller. This class // will no longer hold the resource. PP_Resource Release(); private: // Helpers to addref or release the id_ if it's non-NULL. The id_ value will // be unchanged. void CallAddRef(); void CallRelease(); PP_Resource id_; }; } // namespace ppapi #endif // PPAPI_SHARED_IMPL_SCOPED_RESOURCE_H_