// // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) // // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #ifndef BOOST_LOCALE_GENERATOR_HPP #define BOOST_LOCALE_GENERATOR_HPP #include #include #include #include #include #ifdef BOOST_MSVC # pragma warning(push) # pragma warning(disable : 4275 4251 4231 4660) #endif namespace boost { /// /// \brief This is the main namespace that encloses all localization classes /// namespace locale { class localization_backend; class localization_backend_manager; /// Type that specifies the character type that locales can be generated for /// /// Supports bitwise OR and bitwise AND (the latter returning if the type is set) enum class char_facet_t : uint32_t { nochar = 0, ///< Unspecified character category for character independent facets char_f = 1 << 0, ///< 8-bit character facets wchar_f = 1 << 1, ///< wide character facets #ifdef __cpp_char8_t char8_f = 1 << 2, ///< C++20 char8_t facets #endif #ifdef BOOST_LOCALE_ENABLE_CHAR16_T char16_f = 1 << 3, ///< C++11 char16_t facets #endif #ifdef BOOST_LOCALE_ENABLE_CHAR32_T char32_f = 1 << 4, ///< C++11 char32_t facets #endif }; typedef BOOST_DEPRECATED("Use char_facet_t") char_facet_t character_facet_type; /// First facet specific for character type constexpr char_facet_t character_facet_first = char_facet_t::char_f; /// Last facet specific for character type constexpr char_facet_t character_facet_last = #ifdef BOOST_LOCALE_ENABLE_CHAR32_T char_facet_t::char32_f; #elif defined BOOST_LOCALE_ENABLE_CHAR16_T char_facet_t::char16_f; #elif defined __cpp_char8_t char_facet_t::char8_f; #else char_facet_t::wchar_f; #endif /// Special mask -- generate all constexpr char_facet_t all_characters = char_facet_t(0xFFFFFFFFu); /// Type used for more fine grained generation of facets /// /// Supports bitwise OR and bitwise AND (the latter returning if the type is set) enum class category_t : uint32_t { convert = 1 << 0, ///< Generate conversion facets collation = 1 << 1, ///< Generate collation facets formatting = 1 << 2, ///< Generate numbers, currency, date-time formatting facets parsing = 1 << 3, ///< Generate numbers, currency, date-time formatting facets message = 1 << 4, ///< Generate message facets codepage = 1 << 5, ///< Generate character set conversion facets (derived from std::codecvt) boundary = 1 << 6, ///< Generate boundary analysis facet calendar = 1 << 16, ///< Generate boundary analysis facet information = 1 << 17, ///< Generate general locale information facet }; typedef BOOST_DEPRECATED("Use category_t") category_t locale_category_type; /// First facet specific for character constexpr category_t per_character_facet_first = category_t::convert; /// Last facet specific for character constexpr category_t per_character_facet_last = category_t::boundary; /// First character independent facet constexpr category_t non_character_facet_first = category_t::calendar; /// Last character independent facet constexpr category_t non_character_facet_last = category_t::information; /// First category facet constexpr category_t category_first = category_t::convert; /// Last category facet constexpr category_t category_last = category_t::information; /// Generate all of them constexpr category_t all_categories = category_t(0xFFFFFFFFu); /// \brief the major class used for locale generation /// /// This class is used for specification of all parameters required for locale generation and /// caching. This class const member functions are thread safe if locale class implementation is thread safe. class BOOST_LOCALE_DECL generator { public: /// Create new generator using global localization_backend_manager generator(); /// Create new generator using specific localization_backend_manager generator(const localization_backend_manager&); ~generator(); /// Set types of facets that should be generated, default all void categories(category_t cats); /// Get types of facets that should be generated, default all category_t categories() const; /// Set the characters type for which the facets should be generated, default all supported void characters(char_facet_t chars); /// Get the characters type for which the facets should be generated, default all supported char_facet_t characters() const; /// Add a new domain of messages that would be generated. It should be set in order to enable /// messages support. /// /// Messages domain has following format: "name" or "name/encoding" /// where name is the base name of the "mo" file where the catalog is stored /// without ".mo" extension. For example for file \c /usr/share/locale/he/LC_MESSAGES/blog.mo /// it would be \c blog. /// /// You can optionally specify the encoding of the keys in the sources by adding "/encoding_name" /// For example blog/cp1255. /// /// If not defined all keys are assumed to be UTF-8 encoded. /// /// \note When you select a domain for the program using dgettext or message API, you /// do not specify the encoding part. So for example if the provided /// domain name was "blog/windows-1255" then for translation /// you should use dgettext("blog","Hello") void add_messages_domain(const std::string& domain); /// Set default message domain. If this member was not called, the first added messages domain is used. /// If the domain \a domain is not added yet it is added. void set_default_messages_domain(const std::string& domain); /// Remove all added domains from the list void clear_domains(); /// Add a search path where dictionaries are looked in. /// /// \note /// /// - Under the Windows platform the path is treated as a path in the locale's encoding so /// if you create locale "en_US.windows-1251" then path would be treated as cp1255, /// and if it is en_US.UTF-8 it is treated as UTF-8. File name is always opened with /// a wide file name as wide file names are the native file name on Windows. /// /// - Under POSIX platforms all paths passed as-is regardless of encoding as narrow /// encodings are the native encodings for POSIX platforms. /// void add_messages_path(const std::string& path); /// Remove all added paths void clear_paths(); /// Remove all cached locales void clear_cache(); /// Turn locale caching ON void locale_cache_enabled(bool on); /// Get locale cache option bool locale_cache_enabled() const; /// Check if by default ANSI encoding is selected or UTF-8 onces. The default is false. bool use_ansi_encoding() const; /// Select ANSI encodings as default system encoding rather then UTF-8 by default /// under Windows. /// /// The default is the most portable and most powerful encoding, UTF-8, but the user /// can select "system" one if dealing with legacy applications void use_ansi_encoding(bool enc); /// Generate a locale with id \a id std::locale generate(const std::string& id) const; /// Generate a locale with id \a id. Use \a base as a locale to which all facets are added, /// instead of std::locale::classic(). std::locale generate(const std::locale& base, const std::string& id) const; /// Shortcut to generate(id) std::locale operator()(const std::string& id) const { return generate(id); } private: void set_all_options(localization_backend& backend, const std::string& id) const; generator(const generator&); void operator=(const generator&); struct data; hold_ptr d; }; constexpr char_facet_t operator|(const char_facet_t lhs, const char_facet_t rhs) { return char_facet_t(static_cast(lhs) | static_cast(rhs)); } constexpr char_facet_t operator^(const char_facet_t lhs, const char_facet_t rhs) { return char_facet_t(static_cast(lhs) ^ static_cast(rhs)); } constexpr bool operator&(const char_facet_t lhs, const char_facet_t rhs) { return (static_cast(lhs) & static_cast(rhs)) != 0u; } // Prefix increment: Return the next value BOOST_CXX14_CONSTEXPR inline char_facet_t& operator++(char_facet_t& v) { return v = char_facet_t(static_cast(v) ? static_cast(v) << 1 : 1); } constexpr category_t operator|(const category_t lhs, const category_t rhs) { return category_t(static_cast(lhs) | static_cast(rhs)); } constexpr category_t operator^(const category_t lhs, const category_t rhs) { return category_t(static_cast(lhs) ^ static_cast(rhs)); } constexpr bool operator&(const category_t lhs, const category_t rhs) { return (static_cast(lhs) & static_cast(rhs)) != 0u; } // Prefix increment: Return the next value BOOST_CXX14_CONSTEXPR inline category_t& operator++(category_t& v) { return v = category_t(static_cast(v) << 1); } } // namespace locale } // namespace boost #ifdef BOOST_MSVC # pragma warning(pop) #endif #endif