CppCMS
booster/locale/util.h
00001 //
00002 //  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
00003 //
00004 //  Distributed under the Boost Software License, Version 1.0. (See
00005 //  accompanying file LICENSE_1_0.txt or copy at
00006 //  http://www.boost.org/LICENSE_1_0.txt)
00007 //
00008 #ifndef BOOSTER_LOCALE_UTIL_HPP
00009 #define BOOSTER_LOCALE_UTIL_HPP
00010 #include <locale>
00011 #include <typeinfo>
00012 #include <booster/cstdint.h>
00013 #include <booster/locale/utf.h>
00014 #include <booster/locale/generator.h>
00015 #include <booster/assert.h>
00016 
00017 #include <vector>
00018 namespace booster {
00019 namespace locale {
00024 namespace util {
00025     
00039     BOOSTER_API
00040     std::string get_system_locale(bool use_utf8_on_windows = false);
00041 
00059     BOOSTER_API
00060     std::locale create_info(std::locale const &in,std::string const &name); 
00061 
00062 
00077     class base_converter {
00078     public:
00079 
00085         static const uint32_t illegal=utf::illegal;
00086 
00091         static const uint32_t incomplete=utf::incomplete;
00092         
00093         virtual ~base_converter() 
00094         {
00095         }
00100         virtual int max_len() const 
00101         {
00102             return 1;
00103         }
00113         virtual bool is_thread_safe() const 
00114         {
00115             return false;
00116         }
00120         virtual base_converter *clone() const 
00121         {
00122             BOOSTER_ASSERT(typeid(*this)==typeid(base_converter));
00123             return new base_converter();
00124         }
00125 
00141         virtual uint32_t to_unicode(char const *&begin,char const *end) 
00142         {
00143             if(begin == end)
00144                 return incomplete;
00145             unsigned char cp = *begin;
00146             if(cp <= 0x7F) {
00147                 begin++;
00148                 return cp;
00149             }
00150             return illegal;
00151         }
00163 
00164         virtual uint32_t from_unicode(uint32_t u,char *begin,char const *end) 
00165         {
00166             if(begin==end)
00167                 return incomplete;
00168             if(u >= 0x80)
00169                 return illegal;
00170             *begin = static_cast<char>(u);
00171             return 1;
00172         }
00173     };
00174 
00179     BOOSTER_API std::auto_ptr<base_converter> create_utf8_converter();
00187     BOOSTER_API std::auto_ptr<base_converter> create_simple_converter(std::string const &encoding);
00188 
00189 
00201     BOOSTER_API
00202     std::locale create_codecvt(std::locale const &in,std::auto_ptr<base_converter> cvt,character_facet_type type);
00203 
00204 } // util
00205 } // locale 
00206 } // boost
00207 
00208 #endif
00209 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4