1 // Copyright 2014 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_COMPILER_NODE_AUX_DATA_H_ 6 #define V8_COMPILER_NODE_AUX_DATA_H_ 7 8 #include "src/compiler/node.h" 9 #include "src/zone/zone-containers.h" 10 11 namespace v8 { 12 namespace internal { 13 namespace compiler { 14 15 // Forward declarations. 16 class Node; 17 18 template <class T> 19 T DefaultConstruct() { 20 return T(); 21 } 22 23 template <class T, T def() = DefaultConstruct<T>> 24 class NodeAuxData { 25 public: 26 explicit NodeAuxData(Zone* zone) : aux_data_(zone) {} 27 explicit NodeAuxData(size_t initial_size, Zone* zone) 28 : aux_data_(initial_size, zone) {} 29 30 // Update entry. Returns true iff entry was changed. 31 bool Set(Node* node, T const& data) { 32 size_t const id = node->id(); 33 if (id >= aux_data_.size()) aux_data_.resize(id + 1, def()); 34 if (aux_data_[id] != data) { 35 aux_data_[id] = data; 36 return true; 37 } 38 return false; 39 } 40 41 T Get(Node* node) const { 42 size_t const id = node->id(); 43 return (id < aux_data_.size()) ? aux_data_[id] : def(); 44 } 45 46 class const_iterator; 47 friend class const_iterator; 48 49 const_iterator begin() const; 50 const_iterator end() const; 51 52 private: 53 ZoneVector<T> aux_data_; 54 }; 55 56 template <class T, T def()> 57 class NodeAuxData<T, def>::const_iterator { 58 public: 59 typedef std::forward_iterator_tag iterator_category; 60 typedef int difference_type; 61 typedef std::pair<size_t, T> value_type; 62 typedef value_type* pointer; 63 typedef value_type& reference; 64 65 const_iterator(const ZoneVector<T>* data, size_t current) 66 : data_(data), current_(current) {} 67 const_iterator(const const_iterator& other) 68 : data_(other.data_), current_(other.current_) {} 69 70 value_type operator*() const { 71 return std::make_pair(current_, (*data_)[current_]); 72 } 73 bool operator==(const const_iterator& other) const { 74 return current_ == other.current_ && data_ == other.data_; 75 } 76 bool operator!=(const const_iterator& other) const { 77 return !(*this == other); 78 } 79 const_iterator& operator++() { 80 ++current_; 81 return *this; 82 } 83 const_iterator operator++(int); 84 85 private: 86 const ZoneVector<T>* data_; 87 size_t current_; 88 }; 89 90 template <class T, T def()> 91 typename NodeAuxData<T, def>::const_iterator NodeAuxData<T, def>::begin() 92 const { 93 return typename NodeAuxData<T, def>::const_iterator(&aux_data_, 0); 94 } 95 96 template <class T, T def()> 97 typename NodeAuxData<T, def>::const_iterator NodeAuxData<T, def>::end() const { 98 return typename NodeAuxData<T, def>::const_iterator(&aux_data_, 99 aux_data_.size()); 100 } 101 102 } // namespace compiler 103 } // namespace internal 104 } // namespace v8 105 106 #endif // V8_COMPILER_NODE_AUX_DATA_H_ 107