|  | // 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_CONFIG_H_ | 
|  | #define TOOLS_GN_CONFIG_H_ | 
|  |  | 
|  | #include <set> | 
|  |  | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "tools/gn/config_values.h" | 
|  | #include "tools/gn/item.h" | 
|  | #include "tools/gn/label_ptr.h" | 
|  | #include "tools/gn/unique_vector.h" | 
|  |  | 
|  | // Represents a named config in the dependency graph. | 
|  | // | 
|  | // A config can list other configs. We track both the data assigned directly | 
|  | // on the config, this list of sub-configs, and (when the config is resolved) | 
|  | // the resulting values of everything merged together. The flatten step | 
|  | // means we can avoid doing a recursive config walk for every target to compute | 
|  | // flags. | 
|  | class Config : public Item { | 
|  | public: | 
|  | // We track the set of build files that may affect this config, please refer | 
|  | // to Scope for how this is determined. | 
|  | Config(const Settings* settings, | 
|  | const Label& label, | 
|  | const std::set<SourceFile>& build_dependency_files = {}); | 
|  | ~Config() override; | 
|  |  | 
|  | // Item implementation. | 
|  | Config* AsConfig() override; | 
|  | const Config* AsConfig() const override; | 
|  | bool OnResolved(Err* err) override; | 
|  |  | 
|  | // The values set directly on this config. This will not contain data from | 
|  | // sub-configs. | 
|  | ConfigValues& own_values() { return own_values_; } | 
|  | const ConfigValues& own_values() const { return own_values_; } | 
|  |  | 
|  | // The values that represent this config and all sub-configs combined into | 
|  | // one. This is only valid after the config is resolved (when we know the | 
|  | // contents of the sub-configs). | 
|  | const ConfigValues& resolved_values() const { | 
|  | DCHECK(resolved_); | 
|  | if (configs_.empty())  // No sub configs, just use the regular values. | 
|  | return own_values_; | 
|  | return composite_values_; | 
|  | } | 
|  |  | 
|  | // List of sub-configs. | 
|  | const UniqueVector<LabelConfigPair>& configs() const { return configs_; } | 
|  | UniqueVector<LabelConfigPair>& configs() { return configs_; } | 
|  |  | 
|  | private: | 
|  | ConfigValues own_values_; | 
|  |  | 
|  | // Contains the own_values combined with sub-configs. Most configs don't have | 
|  | // sub-configs. So as an optimization, this is not populated if there are no | 
|  | // items in configs_. The resolved_values() getter handles this. | 
|  | bool resolved_; | 
|  | ConfigValues composite_values_; | 
|  |  | 
|  | UniqueVector<LabelConfigPair> configs_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(Config); | 
|  | }; | 
|  |  | 
|  | #endif  // TOOLS_GN_CONFIG_H_ |