1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef PPAPI_SHARED_IMPL_SCOPED_PP_VAR_H_
6#define PPAPI_SHARED_IMPL_SCOPED_PP_VAR_H_
7
8#include <stdlib.h>
9
10#include "base/macros.h"
11#include "ppapi/c/pp_var.h"
12#include "ppapi/shared_impl/ppapi_shared_export.h"
13
14namespace ppapi {
15
16class PPAPI_SHARED_EXPORT ScopedPPVar {
17 public:
18  struct PassRef {};
19
20  ScopedPPVar();
21
22  // Takes one reference to the given var.
23  explicit ScopedPPVar(const PP_Var& v);
24
25  // Assumes responsibility for one ref that the var already has.
26  ScopedPPVar(const PassRef&, const PP_Var& v);
27
28  // Implicit copy constructor allowed.
29  ScopedPPVar(const ScopedPPVar& other);
30
31  ~ScopedPPVar();
32
33  ScopedPPVar& operator=(const PP_Var& r);
34  ScopedPPVar& operator=(const ScopedPPVar& other) {
35    return operator=(other.var_);
36  }
37
38  const PP_Var& get() const { return var_; }
39
40  // Returns the PP_Var, passing the reference to the caller. This class
41  // will no longer hold the var.
42  PP_Var Release();
43
44 private:
45  PP_Var var_;
46};
47
48// An array of PP_Vars which will be deallocated and have their references
49// decremented when they go out of scope.
50class PPAPI_SHARED_EXPORT ScopedPPVarArray {
51 public:
52  struct PassPPBMemoryAllocatedArray {};
53
54  // Assumes responsibility for one ref of each of the vars in the array as
55  // well as the array memory allocated by PPB_Memory_Dev.
56  // TODO(raymes): Add compatibility for arrays allocated with C++ "new".
57  ScopedPPVarArray(const PassPPBMemoryAllocatedArray&,
58                   PP_Var* array,
59                   size_t size);
60
61  explicit ScopedPPVarArray(size_t size);
62  ~ScopedPPVarArray();
63
64  // Passes ownership of the vars and the underlying array memory to the caller.
65  // Note that the memory has been allocated with PPB_Memory_Dev.
66  PP_Var* Release(const PassPPBMemoryAllocatedArray&);
67
68  PP_Var* get() { return array_; }
69  size_t size() { return size_; }
70
71  // Takes a ref to |var|. The refcount of the existing var will be decremented.
72  void Set(size_t index, const ScopedPPVar& var);
73  const PP_Var& operator[](size_t index) { return array_[index]; }
74
75 private:
76  // TODO(raymes): Consider supporting copy/assign.
77  DISALLOW_COPY_AND_ASSIGN(ScopedPPVarArray);
78
79  PP_Var* array_;
80  size_t size_;
81};
82
83}  // namespace ppapi
84
85#endif  // PPAPI_SHARED_IMPL_SCOPED_PP_VAR_H_
86