Home | History | Annotate | Download | only in gn
      1 // Copyright (c) 2013 The Chromium 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 TOOLS_GN_LABEL_PTR_H_
      6 #define TOOLS_GN_LABEL_PTR_H_
      7 
      8 #include <functional>
      9 
     10 class ParseNode;
     11 
     12 // Structure that holds a labeled "thing". This is used for various places
     13 // where we need to store lists of targets or configs. We sometimes populate
     14 // the pointers on another thread from where we compute the labels, so this
     15 // structure lets us save them separately. This also allows us to store the
     16 // location of the thing that added this dependency.
     17 template<typename T>
     18 struct LabelPtrPair {
     19   typedef T DestType;
     20 
     21   LabelPtrPair() : label(), ptr(NULL), origin(NULL) {}
     22 
     23   explicit LabelPtrPair(const Label& l) : label(l), ptr(NULL), origin(NULL) {
     24   }
     25 
     26   // This contructor is typically used in unit tests, it extracts the label
     27   // automatically from a given pointer.
     28   explicit LabelPtrPair(const T* p) : label(p->label()), ptr(p), origin(NULL) {
     29   }
     30 
     31   ~LabelPtrPair() {}
     32 
     33   Label label;
     34   const T* ptr;  // May be NULL.
     35   const ParseNode* origin;  // May be NULL.
     36 };
     37 
     38 typedef LabelPtrPair<Config> LabelConfigPair;
     39 typedef LabelPtrPair<Target> LabelTargetPair;
     40 
     41 typedef std::vector<LabelConfigPair> LabelConfigVector;
     42 typedef std::vector<LabelTargetPair> LabelTargetVector;
     43 
     44 // Comparison and search functions ---------------------------------------------
     45 
     46 // To do a brute-force search by label:
     47 // std::find_if(vect.begin(), vect.end(), LabelPtrLabelEquals<Config>(label));
     48 template<typename T>
     49 struct LabelPtrLabelEquals : public std::unary_function<Label, bool> {
     50   explicit LabelPtrLabelEquals(const Label& l) : label(l) {}
     51 
     52   bool operator()(const LabelPtrPair<T>& arg) const {
     53     return arg.label == label;
     54   }
     55 
     56   const Label& label;
     57 };
     58 
     59 // To do a brute-force search by object pointer:
     60 // std::find_if(vect.begin(), vect.end(), LabelPtrPtrEquals<Config>(config));
     61 template<typename T>
     62 struct LabelPtrPtrEquals : public std::unary_function<T, bool> {
     63   explicit LabelPtrPtrEquals(const T* p) : ptr(p) {}
     64 
     65   bool operator()(const LabelPtrPair<T>& arg) const {
     66     return arg.ptr == ptr;
     67   }
     68 
     69   const T* ptr;
     70 };
     71 
     72 // To sort by label:
     73 // std::sort(vect.begin(), vect.end(), LabelPtrLabelLess<Config>());
     74 template<typename T>
     75 struct LabelPtrLabelLess : public std::binary_function<LabelPtrPair<T>,
     76                                                        LabelPtrPair<T>,
     77                                                        bool> {
     78   bool operator()(const LabelPtrPair<T>& a, const LabelPtrPair<T>& b) const {
     79     return a.label < b.label;
     80   }
     81 };
     82 
     83 #endif  // TOOLS_GN_LABEL_PTR_H_
     84