// 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_VALUES_H_
#define TOOLS_GN_CONFIG_VALUES_H_

#include <string>
#include <vector>

#include "gn/lib_file.h"
#include "gn/source_dir.h"
#include "gn/source_file.h"

// Holds the values (include_dirs, defines, compiler flags, etc.) for a given
// config or target.
class ConfigValues {
 public:
  ConfigValues();
  ~ConfigValues();

  // Appends the values from the given config to this one.
  void AppendValues(const ConfigValues& append);

#define STRING_VALUES_ACCESSOR(name)                               \
  const std::vector<std::string>& name() const { return name##_; } \
  std::vector<std::string>& name() { return name##_; }
#define DIR_VALUES_ACCESSOR(name)                                \
  const std::vector<SourceDir>& name() const { return name##_; } \
  std::vector<SourceDir>& name() { return name##_; }

  // =================================================================
  // IMPORTANT: If you add a new one, be sure to update AppendValues()
  //            and command_desc.cc.
  // =================================================================
  STRING_VALUES_ACCESSOR(arflags)
  STRING_VALUES_ACCESSOR(asmflags)
  STRING_VALUES_ACCESSOR(cflags)
  STRING_VALUES_ACCESSOR(cflags_c)
  STRING_VALUES_ACCESSOR(cflags_cc)
  STRING_VALUES_ACCESSOR(cflags_objc)
  STRING_VALUES_ACCESSOR(cflags_objcc)
  STRING_VALUES_ACCESSOR(defines)
  DIR_VALUES_ACCESSOR(framework_dirs)
  STRING_VALUES_ACCESSOR(frameworks)
  STRING_VALUES_ACCESSOR(weak_frameworks)
  STRING_VALUES_ACCESSOR(weak_libraries)
  DIR_VALUES_ACCESSOR(include_dirs)
  STRING_VALUES_ACCESSOR(ldflags)
  DIR_VALUES_ACCESSOR(lib_dirs)
  STRING_VALUES_ACCESSOR(rustflags)
  STRING_VALUES_ACCESSOR(rustenv)
  STRING_VALUES_ACCESSOR(swiftflags)
  // =================================================================
  // IMPORTANT: If you add a new one, be sure to update AppendValues()
  //            and command_desc.cc.
  // =================================================================

#undef STRING_VALUES_ACCESSOR
#undef DIR_VALUES_ACCESSOR

  const std::vector<SourceFile>& inputs() const { return inputs_; }
  std::vector<SourceFile>& inputs() { return inputs_; }

  const std::vector<LibFile>& libs() const { return libs_; }
  std::vector<LibFile>& libs() { return libs_; }

  const std::vector<std::pair<std::string, LibFile>>& externs() const {
    return externs_;
  }
  std::vector<std::pair<std::string, LibFile>>& externs() { return externs_; }

  bool has_precompiled_headers() const {
    return !precompiled_header_.empty() || !precompiled_source_.is_null();
  }
  const std::string& precompiled_header() const { return precompiled_header_; }
  void set_precompiled_header(const std::string& f) { precompiled_header_ = f; }
  const SourceFile& precompiled_source() const { return precompiled_source_; }
  void set_precompiled_source(const SourceFile& f) { precompiled_source_ = f; }

 private:
  std::vector<std::string> arflags_;
  std::vector<std::string> asmflags_;
  std::vector<std::string> cflags_;
  std::vector<std::string> cflags_c_;
  std::vector<std::string> cflags_cc_;
  std::vector<std::string> cflags_objc_;
  std::vector<std::string> cflags_objcc_;
  std::vector<std::string> defines_;
  std::vector<SourceDir> include_dirs_;
  std::vector<SourceDir> framework_dirs_;
  std::vector<std::string> frameworks_;
  std::vector<std::string> weak_frameworks_;
  std::vector<std::string> weak_libraries_;
  std::vector<SourceFile> inputs_;
  std::vector<std::string> ldflags_;
  std::vector<SourceDir> lib_dirs_;
  std::vector<LibFile> libs_;
  std::vector<std::string> rustflags_;
  std::vector<std::string> rustenv_;
  std::vector<std::string> swiftflags_;
  std::vector<std::pair<std::string, LibFile>> externs_;
  // If you add a new one, be sure to update AppendValues().

  std::string precompiled_header_;
  SourceFile precompiled_source_;
};

#endif  // TOOLS_GN_CONFIG_VALUES_H_
