// Copyright 2017 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 QUICHE_HTTP2_PLATFORM_API_HTTP2_STRING_UTILS_H_
#define QUICHE_HTTP2_PLATFORM_API_HTTP2_STRING_UTILS_H_

#include <string>
#include <type_traits>
#include <utility>

#include "net/http2/platform/impl/http2_string_utils_impl.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h"

namespace http2 {

template <typename... Args>
inline void Http2StrAppend(std::string* output, const Args&... args) {
  Http2StrAppendImpl(output, std::forward<const Args&>(args)...);
}

template <typename... Args>
inline std::string Http2StringPrintf(const Args&... args) {
  return Http2StringPrintfImpl(std::forward<const Args&>(args)...);
}

inline std::string Http2HexEncode(const void* bytes, size_t size) {
  return Http2HexEncodeImpl(bytes, size);
}

inline std::string Http2HexDecode(quiche::QuicheStringPiece data) {
  return Http2HexDecodeImpl(data);
}

inline std::string Http2HexDump(quiche::QuicheStringPiece data) {
  return Http2HexDumpImpl(data);
}

inline std::string Http2HexEscape(quiche::QuicheStringPiece data) {
  return Http2HexEscapeImpl(data);
}

template <typename Number>
inline std::string Http2Hex(Number number) {
  static_assert(std::is_integral<Number>::value, "Number has to be an int");
  return Http2HexImpl(number);
}

}  // namespace http2

#endif  // QUICHE_HTTP2_PLATFORM_API_HTTP2_STRING_UTILS_H_
