00001
00002
00003
00004
00005
00006
00007
00008 #ifndef BOOSTER_LOCALE_CONVERTER_H_INCLUDED
00009 #define BOOSTER_LOCALE_CONVERTER_H_INCLUDED
00010
00011 #include <booster/config.h>
00012 #ifdef BOOSTER_MSVC
00013 # pragma warning(push)
00014 # pragma warning(disable : 4275 4251 4231 4660)
00015 #endif
00016 #include <locale>
00017
00018
00019 namespace booster {
00020 namespace locale {
00021
00028
00029
00033 class converter_base {
00034 public:
00038 typedef enum {
00039 normalization,
00040 upper_case,
00041 lower_case,
00042 case_folding,
00043 title_case
00044 } conversion_type;
00045 };
00046
00047 template<typename CharType>
00048 class converter;
00049
00050 #ifdef BOOSTER_LOCALE_DOXYGEN
00051
00052
00053
00054
00055
00056
00057 template<typename Char>
00058 class BOOSTER_API converter: public converter_base, public std::locale::facet {
00059 public:
00061 static std::locale::id id;
00062
00064 converter(size_t refs = 0) : std::locale::facet(refs)
00065 {
00066 }
00071 virtual std::basic_string<Char> convert(conversion_type how,Char const *begin,Char const *end,int flags = 0) const = 0;
00072 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
00073 std::locale::id& __get_id (void) const { return id; }
00074 #endif
00075 };
00076 #else
00077
00078 template<>
00079 class BOOSTER_API converter<char> : public converter_base, public std::locale::facet {
00080 public:
00081 static std::locale::id id;
00082
00083 converter(size_t refs = 0) : std::locale::facet(refs)
00084 {
00085 }
00086 virtual std::string convert(conversion_type how,char const *begin,char const *end,int flags = 0) const = 0;
00087 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
00088 std::locale::id& __get_id (void) const { return id; }
00089 #endif
00090 };
00091
00092 template<>
00093 class BOOSTER_API converter<wchar_t> : public converter_base, public std::locale::facet {
00094 public:
00095 static std::locale::id id;
00096 converter(size_t refs = 0) : std::locale::facet(refs)
00097 {
00098 }
00099 virtual std::wstring convert(conversion_type how,wchar_t const *begin,wchar_t const *end,int flags = 0) const = 0;
00100 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
00101 std::locale::id& __get_id (void) const { return id; }
00102 #endif
00103 };
00104
00105 #ifdef BOOSTER_HAS_CHAR16_T
00106 template<>
00107 class BOOSTER_API converter<char16_t> : public converter_base, public std::locale::facet {
00108 public:
00109 static std::locale::id id;
00110 converter(size_t refs = 0) : std::locale::facet(refs)
00111 {
00112 }
00113 virtual std::u16string convert(conversion_type how,char16_t const *begin,char16_t const *end,int flags = 0) const = 0;
00114 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
00115 std::locale::id& __get_id (void) const { return id; }
00116 #endif
00117 };
00118 #endif
00119
00120 #ifdef BOOSTER_HAS_CHAR32_T
00121 template<>
00122 class BOOSTER_API converter<char32_t> : public converter_base, public std::locale::facet {
00123 public:
00124 static std::locale::id id;
00125 converter(size_t refs = 0) : std::locale::facet(refs)
00126 {
00127 }
00128 virtual std::u32string convert(conversion_type how,char32_t const *begin,char32_t const *end,int flags = 0) const = 0;
00129 #if defined (__SUNPRO_CC) && defined (_RWSTD_VER)
00130 std::locale::id& __get_id (void) const { return id; }
00131 #endif
00132 };
00133 #endif
00134
00135 #endif
00136
00140
00141 typedef enum {
00142 norm_nfd,
00143 norm_nfc,
00144 norm_nfkd,
00145 norm_nfkc,
00146 norm_default = norm_nfc,
00147 } norm_type;
00148
00158 template<typename CharType>
00159 std::basic_string<CharType> normalize(std::basic_string<CharType> const &str,norm_type n=norm_default,std::locale const &loc=std::locale())
00160 {
00161 return std::use_facet<converter<CharType> >(loc).convert(converter_base::normalization,str.data(),str.data() + str.size(),n);
00162 }
00163
00173 template<typename CharType>
00174 std::basic_string<CharType> normalize(CharType const *str,norm_type n=norm_default,std::locale const &loc=std::locale())
00175 {
00176 CharType const *end=str;
00177 while(*end)
00178 end++;
00179 return std::use_facet<converter<CharType> >(loc).convert(converter_base::normalization,str,end,n);
00180 }
00181
00191 template<typename CharType>
00192 std::basic_string<CharType> normalize( CharType const *begin,
00193 CharType const *end,
00194 norm_type n=norm_default,
00195 std::locale const &loc=std::locale())
00196 {
00197 return std::use_facet<converter<CharType> >(loc).convert(converter_base::normalization,begin,end,n);
00198 }
00199
00201
00207
00208 template<typename CharType>
00209 std::basic_string<CharType> to_upper(std::basic_string<CharType> const &str,std::locale const &loc=std::locale())
00210 {
00211 return std::use_facet<converter<CharType> >(loc).convert(converter_base::upper_case,str.data(),str.data()+str.size());
00212 }
00213
00219 template<typename CharType>
00220 std::basic_string<CharType> to_upper(CharType const *str,std::locale const &loc=std::locale())
00221 {
00222 CharType const *end=str;
00223 while(*end)
00224 end++;
00225 return std::use_facet<converter<CharType> >(loc).convert(converter_base::upper_case,str,end);
00226 }
00227
00233 template<typename CharType>
00234 std::basic_string<CharType> to_upper(CharType const *begin,CharType const *end,std::locale const &loc=std::locale())
00235 {
00236 return std::use_facet<converter<CharType> >(loc).convert(converter_base::upper_case,begin,end);
00237 }
00238
00240
00246
00247 template<typename CharType>
00248 std::basic_string<CharType> to_lower(std::basic_string<CharType> const &str,std::locale const &loc=std::locale())
00249 {
00250 return std::use_facet<converter<CharType> >(loc).convert(converter_base::lower_case,str.data(),str.data()+str.size());
00251 }
00252
00258 template<typename CharType>
00259 std::basic_string<CharType> to_lower(CharType const *str,std::locale const &loc=std::locale())
00260 {
00261 CharType const *end=str;
00262 while(*end)
00263 end++;
00264 return std::use_facet<converter<CharType> >(loc).convert(converter_base::lower_case,str,end);
00265 }
00266
00272 template<typename CharType>
00273 std::basic_string<CharType> to_lower(CharType const *begin,CharType const *end,std::locale const &loc=std::locale())
00274 {
00275 return std::use_facet<converter<CharType> >(loc).convert(converter_base::lower_case,begin,end);
00276 }
00278
00284
00285 template<typename CharType>
00286 std::basic_string<CharType> to_title(std::basic_string<CharType> const &str,std::locale const &loc=std::locale())
00287 {
00288 return std::use_facet<converter<CharType> >(loc).convert(converter_base::title_case,str.data(),str.data()+str.size());
00289 }
00290
00296 template<typename CharType>
00297 std::basic_string<CharType> to_title(CharType const *str,std::locale const &loc=std::locale())
00298 {
00299 CharType const *end=str;
00300 while(*end)
00301 end++;
00302 return std::use_facet<converter<CharType> >(loc).convert(converter_base::title_case,str,end);
00303 }
00304
00310 template<typename CharType>
00311 std::basic_string<CharType> to_title(CharType const *begin,CharType const *end,std::locale const &loc=std::locale())
00312 {
00313 return std::use_facet<converter<CharType> >(loc).convert(converter_base::title_case,begin,end);
00314 }
00315
00317
00323
00324 template<typename CharType>
00325 std::basic_string<CharType> fold_case(std::basic_string<CharType> const &str,std::locale const &loc=std::locale())
00326 {
00327 return std::use_facet<converter<CharType> >(loc).convert(converter_base::case_folding,str.data(),str.data()+str.size());
00328 }
00329
00335 template<typename CharType>
00336 std::basic_string<CharType> fold_case(CharType const *str,std::locale const &loc=std::locale())
00337 {
00338 CharType const *end=str;
00339 while(*end)
00340 end++;
00341 return std::use_facet<converter<CharType> >(loc).convert(converter_base::case_folding,str,end);
00342 }
00343
00349 template<typename CharType>
00350 std::basic_string<CharType> fold_case(CharType const *begin,CharType const *end,std::locale const &loc=std::locale())
00351 {
00352 return std::use_facet<converter<CharType> >(loc).convert(converter_base::case_folding,begin,end);
00353 }
00354
00358 }
00359
00360 }
00361
00362 #ifdef BOOSTER_MSVC
00363 #pragma warning(pop)
00364 #endif
00365
00366
00367 #endif
00368
00378
00379
00380