//===-- Environment.h -------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_UTILITY_ENVIRONMENT_H
#define LLDB_UTILITY_ENVIRONMENT_H

#include "llvm/ADT/StringMap.h"
#include "llvm/Support/Allocator.h"
#include "llvm/Support/FormatProviders.h"

namespace lldb_private {

class Environment : private llvm::StringMap<std::string> {
  using Base = llvm::StringMap<std::string>;

public:
  class Envp {
  public:
    Envp(Envp &&RHS) = default;
    Envp &operator=(Envp &&RHS) = default;

    char *const *get() const { return Data; }
    operator char *const *() const { return get(); }

  private:
    explicit Envp(const Environment &Env);
    char *make_entry(llvm::StringRef Key, llvm::StringRef Value);
    Envp(const Envp &) = delete;
    Envp &operator=(const Envp &) = delete;
    friend class Environment;

    llvm::BumpPtrAllocator Allocator;
    char **Data;
  };

  using Base::const_iterator;
  using Base::iterator;
  using Base::value_type;

  using Base::begin;
  using Base::clear;
  using Base::count;
  using Base::empty;
  using Base::end;
  using Base::erase;
  using Base::find;
  using Base::insert;
  using Base::insert_or_assign;
  using Base::lookup;
  using Base::size;
  using Base::try_emplace;
  using Base::operator[];

  Environment() : Base() {}
  Environment(const Environment &RHS) : Base(RHS) {}
  Environment(Environment &&RHS) : Base(std::move(RHS)) {}
  Environment(char *const *Env)
      : Environment(const_cast<const char *const *>(Env)) {}
  Environment(const char *const *Env);

  Environment &operator=(Environment RHS) {
    Base::operator=(std::move(RHS));
    return *this;
  }

  std::pair<iterator, bool> insert(llvm::StringRef KeyEqValue) {
    auto Split = KeyEqValue.split('=');
    return insert(std::make_pair(Split.first, std::string(Split.second)));
  }

  void insert(const_iterator first, const_iterator last);

  Envp getEnvp() const { return Envp(*this); }

  static std::string compose(const value_type &KeyValue) {
    return (KeyValue.first() + "=" + KeyValue.second).str();
  }
};

} // namespace lldb_private

namespace llvm {
template <> struct format_provider<lldb_private::Environment> {
  static void format(const lldb_private::Environment &Env, raw_ostream &Stream,
                     StringRef Style) {
    for (const auto &KV : Env)
      Stream << "env[" << KV.first() << "] = " << KV.second << "\n";
  }
};
} // namespace llvm

#endif // LLDB_UTILITY_ENVIRONMENT_H
