Index: tools/gn/substitution_list.cc |
diff --git a/tools/gn/substitution_list.cc b/tools/gn/substitution_list.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..26b3909e7980b28a164488c911cc1551fa49d6d6 |
--- /dev/null |
+++ b/tools/gn/substitution_list.cc |
@@ -0,0 +1,72 @@ |
+// Copyright 2014 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. |
+ |
+#include "tools/gn/substitution_list.h" |
+ |
+#include <string.h> |
+ |
+#include "tools/gn/value.h" |
+ |
+SubstitutionList::SubstitutionList() { |
+} |
+ |
+SubstitutionList::~SubstitutionList() { |
+} |
+ |
+bool SubstitutionList::Parse(const Value& value, Err* err) { |
+ if (!value.VerifyTypeIs(Value::LIST, err)) |
+ return false; |
+ |
+ const std::vector<Value>& input_list = value.list_value(); |
+ list_.resize(input_list.size()); |
+ for (size_t i = 0; i < input_list.size(); i++) { |
+ if (!list_[i].Parse(input_list[i], err)) |
+ return false; |
+ } |
+ |
+ FillRequiredTypes(); |
+ return true; |
+} |
+ |
+bool SubstitutionList::Parse(const std::vector<std::string>& values, |
+ const ParseNode* origin, |
+ Err* err) { |
+ list_.resize(values.size()); |
+ for (size_t i = 0; i < values.size(); i++) { |
+ if (!list_[i].Parse(values[i], origin, err)) |
+ return false; |
+ } |
+ |
+ FillRequiredTypes(); |
+ return true; |
+} |
+ |
+SubstitutionList SubstitutionList::MakeForTest( |
+ const char* a, |
+ const char* b, |
+ const char* c) { |
+ std::vector<std::string> input_strings; |
+ input_strings.push_back(a); |
+ if (b) |
+ input_strings.push_back(b); |
+ if (c) |
+ input_strings.push_back(c); |
+ |
+ Err err; |
+ SubstitutionList result; |
+ result.Parse(input_strings, NULL, &err); |
+ return result; |
+} |
+ |
+void SubstitutionList::FillRequiredTypes() { |
+ bool required_type_bits[SUBSTITUTION_NUM_TYPES]; |
+ memset(&required_type_bits, 0, SUBSTITUTION_NUM_TYPES); |
+ for (size_t i = 0; i < list_.size(); i++) |
+ list_[i].FillRequiredTypes(required_type_bits); |
+ |
+ for (size_t i = SUBSTITUTION_FIRST_PATTERN; i < SUBSTITUTION_NUM_TYPES; i++) { |
+ if (required_type_bits[i]) |
+ required_types_.push_back(static_cast<SubstitutionType>(i)); |
+ } |
+} |