• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2017 the V8 project 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 V8_DETACHABLE_VECTOR_H_
6 #define V8_DETACHABLE_VECTOR_H_
7 
8 #include <vector>
9 
10 namespace v8 {
11 namespace internal {
12 
13 // This class wraps a std::vector and provides a few of the common member
14 // functions for accessing the data. It acts as a lazy wrapper of the vector,
15 // not initiliazing the backing store until push_back() is first called. Two
16 // extra methods are also provided: free() and detach(), which allow for manual
17 // control of the backing store. This is currently required for use in the
18 // HandleScopeImplementer. Any other class should just use a std::vector
19 // directly.
20 template <typename T>
21 class DetachableVector {
22  public:
DetachableVector()23   DetachableVector() : vector_(nullptr) {}
24 
~DetachableVector()25   ~DetachableVector() { delete vector_; }
26 
push_back(const T & value)27   void push_back(const T& value) {
28     ensureAttached();
29     vector_->push_back(value);
30   }
31 
32   // Free the backing store and clear our reference to it.
free()33   void free() {
34     delete vector_;
35     vector_ = nullptr;
36   }
37 
38   // Clear our reference to the backing store. Does not delete it!
detach()39   void detach() { vector_ = nullptr; }
40 
at(typename std::vector<T>::size_type i)41   T& at(typename std::vector<T>::size_type i) const { return vector_->at(i); }
42 
back()43   T& back() const { return vector_->back(); }
44 
front()45   T& front() const { return vector_->front(); }
46 
pop_back()47   void pop_back() { vector_->pop_back(); }
48 
size()49   typename std::vector<T>::size_type size() const {
50     if (vector_) return vector_->size();
51     return 0;
52   }
53 
empty()54   bool empty() const {
55     if (vector_) return vector_->empty();
56     return true;
57   }
58 
59  private:
60   std::vector<T>* vector_;
61 
62   // Attach a vector backing store if not present.
ensureAttached()63   void ensureAttached() {
64     if (vector_ == nullptr) {
65       vector_ = new std::vector<T>();
66     }
67   }
68 };
69 
70 }  // namespace internal
71 }  // namespace v8
72 
73 #endif  // V8_DETACHABLE_VECTOR_H_
74