#ifndef AOS_FAST_STRING_BUILDER_H_
#define AOS_FAST_STRING_BUILDER_H_

#include <ostream>
#include <string>
#include <type_traits>

#include "absl/log/check.h"
#include "absl/log/log.h"
#include "absl/strings/numbers.h"
#include "absl/strings/str_format.h"

namespace aos {

// Simplified string builder which is faster than standard classes
// (std::string::append(), std::ostringstream). Reduces copies on insertion
// and retrieval, uses fast number to string conversions, and allows reuse
// of the internal buffer.
class FastStringBuilder {
 public:
  FastStringBuilder(std::size_t initial_size = 64);

  // Convert bools from integer representation to "true" and "false".
  // Defaults on.
  void set_bool_to_str(bool bool_to_str) { bool_to_str_ = bool_to_str; }

  // Clears result, allows for reuse of builder without reallocation.
  // Invalidates Result()
  void Reset();

  // Returns a temporary view to the string result. Invalidated on destruction
  // of builder, after calling Reset(), or after calling MoveResult().
  std::string_view Result() const;

  // Release the string held by the builder. Resets builder and invalidates
  // Result().
  std::string MoveResult();

  // Append integer to result, converted to string representation.
  template <typename T, typename = std::enable_if_t<std::is_integral_v<T>>>
  void AppendInt(T val, bool use_hex = false);

  void Append(std::string_view);

  void Append(const char *c) { Append(std::string_view(c)); }

  // Append character to result as character.
  void AppendChar(char);

  // Append float or double to result, converted to string representation
  void Append(float);

  void Append(double);

  // Append bool to result. set_bool_to_str() toggles between integer and string
  // representation.
  void AppendBool(bool);

  // Prints the current result to output
  friend std::ostream &operator<<(std::ostream &os,
                                  const FastStringBuilder &builder);

 private:
  static const inline std::string kTrue = "true", kFalse = "false";

  // Allocate additional space of at least chars_needed relative to index_.
  void Resize(std::size_t chars_needed);

  std::string str_;
  bool bool_to_str_ = true;
};

template <typename T, typename>
void FastStringBuilder::AppendInt(T val, bool use_hex) {
  if (use_hex) {
    // This is not fast like the decimal path, but hex should be used in limited
    // cases.
    std::stringstream ss;
    ss << std::hex << val;
    str_ += ss.str();
  } else {
    std::size_t index = str_.size();
    Resize(absl::numbers_internal::kFastToBufferSize);
    char *end =
        absl::numbers_internal::FastIntToBuffer(val, str_.data() + index);
    str_.resize(end - str_.data());
  }
}

}  // namespace aos

#endif  // AOS_FAST_STRING_BUIDLER_H_
