5 // Created by caprice on 2013/08/05.
8 #ifndef GIKOMONA_CORE_STRING_HPP
9 #define GIKOMONA_CORE_STRING_HPP
13 #include <boost/utility/string_ref.hpp>
15 #include <wx/string.h>
17 // このコンパイラの char16_t、char32_t を UTF-16/32 を表現するか?
18 #if !(__STDC_UTF_16__)
19 #error "[GikoMona.libcore @pp-time] : sorry, this compiler does not support utf-16."
22 #if !(__STDC_UTF_32__)
23 #error "[GikoMona.libcore @pp-time] : sorry, this compiler does not support utf-32."
26 namespace monazilla { namespace GikoMona {
28 template <typename CharT>
29 using basic_string_ref = boost::basic_string_ref<CharT, std::char_traits<CharT>>;
32 typedef std::basic_string<u8_char> u8_string;
33 typedef basic_string_ref<u8_char> u8_string_ref;
35 typedef u8_string mona_string;
36 typedef basic_string_ref<u8_char> mona_string_ref;
38 typedef char sjis_char;
39 typedef std::basic_string<sjis_char> sjis_string;
40 typedef basic_string_ref<sjis_char> sjis_string_ref;
43 u8_string convert_to_u8(const mona_string_ref& src);
44 sjis_string convert_to_sjis(const mona_string_ref& src);
46 std::u16string convert_to_u16(const mona_string_ref& src);
47 std::u32string convert_to_u32(const mona_string_ref& src);
48 std::string convert_to_std_str(const mona_string_ref& src);
49 std::wstring convert_to_std_wstr(const mona_string_ref& src);
51 wxString convert_to_wx(const mona_string_ref& src) {
52 return wxString(src.data());
56 mona_string convert_from(const u8_string_ref& src);
57 mona_string convert_from(const sjis_string_ref& src);
59 mona_string convert_from(const basic_string_ref<char16_t>& src);
60 mona_string convert_from(const basic_string_ref<char32_t>& src);
61 mona_string convert_from(const basic_string_ref<std::string::value_type>& src);
62 mona_string convert_from(const basic_string_ref<std::wstring::value_type>& src);
64 mona_string convert_from(const wxString& src);
67 template <typename Other>
68 class converter_impl {
70 typedef typename Other::value_type char_type;
71 typedef basic_string_ref<char_type> string_ref_type;
73 mona_string from(const string_ref_type& src) const { return convert_from(src); }
76 template <typename Other, bool U8_is_Sjis = std::is_same<u8_string, sjis_string>::value>
80 class converter <u8_string, false> : public converter_impl<u8_string> {
82 char_type to(const mona_string_ref& src) const { return convert_to_u8(src); }
86 class converter <sjis_string, false> : public converter_impl<sjis_string> {
88 char_type to(const mona_string_ref& src) const { return convert_to_sjis(src); }
92 class converter <u8_string, true> : public converter_impl<u8_string> {
94 char_type to_u8(const mona_string_ref& src) const { return convert_to_u8(src); }
95 char_type to_sjis(const mona_string_ref& src) const { return convert_to_sjis(src); }
96 char_type to(const mona_string_ref&) const {
97 static_assert(false, "std::is_same<u8_string, sjis_string>::value == true.");
101 template <bool Value>
102 class converter <std::u16string, Value> : public converter_impl<std::u16string> {
104 char_type to(const mona_string_ref& src) const { return convert_to_u16(src); }
107 template <bool Value>
108 class converter <std::u32string, Value> : public converter_impl<std::u32string> {
110 char_type to(const mona_string_ref& src) const { return convert_to_u32(src); }