OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef TOOLS_GN_UNIQUE_VECTOR_H_ | 5 #ifndef TOOLS_GN_UNIQUE_VECTOR_H_ |
6 #define TOOLS_GN_UNIQUE_VECTOR_H_ | 6 #define TOOLS_GN_UNIQUE_VECTOR_H_ |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 | 9 |
10 #include "base/containers/hash_tables.h" | 10 #include "base/containers/hash_tables.h" |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
56 index_(i), | 56 index_(i), |
57 hash_val_(hash_value) { | 57 hash_val_(hash_value) { |
58 } | 58 } |
59 | 59 |
60 const T& value() const { return value_ ? *value_ : (*vect_)[index_]; } | 60 const T& value() const { return value_ ? *value_ : (*vect_)[index_]; } |
61 size_t hash_val() const { return hash_val_; } | 61 size_t hash_val() const { return hash_val_; } |
62 size_t index() const { return index_; } | 62 size_t index() const { return index_; } |
63 | 63 |
64 private: | 64 private: |
65 void FillHashValue() { | 65 void FillHashValue() { |
66 #if defined(COMPILER_GCC) | |
67 BASE_HASH_NAMESPACE::hash<T> h; | 66 BASE_HASH_NAMESPACE::hash<T> h; |
68 hash_val_ = h(value()); | 67 hash_val_ = h(value()); |
69 #elif defined(COMPILER_MSVC) | |
70 hash_val_ = BASE_HASH_NAMESPACE::hash_value(value()); | |
71 #else | |
72 #error write me | |
73 #endif // COMPILER... | |
74 } | 68 } |
75 | 69 |
76 // When non-null, points to the object. | 70 // When non-null, points to the object. |
77 const T* value_; | 71 const T* value_; |
78 | 72 |
79 // When value is null these are used. | 73 // When value is null these are used. |
80 const std::vector<T>* vect_; | 74 const std::vector<T>* vect_; |
81 size_t index_; | 75 size_t index_; |
82 | 76 |
83 size_t hash_val_; | 77 size_t hash_val_; |
84 }; | 78 }; |
85 | 79 |
86 template<typename T> inline bool operator==(const UniquifyRef<T>& a, | 80 template<typename T> inline bool operator==(const UniquifyRef<T>& a, |
87 const UniquifyRef<T>& b) { | 81 const UniquifyRef<T>& b) { |
88 return a.value() == b.value(); | 82 return a.value() == b.value(); |
89 } | 83 } |
90 | 84 |
91 template<typename T> inline bool operator<(const UniquifyRef<T>& a, | 85 template<typename T> inline bool operator<(const UniquifyRef<T>& a, |
92 const UniquifyRef<T>& b) { | 86 const UniquifyRef<T>& b) { |
93 return a.value() < b.value(); | 87 return a.value() < b.value(); |
94 } | 88 } |
95 | 89 |
96 } // namespace internal | 90 } // namespace internal |
97 | 91 |
98 namespace BASE_HASH_NAMESPACE { | 92 namespace BASE_HASH_NAMESPACE { |
99 | 93 |
100 #if defined(COMPILER_GCC) | |
101 template<typename T> struct hash< internal::UniquifyRef<T> > { | 94 template<typename T> struct hash< internal::UniquifyRef<T> > { |
102 std::size_t operator()(const internal::UniquifyRef<T>& v) const { | 95 std::size_t operator()(const internal::UniquifyRef<T>& v) const { |
103 return v.hash_val(); | 96 return v.hash_val(); |
104 } | 97 } |
105 }; | 98 }; |
106 #elif defined(COMPILER_MSVC) | |
107 template<typename T> | |
108 inline size_t hash_value(const internal::UniquifyRef<T>& v) { | |
109 return v.hash_val(); | |
110 } | |
111 #endif // COMPILER... | |
112 | 99 |
113 } // namespace BASE_HASH_NAMESPACE | 100 } // namespace BASE_HASH_NAMESPACE |
114 | 101 |
115 // An ordered set optimized for GN's usage. Such sets are used to store lists | 102 // An ordered set optimized for GN's usage. Such sets are used to store lists |
116 // of configs and libraries, and are appended to but not randomly inserted | 103 // of configs and libraries, and are appended to but not randomly inserted |
117 // into. | 104 // into. |
118 template<typename T> | 105 template<typename T> |
119 class UniqueVector { | 106 class UniqueVector { |
120 public: | 107 public: |
121 typedef std::vector<T> Vector; | 108 typedef std::vector<T> Vector; |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
180 | 167 |
181 private: | 168 private: |
182 typedef internal::UniquifyRef<T> Ref; | 169 typedef internal::UniquifyRef<T> Ref; |
183 typedef base::hash_set<Ref> HashSet; | 170 typedef base::hash_set<Ref> HashSet; |
184 | 171 |
185 HashSet set_; | 172 HashSet set_; |
186 Vector vector_; | 173 Vector vector_; |
187 }; | 174 }; |
188 | 175 |
189 #endif // TOOLS_GN_UNIQUE_VECTOR_H_ | 176 #endif // TOOLS_GN_UNIQUE_VECTOR_H_ |
OLD | NEW |