• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2008 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_SMART_POINTER_H_
29 #define V8_SMART_POINTER_H_
30 
31 namespace v8 {
32 namespace internal {
33 
34 
35 // A 'scoped array pointer' that calls DeleteArray on its pointer when the
36 // destructor is called.
37 template<typename T>
38 class SmartPointer {
39  public:
40 
41   // Default constructor. Construct an empty scoped pointer.
SmartPointer()42   inline SmartPointer() : p(NULL) {}
43 
44 
45   // Construct a scoped pointer from a plain one.
SmartPointer(T * pointer)46   explicit inline SmartPointer(T* pointer) : p(pointer) {}
47 
48 
49   // Copy constructor removes the pointer from the original to avoid double
50   // freeing.
SmartPointer(const SmartPointer<T> & rhs)51   inline SmartPointer(const SmartPointer<T>& rhs) : p(rhs.p) {
52     const_cast<SmartPointer<T>&>(rhs).p = NULL;
53   }
54 
55 
56   // When the destructor of the scoped pointer is executed the plain pointer
57   // is deleted using DeleteArray.  This implies that you must allocate with
58   // NewArray.
~SmartPointer()59   inline ~SmartPointer() { if (p) DeleteArray(p); }
60 
61 
62   // You can get the underlying pointer out with the * operator.
63   inline T* operator*() { return p; }
64 
65 
66   // You can use [n] to index as if it was a plain pointer
67   inline T& operator[](size_t i) {
68     return p[i];
69   }
70 
71   // We don't have implicit conversion to a T* since that hinders migration:
72   // You would not be able to change a method from returning a T* to
73   // returning an SmartPointer<T> and then get errors wherever it is used.
74 
75 
76   // If you want to take out the plain pointer and don't want it automatically
77   // deleted then call Detach().  Afterwards, the smart pointer is empty
78   // (NULL).
Detach()79   inline T* Detach() {
80     T* temp = p;
81     p = NULL;
82     return temp;
83   }
84 
85 
86   // Assignment requires an empty (NULL) SmartPointer as the receiver.  Like
87   // the copy constructor it removes the pointer in the original to avoid
88   // double freeing.
89   inline SmartPointer& operator=(const SmartPointer<T>& rhs) {
90     ASSERT(is_empty());
91     T* tmp = rhs.p;  // swap to handle self-assignment
92     const_cast<SmartPointer<T>&>(rhs).p = NULL;
93     p = tmp;
94     return *this;
95   }
96 
97 
is_empty()98   inline bool is_empty() {
99     return p == NULL;
100   }
101 
102 
103  private:
104   T* p;
105 };
106 
107 } }  // namespace v8::internal
108 
109 #endif  // V8_SMART_POINTER_H_
110