mirror of https://github.com/AxioDL/logvisor.git
136 lines
5.4 KiB
C++
136 lines
5.4 KiB
C++
//
|
|
// Copyright (c) 2012 Artyom Beilis (Tonkikh)
|
|
// Copyright (c) 2020 Alexander Grund
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See
|
|
// accompanying file LICENSE or copy at
|
|
// http://www.boost.org/LICENSE_1_0.txt)
|
|
//
|
|
#ifndef NOWIDE_CONVERT_HPP_INCLUDED
|
|
#define NOWIDE_CONVERT_HPP_INCLUDED
|
|
|
|
#include <nowide/detail/is_string_container.hpp>
|
|
#include <nowide/utf/convert.hpp>
|
|
#include <string>
|
|
|
|
namespace nowide {
|
|
|
|
///
|
|
/// Convert wide string (UTF-16/32) in range [begin,end) to NULL terminated narrow string (UTF-8)
|
|
/// stored in \a output of size \a output_size (including NULL)
|
|
///
|
|
/// If there is not enough room NULL is returned, else output is returned.
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
inline char* narrow(char* output, size_t output_size, const wchar_t* begin, const wchar_t* end)
|
|
{
|
|
return utf::convert_buffer(output, output_size, begin, end);
|
|
}
|
|
///
|
|
/// Convert NULL terminated wide string (UTF-16/32) to NULL terminated narrow string (UTF-8)
|
|
/// stored in \a output of size \a output_size (including NULL)
|
|
///
|
|
/// If there is not enough room NULL is returned, else output is returned.
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
inline char* narrow(char* output, size_t output_size, const wchar_t* source)
|
|
{
|
|
return narrow(output, output_size, source, source + utf::strlen(source));
|
|
}
|
|
|
|
///
|
|
/// Convert narrow string (UTF-8) in range [begin,end) to NULL terminated wide string (UTF-16/32)
|
|
/// stored in \a output of size \a output_size (including NULL)
|
|
///
|
|
/// If there is not enough room NULL is returned, else output is returned.
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
inline wchar_t* widen(wchar_t* output, size_t output_size, const char* begin, const char* end)
|
|
{
|
|
return utf::convert_buffer(output, output_size, begin, end);
|
|
}
|
|
///
|
|
/// Convert NULL terminated narrow string (UTF-8) to NULL terminated wide string (UTF-16/32)
|
|
/// most output_size (including NULL)
|
|
///
|
|
/// If there is not enough room NULL is returned, else output is returned.
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
inline wchar_t* widen(wchar_t* output, size_t output_size, const char* source)
|
|
{
|
|
return widen(output, output_size, source, source + utf::strlen(source));
|
|
}
|
|
|
|
///
|
|
/// Convert wide string (UTF-16/32) to narrow string (UTF-8).
|
|
///
|
|
/// \param s Input string
|
|
/// \param count Number of characters to convert
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename T_Char, typename = detail::requires_wide_char<T_Char>>
|
|
inline std::string narrow(const T_Char* s, size_t count)
|
|
{
|
|
return utf::convert_string<char>(s, s + count);
|
|
}
|
|
///
|
|
/// Convert wide string (UTF-16/32) to narrow string (UTF-8).
|
|
///
|
|
/// \param s NULL terminated input string
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename T_Char, typename = detail::requires_wide_char<T_Char>>
|
|
inline std::string narrow(const T_Char* s)
|
|
{
|
|
return narrow(s, utf::strlen(s));
|
|
}
|
|
///
|
|
/// Convert wide string (UTF-16/32) to narrow string (UTF-8).
|
|
///
|
|
/// \param s Input string
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename StringOrStringView, typename = detail::requires_wide_string_container<StringOrStringView>>
|
|
inline std::string narrow(const StringOrStringView& s)
|
|
{
|
|
return utf::convert_string<char>(s.data(), s.data() + s.size());
|
|
}
|
|
|
|
///
|
|
/// Convert narrow string (UTF-8) to wide string (UTF-16/32).
|
|
///
|
|
/// \param s Input string
|
|
/// \param count Number of characters to convert
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename T_Char, typename = detail::requires_narrow_char<T_Char>>
|
|
inline std::wstring widen(const T_Char* s, size_t count)
|
|
{
|
|
return utf::convert_string<wchar_t>(s, s + count);
|
|
}
|
|
///
|
|
/// Convert narrow string (UTF-8) to wide string (UTF-16/32).
|
|
///
|
|
/// \param s NULL terminated input string
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename T_Char, typename = detail::requires_narrow_char<T_Char>>
|
|
inline std::wstring widen(const T_Char* s)
|
|
{
|
|
return widen(s, utf::strlen(s));
|
|
}
|
|
///
|
|
/// Convert narrow string (UTF-8) to wide string (UTF-16/32).
|
|
///
|
|
/// \param s Input string
|
|
/// Any illegal sequences are replaced with the replacement character, see #NOWIDE_REPLACEMENT_CHARACTER
|
|
///
|
|
template<typename StringOrStringView, typename = detail::requires_narrow_string_container<StringOrStringView>>
|
|
inline std::wstring widen(const StringOrStringView& s)
|
|
{
|
|
return utf::convert_string<wchar_t>(s.data(), s.data() + s.size());
|
|
}
|
|
} // namespace nowide
|
|
|
|
#endif
|