|  | // Copyright (c) 2013 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef TOOLS_GN_LABEL_PTR_H_ | 
|  | #define TOOLS_GN_LABEL_PTR_H_ | 
|  |  | 
|  | #include <stddef.h> | 
|  |  | 
|  | #include <functional> | 
|  |  | 
|  | #include "tools/gn/label.h" | 
|  |  | 
|  | class Config; | 
|  | class ParseNode; | 
|  | class Target; | 
|  |  | 
|  | // Structure that holds a labeled "thing". This is used for various places | 
|  | // where we need to store lists of targets or configs. We sometimes populate | 
|  | // the pointers on another thread from where we compute the labels, so this | 
|  | // structure lets us save them separately. This also allows us to store the | 
|  | // location of the thing that added this dependency. | 
|  | template <typename T> | 
|  | struct LabelPtrPair { | 
|  | using DestType = T; | 
|  |  | 
|  | LabelPtrPair() = default; | 
|  |  | 
|  | explicit LabelPtrPair(const Label& l) : label(l) {} | 
|  |  | 
|  | // This contructor is typically used in unit tests, it extracts the label | 
|  | // automatically from a given pointer. | 
|  | explicit LabelPtrPair(const T* p) : label(p->label()), ptr(p) {} | 
|  |  | 
|  | ~LabelPtrPair() = default; | 
|  |  | 
|  | Label label; | 
|  | const T* ptr = nullptr; | 
|  |  | 
|  | // The origin of this dependency. This will be null for internally generated | 
|  | // dependencies. This happens when a group is automatically expanded and that | 
|  | // group's members are added to the target that depends on that group. | 
|  | const ParseNode* origin = nullptr; | 
|  | }; | 
|  |  | 
|  | using LabelConfigPair = LabelPtrPair<Config>; | 
|  | using LabelTargetPair = LabelPtrPair<Target>; | 
|  |  | 
|  | using LabelConfigVector = std::vector<LabelConfigPair>; | 
|  | using LabelTargetVector = std::vector<LabelTargetPair>; | 
|  |  | 
|  | // Default comparison operators ----------------------------------------------- | 
|  | // | 
|  | // The default hash and comparison operators operate on the label, which should | 
|  | // always be valid, whereas the pointer is sometimes null. | 
|  |  | 
|  | template <typename T> | 
|  | inline bool operator==(const LabelPtrPair<T>& a, const LabelPtrPair<T>& b) { | 
|  | return a.label == b.label; | 
|  | } | 
|  |  | 
|  | template <typename T> | 
|  | inline bool operator<(const LabelPtrPair<T>& a, const LabelPtrPair<T>& b) { | 
|  | return a.label < b.label; | 
|  | } | 
|  |  | 
|  | namespace std { | 
|  |  | 
|  | template <typename T> | 
|  | struct hash<LabelPtrPair<T>> { | 
|  | std::size_t operator()(const LabelPtrPair<T>& v) const { | 
|  | hash<Label> h; | 
|  | return h(v.label); | 
|  | } | 
|  | }; | 
|  |  | 
|  | }  // namespace std | 
|  |  | 
|  | #endif  // TOOLS_GN_LABEL_PTR_H_ |