| // 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 { | 
 |   typedef T DestType; | 
 |  | 
 |   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; | 
 | }; | 
 |  | 
 | typedef LabelPtrPair<Config> LabelConfigPair; | 
 | typedef LabelPtrPair<Target> LabelTargetPair; | 
 |  | 
 | typedef std::vector<LabelConfigPair> LabelConfigVector; | 
 | typedef std::vector<LabelTargetPair> LabelTargetVector; | 
 |  | 
 | // 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_ |