00001 #ifndef _IAICHARACTERENCODING_H_
00002 #define _IAICHARACTERENCODING_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <string>
00021 #include <vector>
00022 #include "AICharacterEncoding.h"
00023
00024
00025 extern "C" AICharacterEncodingSuite *sAICharacterEncoding;
00026
00027 namespace ai {
00028
00030 struct PlatformTraits {
00032 typedef char unit_type;
00035 static AICharacterEncoding encoding ()
00036 {return kAIPlatformCharacterEncoding;}
00042 static size_t codes_2_units (size_t codes)
00043 {return codes * 2;}
00049 static size_t units_2_codes (size_t units)
00050 {return units;}
00051 };
00052
00054 struct UTF8Traits {
00056 typedef char unit_type;
00059 static AICharacterEncoding encoding ()
00060 {return kAIUTF8CharacterEncoding;}
00066 static size_t codes_2_units (size_t codes)
00067 {return codes * 4;}
00073 static size_t units_2_codes (size_t units)
00074 {return units;}
00075 };
00076
00078 struct UTF16Traits {
00080 typedef ASUnicode unit_type;
00083 static AICharacterEncoding encoding ()
00084 {return kAIUTF16CharacterEncoding;}
00090 static size_t codes_2_units (size_t codes)
00091 {return codes * 2;}
00097 static size_t units_2_codes (size_t units)
00098 {return units;}
00099 };
00100
00101
00102
00104 template <class Traits>
00105 class EncodedString {
00106 public:
00110 EncodedString ()
00111 {}
00112
00117 EncodedString (const EncodedString& s) :
00118 string(s.string)
00119 {}
00120
00125 explicit EncodedString (const std::basic_string<typename Traits::unit_type>& s) :
00126 string(s)
00127 {}
00128
00134 explicit EncodedString (const typename Traits::unit_type* s) :
00135 string(s)
00136 {}
00137
00138
00145 EncodedString (const typename Traits::unit_type* s, size_t length) :
00146 string(s, length)
00147 {}
00148
00150 EncodedString& operator= (const EncodedString& s)
00151 {
00152 string = s.string;
00153 return *this;
00154 }
00155
00156 #if 1
00157
00158
00159
00160 template <class SrcTraits>
00161 static EncodedString<Traits> cast (const EncodedString<SrcTraits>& src)
00162 {
00163 EncodedString<Traits> dst;
00164
00165 size_t maxsize = Traits::codes_2_units(SrcTraits::units_2_codes(src.string.size()));
00166 size_t maxbytes = maxsize * sizeof(typename Traits::unit_type);
00167 std::vector<typename Traits::unit_type> b(maxsize);
00168
00169 size_t bytes;
00170 size_t size;
00171 AIErr result = sAICharacterEncoding->ConvertBuffer(
00172 src.string.data(),
00173 src.string.size() * sizeof(typename SrcTraits::unit_type),
00174 SrcTraits::encoding(),
00175 &b[0], maxbytes, Traits::encoding(),
00176 &bytes, FALSE);
00177 if (result)
00178 throw ai::Error(result);
00179 size = bytes / sizeof(typename Traits::unit_type);
00180
00181 dst = EncodedString<Traits>(&b[0], size);
00182
00183 return dst;
00184 }
00185 #else
00186
00187 template <class DstTraits>
00188 operator EncodedString<DstTraits> () const
00189 {
00190 EncodedString<DstTraits> dst;
00191
00192 size_t maxsize = DstTraits::codes_2_units(Traits::units_2_codes(string.size()));
00193 size_t maxbytes = maxsize * sizeof(DstTraits::unit_type);
00194 std::vector<DstTraits::unit_type> b(maxsize);
00195
00196 size_t bytes;
00197 size_t size;
00198 AIErr result = sAICharacterEncoding->ConvertBuffer(
00199 string.data(), string.size(), Traits::encoding(),
00200 b, maxbytes, DstTraits::encoding(),
00201 &bytes, FALSE);
00202 if (result)
00203 throw ai::Error(result);
00204 size = bytes / sizeof(DstTraits::unit_type);
00205
00206 dst = EncodedString<DstTraits>(b, size);
00207
00208 return dst;
00209 }
00210 #endif
00211
00212
00213 std::basic_string<typename Traits::unit_type> string;
00214 };
00215
00216
00217
00219 typedef EncodedString<PlatformTraits> PlatformString;
00221 typedef EncodedString<UTF8Traits> UTF8String;
00223 typedef EncodedString<UTF16Traits> UTF16String;
00224
00225
00226 }
00227
00228 #endif