// Copyright 2017 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_
#define STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_

#include <codecvt>
#include <cwchar>
#include <locale>
#include <string>

namespace starboard {
namespace shared {
namespace win32 {

inline std::string wchar_tToUTF8(const wchar_t* const str) {
  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
  return converter.to_bytes(str);
}

inline std::string wchar_tToUTF8(const wchar_t* const str,
                                 const std::size_t size) {
  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
  return converter.to_bytes(str, str + size);
}

inline std::wstring CStringToWString(const char* str) {
  std::wstring_convert<std::codecvt_utf8<wchar_t>, wchar_t> converter;
  return converter.from_bytes(str);
}

#if defined(__cplusplus_winrt)
inline std::string platformStringToString(Platform::String ^ to_convert) {
  std::wstring ws(to_convert->Begin(), to_convert->End());
  return wchar_tToUTF8(ws.data(), ws.size());
}

inline Platform::String ^
    stringToPlatformString(const std::string& to_convert) {
      return ref new Platform::String(
          CStringToWString(to_convert.c_str()).c_str());
    }
#endif

}  // namespace win32
}  // namespace shared
}  // namespace starboard

#endif  // STARBOARD_SHARED_WIN32_WCHAR_UTILS_H_
