// 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_
