OSDN Git Service

大量変更… (こういう風に書くのは好ましくない〜)
[gikomona/GikoMona.git] / core / include / string.hpp
1 //
2 //  string.hpp
3 //  core
4 //
5 //  Created by caprice on 2013/08/05.
6 //
7
8 #ifndef GIKOMONA_CORE_STRING_HPP
9 #define GIKOMONA_CORE_STRING_HPP
10
11 #include <string>
12
13 #include <boost/utility/string_ref.hpp>
14
15 #include <wx/string.h>
16
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."
20 #endif
21
22 #if !(__STDC_UTF_32__)
23     #error "[GikoMona.libcore @pp-time] : sorry, this compiler does not support utf-32."
24 #endif
25
26 namespace monazilla { namespace GikoMona {
27     
28 template <typename CharT>
29 using basic_string_ref = boost::basic_string_ref<CharT, std::char_traits<CharT>>;
30     
31 typedef char u8_char;
32 typedef std::basic_string<u8_char> u8_string;
33 typedef basic_string_ref<u8_char> u8_string_ref;
34     
35 typedef u8_string mona_string;
36 typedef basic_string_ref<u8_char> mona_string_ref;
37
38 typedef char sjis_char;
39 typedef std::basic_string<sjis_char> sjis_string;
40 typedef basic_string_ref<sjis_char> sjis_string_ref;
41
42 // to...
43 u8_string convert_to_u8(const mona_string_ref& src);
44 sjis_string convert_to_sjis(const mona_string_ref& src);
45
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);
50
51 wxString convert_to_wx(const mona_string_ref& src) {
52     return wxString(src.data());
53 }
54
55 // from...
56 mona_string convert_from(const u8_string_ref& src);
57 mona_string convert_from(const sjis_string_ref& src);
58     
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);
63     
64 mona_string convert_from(const wxString& src);
65
66 // converter
67 template <typename Other>
68 class converter_impl {
69 public:
70     typedef typename Other::value_type char_type;
71     typedef basic_string_ref<char_type> string_ref_type;
72     
73     mona_string from(const string_ref_type& src) const { return convert_from(src); }
74 };
75
76 template <typename Other, bool U8_is_Sjis = std::is_same<u8_string, sjis_string>::value>
77 class converter {};
78
79 template <>
80 class converter <u8_string, false>  : public converter_impl<u8_string> {
81 public:
82     char_type to(const mona_string_ref& src) const { return convert_to_u8(src); }
83 };
84
85 template <>
86 class converter <sjis_string, false> : public converter_impl<sjis_string> {
87 public:
88     char_type to(const mona_string_ref& src) const { return convert_to_sjis(src); }
89 };
90
91 template <>
92 class converter <u8_string, true> : public converter_impl<u8_string> {
93 public:
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.");
98     }
99 };
100
101 template <bool Value>
102 class converter <std::u16string, Value> : public converter_impl<std::u16string> {
103 public:
104     char_type to(const mona_string_ref& src) const { return convert_to_u16(src); }
105 };
106
107 template <bool Value>
108 class converter <std::u32string, Value> : public converter_impl<std::u32string> {
109 public:
110     char_type to(const mona_string_ref& src) const { return convert_to_u32(src); }
111 };
112
113 }
114 }
115 #endif