// 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.

#include "tools/gn/config_values.h"

namespace {

template<typename T>
void VectorAppend(std::vector<T>* append_to,
                  const std::vector<T>& append_this) {
  if (append_this.empty())
    return;
  append_to->insert(append_to->end(),append_this.begin(), append_this.end());
}

}  // namespace

ConfigValues::ConfigValues() = default;

ConfigValues::~ConfigValues() = default;

void ConfigValues::AppendValues(const ConfigValues& append) {
  VectorAppend(&asmflags_,     append.asmflags_);
  VectorAppend(&arflags_,      append.arflags_);
  VectorAppend(&cflags_,       append.cflags_);
  VectorAppend(&cflags_c_,     append.cflags_c_);
  VectorAppend(&cflags_cc_,    append.cflags_cc_);
  VectorAppend(&cflags_objc_,  append.cflags_objc_);
  VectorAppend(&cflags_objcc_, append.cflags_objcc_);
  VectorAppend(&defines_,      append.defines_);
  VectorAppend(&include_dirs_, append.include_dirs_);
  VectorAppend(&inputs_,       append.inputs_);
  VectorAppend(&ldflags_,      append.ldflags_);
  VectorAppend(&lib_dirs_,     append.lib_dirs_);
  VectorAppend(&libs_,         append.libs_);

  // Only append precompiled header if there isn't one. It might be nice to
  // throw an error if there are conflicting precompiled headers, but that
  // requires piping through some context of the actual configs involved, and
  // conflicts here should be very unusual. Instead, use the first value.
  if (!append.precompiled_header_.empty() && !precompiled_header_.empty())
    precompiled_header_ = append.precompiled_header_;
  if (!append.precompiled_source_.is_null() && !precompiled_source_.is_null())
    precompiled_source_ = append.precompiled_source_;
}
