Chris@16: // Chris@16: // Copyright (c) 2009-2011 Artyom Beilis (Tonkikh) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: #ifndef BOOST_LOCALE_MESSAGE_HPP_INCLUDED Chris@16: #define BOOST_LOCALE_MESSAGE_HPP_INCLUDED Chris@16: Chris@16: #include Chris@16: #ifdef BOOST_MSVC Chris@16: # pragma warning(push) Chris@16: # pragma warning(disable : 4275 4251 4231 4660) Chris@16: #endif Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: Chris@16: namespace boost { Chris@16: namespace locale { Chris@16: /// Chris@16: /// \defgroup message Message Formatting (translation) Chris@16: /// Chris@16: ///This module provides message translation functionality, i.e. allow your application to speak native language Chris@16: /// Chris@16: /// @{ Chris@16: /// Chris@16: Chris@16: /// \cond INTERNAL Chris@16: Chris@16: template Chris@16: struct base_message_format: public std::locale::facet Chris@16: { Chris@16: }; Chris@16: Chris@16: /// \endcond Chris@16: Chris@16: /// Chris@16: /// \brief This facet provides message formatting abilities Chris@16: /// Chris@16: template Chris@16: class message_format : public base_message_format Chris@16: { Chris@16: public: Chris@16: Chris@16: /// Chris@16: /// Character type Chris@16: /// Chris@16: typedef CharType char_type; Chris@16: /// Chris@16: /// String type Chris@16: /// Chris@16: typedef std::basic_string string_type; Chris@16: Chris@16: /// Chris@16: /// Default constructor Chris@16: /// Chris@16: message_format(size_t refs = 0) : Chris@16: base_message_format(refs) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// This function returns a pointer to the string for a message defined by a \a context Chris@16: /// and identification string \a id. Both create a single key for message lookup in Chris@16: /// a domain defined by \a domain_id. Chris@16: /// Chris@16: /// If \a context is NULL it is not considered to be a part of the key Chris@16: /// Chris@16: /// If a translated string is found, it is returned, otherwise NULL is returned Chris@16: /// Chris@16: /// Chris@16: virtual char_type const *get(int domain_id,char_type const *context,char_type const *id) const = 0; Chris@16: /// Chris@16: /// This function returns a pointer to the string for a plural message defined by a \a context Chris@16: /// and identification string \a single_id. Chris@16: /// Chris@16: /// If \a context is NULL it is not considered to be a part of the key Chris@16: /// Chris@16: /// Both create a single key for message lookup in Chris@16: /// a domain defined \a domain_id. \a n is used to pick the correct translation string for a specific Chris@16: /// number. Chris@16: /// Chris@16: /// If a translated string is found, it is returned, otherwise NULL is returned Chris@16: /// Chris@16: /// Chris@16: virtual char_type const *get(int domain_id,char_type const *context,char_type const *single_id,int n) const = 0; Chris@16: Chris@16: /// Chris@16: /// Convert a string that defines \a domain to the integer id used by \a get functions Chris@16: /// Chris@16: virtual int domain(std::string const &domain) const = 0; Chris@16: Chris@16: /// Chris@16: /// Convert the string \a msg to target locale's encoding. If \a msg is already Chris@16: /// in target encoding it would be returned otherwise the converted Chris@16: /// string is stored in temporary \a buffer and buffer.c_str() is returned. Chris@16: /// Chris@16: /// Note: for char_type that is char16_t, char32_t and wchar_t it is no-op, returns Chris@16: /// msg Chris@16: /// Chris@16: virtual char_type const *convert(char_type const *msg,string_type &buffer) const = 0; Chris@16: Chris@16: #if defined (__SUNPRO_CC) && defined (_RWSTD_VER) Chris@16: std::locale::id& __get_id (void) const { return id; } Chris@16: #endif Chris@16: protected: Chris@16: virtual ~message_format() Chris@16: { Chris@16: } Chris@16: Chris@16: }; Chris@16: Chris@16: /// \cond INTERNAL Chris@16: Chris@16: namespace details { Chris@16: inline bool is_us_ascii_char(char c) Chris@16: { Chris@16: // works for null terminated strings regardless char "signness" Chris@16: return 0 Chris@16: struct string_cast_traits { Chris@16: static CharType const *cast(CharType const *msg,std::basic_string &/*unused*/) Chris@16: { Chris@16: return msg; Chris@16: } Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct string_cast_traits { Chris@16: static char const *cast(char const *msg,std::string &buffer) Chris@16: { Chris@16: if(is_us_ascii_string(msg)) Chris@16: return msg; Chris@16: buffer.reserve(strlen(msg)); Chris@16: char c; Chris@16: while((c=*msg++)!=0) { Chris@16: if(is_us_ascii_char(c)) Chris@16: buffer+=c; Chris@16: } Chris@16: return buffer.c_str(); Chris@16: } Chris@16: }; Chris@16: } // details Chris@16: Chris@16: /// \endcond Chris@16: Chris@16: /// Chris@16: /// \brief This class represents a message that can be converted to a specific locale message Chris@16: /// Chris@16: /// It holds the original ASCII string that is queried in the dictionary when converting to the output string. Chris@16: /// The created string may be UTF-8, UTF-16, UTF-32 or other 8-bit encoded string according to the target Chris@16: /// character type and locale encoding. Chris@16: /// Chris@16: template Chris@16: class basic_message { Chris@16: public: Chris@16: Chris@16: typedef CharType char_type; ///< The character this message object is used with Chris@16: typedef std::basic_string string_type; ///< The string type this object can be used with Chris@16: typedef message_format facet_type; ///< The type of the facet the messages are fetched with Chris@16: Chris@16: /// Chris@16: /// Create default empty message Chris@16: /// Chris@16: basic_message() : Chris@16: n_(0), Chris@16: c_id_(0), Chris@16: c_context_(0), Chris@16: c_plural_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple message from 0 terminated string. The string should exist Chris@16: /// until the message is destroyed. Generally useful with static constant strings Chris@16: /// Chris@16: explicit basic_message(char_type const *id) : Chris@16: n_(0), Chris@16: c_id_(id), Chris@16: c_context_(0), Chris@16: c_plural_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple plural form message from 0 terminated strings. The strings should exist Chris@16: /// until the message is destroyed. Generally useful with static constant strings. Chris@16: /// Chris@16: /// \a n is the number, \a single and \a plural are singular and plural forms of the message Chris@16: /// Chris@16: explicit basic_message(char_type const *single,char_type const *plural,int n) : Chris@16: n_(n), Chris@16: c_id_(single), Chris@16: c_context_(0), Chris@16: c_plural_(plural) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple message from 0 terminated strings, with context Chris@16: /// information. The string should exist Chris@16: /// until the message is destroyed. Generally useful with static constant strings Chris@16: /// Chris@16: explicit basic_message(char_type const *context,char_type const *id) : Chris@16: n_(0), Chris@16: c_id_(id), Chris@16: c_context_(context), Chris@16: c_plural_(0) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple plural form message from 0 terminated strings, with context. The strings should exist Chris@16: /// until the message is destroyed. Generally useful with static constant strings. Chris@16: /// Chris@16: /// \a n is the number, \a single and \a plural are singular and plural forms of the message Chris@16: /// Chris@16: explicit basic_message(char_type const *context,char_type const *single,char_type const *plural,int n) : Chris@16: n_(n), Chris@16: c_id_(single), Chris@16: c_context_(context), Chris@16: c_plural_(plural) Chris@16: { Chris@16: } Chris@16: Chris@16: Chris@16: /// Chris@16: /// Create a simple message from a string. Chris@16: /// Chris@16: explicit basic_message(string_type const &id) : Chris@16: n_(0), Chris@16: c_id_(0), Chris@16: c_context_(0), Chris@16: c_plural_(0), Chris@16: id_(id) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple plural form message from strings. Chris@16: /// Chris@16: /// \a n is the number, \a single and \a plural are single and plural forms of the message Chris@16: /// Chris@16: explicit basic_message(string_type const &single,string_type const &plural,int number) : Chris@16: n_(number), Chris@16: c_id_(0), Chris@16: c_context_(0), Chris@16: c_plural_(0), Chris@16: id_(single), Chris@16: plural_(plural) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple message from a string with context. Chris@16: /// Chris@16: explicit basic_message(string_type const &context,string_type const &id) : Chris@16: n_(0), Chris@16: c_id_(0), Chris@16: c_context_(0), Chris@16: c_plural_(0), Chris@16: id_(id), Chris@16: context_(context) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Create a simple plural form message from strings. Chris@16: /// Chris@16: /// \a n is the number, \a single and \a plural are single and plural forms of the message Chris@16: /// Chris@16: explicit basic_message(string_type const &context,string_type const &single,string_type const &plural,int number) : Chris@16: n_(number), Chris@16: c_id_(0), Chris@16: c_context_(0), Chris@16: c_plural_(0), Chris@16: id_(single), Chris@16: context_(context), Chris@16: plural_(plural) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Copy an object Chris@16: /// Chris@16: basic_message(basic_message const &other) : Chris@16: n_(other.n_), Chris@16: c_id_(other.c_id_), Chris@16: c_context_(other.c_context_), Chris@16: c_plural_(other.c_plural_), Chris@16: id_(other.id_), Chris@16: context_(other.context_), Chris@16: plural_(other.plural_) Chris@16: { Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Assign other message object to this one Chris@16: /// Chris@16: basic_message const &operator=(basic_message const &other) Chris@16: { Chris@16: if(this==&other) { Chris@16: return *this; Chris@16: } Chris@16: basic_message tmp(other); Chris@16: swap(tmp); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Swap two message objects Chris@16: /// Chris@16: void swap(basic_message &other) Chris@16: { Chris@16: std::swap(n_,other.n_); Chris@16: std::swap(c_id_,other.c_id_); Chris@16: std::swap(c_context_,other.c_context_); Chris@16: std::swap(c_plural_,other.c_plural_); Chris@16: Chris@16: id_.swap(other.id_); Chris@16: context_.swap(other.context_); Chris@16: plural_.swap(other.plural_); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Message class can be explicitly converted to string class Chris@16: /// Chris@16: Chris@16: operator string_type () const Chris@16: { Chris@16: return str(); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Translate message to a string in the default global locale, using default domain Chris@16: /// Chris@16: string_type str() const Chris@16: { Chris@16: std::locale loc; Chris@16: return str(loc,0); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Translate message to a string in the locale \a locale, using default domain Chris@16: /// Chris@16: string_type str(std::locale const &locale) const Chris@16: { Chris@16: return str(locale,0); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Translate message to a string using locale \a locale and message domain \a domain_id Chris@16: /// Chris@16: string_type str(std::locale const &locale,std::string const &domain_id) const Chris@16: { Chris@16: int id=0; Chris@16: if(std::has_facet(locale)) Chris@16: id=std::use_facet(locale).domain(domain_id); Chris@16: return str(locale,id); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Translate message to a string using the default locale and message domain \a domain_id Chris@16: /// Chris@16: string_type str(std::string const &domain_id) const Chris@16: { Chris@16: int id=0; Chris@16: std::locale loc; Chris@16: if(std::has_facet(loc)) Chris@16: id=std::use_facet(loc).domain(domain_id); Chris@16: return str(loc,id); Chris@16: } Chris@16: Chris@16: Chris@16: /// Chris@16: /// Translate message to a string using locale \a loc and message domain index \a id Chris@16: /// Chris@16: string_type str(std::locale const &loc,int id) const Chris@16: { Chris@16: string_type buffer; Chris@16: char_type const *ptr = write(loc,id,buffer); Chris@16: if(ptr == buffer.c_str()) Chris@16: return buffer; Chris@16: else Chris@16: buffer = ptr; Chris@16: return buffer; Chris@16: } Chris@16: Chris@16: Chris@16: /// Chris@16: /// Translate message and write to stream \a out, using imbued locale and domain set to the Chris@16: /// stream Chris@16: /// Chris@16: void write(std::basic_ostream &out) const Chris@16: { Chris@16: std::locale const &loc = out.getloc(); Chris@16: int id = ios_info::get(out).domain_id(); Chris@16: string_type buffer; Chris@16: out << write(loc,id,buffer); Chris@16: } Chris@16: Chris@16: private: Chris@16: char_type const *plural() const Chris@16: { Chris@16: if(c_plural_) Chris@16: return c_plural_; Chris@16: if(plural_.empty()) Chris@16: return 0; Chris@16: return plural_.c_str(); Chris@16: } Chris@16: char_type const *context() const Chris@16: { Chris@16: if(c_context_) Chris@16: return c_context_; Chris@16: if(context_.empty()) Chris@16: return 0; Chris@16: return context_.c_str(); Chris@16: } Chris@16: Chris@16: char_type const *id() const Chris@16: { Chris@16: return c_id_ ? c_id_ : id_.c_str(); Chris@16: } Chris@16: Chris@16: char_type const *write(std::locale const &loc,int domain_id,string_type &buffer) const Chris@16: { Chris@16: char_type const *translated = 0; Chris@16: static const char_type empty_string[1] = {0}; Chris@16: Chris@16: char_type const *id = this->id(); Chris@16: char_type const *context = this->context(); Chris@16: char_type const *plural = this->plural(); Chris@16: Chris@16: if(*id == 0) Chris@16: return empty_string; Chris@16: Chris@16: facet_type const *facet = 0; Chris@16: if(std::has_facet(loc)) Chris@16: facet = &std::use_facet(loc); Chris@16: Chris@16: if(facet) { Chris@16: if(!plural) { Chris@16: translated = facet->get(domain_id,context,id); Chris@16: } Chris@16: else { Chris@16: translated = facet->get(domain_id,context,id,n_); Chris@16: } Chris@16: } Chris@16: Chris@16: if(!translated) { Chris@16: char_type const *msg = plural ? ( n_ == 1 ? id : plural) : id; Chris@16: Chris@16: if(facet) { Chris@16: translated = facet->convert(msg,buffer); Chris@16: } Chris@16: else { Chris@16: translated = details::string_cast_traits::cast(msg,buffer); Chris@16: } Chris@16: } Chris@16: return translated; Chris@16: } Chris@16: Chris@16: /// members Chris@16: Chris@16: int n_; Chris@16: char_type const *c_id_; Chris@16: char_type const *c_context_; Chris@16: char_type const *c_plural_; Chris@16: string_type id_; Chris@16: string_type context_; Chris@16: string_type plural_; Chris@16: }; Chris@16: Chris@16: Chris@16: /// Chris@16: /// Convenience typedef for char Chris@16: /// Chris@16: typedef basic_message message; Chris@16: /// Chris@16: /// Convenience typedef for wchar_t Chris@16: /// Chris@16: typedef basic_message wmessage; Chris@16: #ifdef BOOST_HAS_CHAR16_T Chris@16: /// Chris@16: /// Convenience typedef for char16_t Chris@16: /// Chris@16: typedef basic_message u16message; Chris@16: #endif Chris@16: #ifdef BOOST_HAS_CHAR32_T Chris@16: /// Chris@16: /// Convenience typedef for char32_t Chris@16: /// Chris@16: typedef basic_message u32message; Chris@16: #endif Chris@16: Chris@16: /// Chris@16: /// Translate message \a msg and write it to stream Chris@16: /// Chris@16: template Chris@16: std::basic_ostream &operator<<(std::basic_ostream &out,basic_message const &msg) Chris@16: { Chris@16: msg.write(out); Chris@16: return out; Chris@16: } Chris@16: Chris@16: /// Chris@16: /// \anchor boost_locale_translate_family \name Indirect message translation function family Chris@16: /// @{ Chris@16: Chris@16: /// Chris@16: /// \brief Translate a message, \a msg is not copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate(CharType const *msg) Chris@16: { Chris@16: return basic_message(msg); Chris@16: } Chris@16: /// Chris@16: /// \brief Translate a message in context, \a msg and \a context are not copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate( CharType const *context, Chris@16: CharType const *msg) Chris@16: { Chris@16: return basic_message(context,msg); Chris@16: } Chris@16: /// Chris@16: /// \brief Translate a plural message form, \a single and \a plural are not copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate( CharType const *single, Chris@16: CharType const *plural, Chris@16: int n) Chris@16: { Chris@16: return basic_message(single,plural,n); Chris@16: } Chris@16: /// Chris@16: /// \brief Translate a plural message from in constext, \a context, \a single and \a plural are not copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate( CharType const *context, Chris@16: CharType const *single, Chris@16: CharType const *plural, Chris@16: int n) Chris@16: { Chris@16: return basic_message(context,single,plural,n); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// \brief Translate a message, \a msg is copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate(std::basic_string const &msg) Chris@16: { Chris@16: return basic_message(msg); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// \brief Translate a message in context,\a context and \a msg is copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate( std::basic_string const &context, Chris@16: std::basic_string const &msg) Chris@16: { Chris@16: return basic_message(context,msg); Chris@16: } Chris@16: /// Chris@16: /// \brief Translate a plural message form in constext, \a context, \a single and \a plural are copied Chris@16: /// Chris@16: template Chris@16: inline basic_message translate( std::basic_string const &context, Chris@16: std::basic_string const &single, Chris@16: std::basic_string const &plural, Chris@16: int n) Chris@16: { Chris@16: return basic_message(context,single,plural,n); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// \brief Translate a plural message form, \a single and \a plural are copied Chris@16: /// Chris@16: Chris@16: template Chris@16: inline basic_message translate( std::basic_string const &single, Chris@16: std::basic_string const &plural, Chris@16: int n) Chris@16: { Chris@16: return basic_message(single,plural,n); Chris@16: } Chris@16: Chris@16: /// @} Chris@16: Chris@16: /// Chris@16: /// \anchor boost_locale_gettext_family \name Direct message translation functions family Chris@16: /// Chris@16: Chris@16: /// Chris@16: /// Translate message \a id according to locale \a loc Chris@16: /// Chris@16: template Chris@16: std::basic_string gettext(CharType const *id, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(id).str(loc); Chris@16: } Chris@16: /// Chris@16: /// Translate plural form according to locale \a loc Chris@16: /// Chris@16: template Chris@16: std::basic_string ngettext( CharType const *s, Chris@16: CharType const *p, Chris@16: int n, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(s,p,n).str(loc); Chris@16: } Chris@16: /// Chris@16: /// Translate message \a id according to locale \a loc in domain \a domain Chris@16: /// Chris@16: template Chris@16: std::basic_string dgettext( char const *domain, Chris@16: CharType const *id, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(id).str(loc,domain); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// Translate plural form according to locale \a loc in domain \a domain Chris@16: /// Chris@16: template Chris@16: std::basic_string dngettext( char const *domain, Chris@16: CharType const *s, Chris@16: CharType const *p, Chris@16: int n, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(s,p,n).str(loc,domain); Chris@16: } Chris@16: /// Chris@16: /// Translate message \a id according to locale \a loc in context \a context Chris@16: /// Chris@16: template Chris@16: std::basic_string pgettext( CharType const *context, Chris@16: CharType const *id, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(context,id).str(loc); Chris@16: } Chris@16: /// Chris@16: /// Translate plural form according to locale \a loc in context \a context Chris@16: /// Chris@16: template Chris@16: std::basic_string npgettext( CharType const *context, Chris@16: CharType const *s, Chris@16: CharType const *p, Chris@16: int n, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(context,s,p,n).str(loc); Chris@16: } Chris@16: /// Chris@16: /// Translate message \a id according to locale \a loc in domain \a domain in context \a context Chris@16: /// Chris@16: template Chris@16: std::basic_string dpgettext( char const *domain, Chris@16: CharType const *context, Chris@16: CharType const *id, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(context,id).str(loc,domain); Chris@16: } Chris@16: /// Chris@16: /// Translate plural form according to locale \a loc in domain \a domain in context \a context Chris@16: /// Chris@16: template Chris@16: std::basic_string dnpgettext(char const *domain, Chris@16: CharType const *context, Chris@16: CharType const *s, Chris@16: CharType const *p, Chris@16: int n, Chris@16: std::locale const &loc=std::locale()) Chris@16: { Chris@16: return basic_message(context,s,p,n).str(loc,domain); Chris@16: } Chris@16: Chris@16: /// Chris@16: /// \cond INTERNAL Chris@16: /// Chris@16: Chris@16: template<> Chris@16: struct BOOST_LOCALE_DECL base_message_format : public std::locale::facet Chris@16: { Chris@16: base_message_format(size_t refs = 0) : std::locale::facet(refs) Chris@16: { Chris@16: } Chris@16: static std::locale::id id; Chris@16: }; Chris@16: Chris@16: template<> Chris@16: struct BOOST_LOCALE_DECL base_message_format : public std::locale::facet Chris@16: { Chris@16: base_message_format(size_t refs = 0) : std::locale::facet(refs) Chris@16: { Chris@16: } Chris@16: static std::locale::id id; Chris@16: }; Chris@16: Chris@16: #ifdef BOOST_HAS_CHAR16_T Chris@16: Chris@16: template<> Chris@16: struct BOOST_LOCALE_DECL base_message_format : public std::locale::facet Chris@16: { Chris@16: base_message_format(size_t refs = 0) : std::locale::facet(refs) Chris@16: { Chris@16: } Chris@16: static std::locale::id id; Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_HAS_CHAR32_T Chris@16: Chris@16: template<> Chris@16: struct BOOST_LOCALE_DECL base_message_format : public std::locale::facet Chris@16: { Chris@16: base_message_format(size_t refs = 0) : std::locale::facet(refs) Chris@16: { Chris@16: } Chris@16: static std::locale::id id; Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: /// \endcond Chris@16: Chris@16: /// Chris@16: /// @} Chris@16: /// Chris@16: Chris@16: namespace as { Chris@16: /// \cond INTERNAL Chris@16: namespace details { Chris@16: struct set_domain { Chris@16: std::string domain_id; Chris@16: }; Chris@16: template Chris@16: std::basic_ostream &operator<<(std::basic_ostream &out, set_domain const &dom) Chris@16: { Chris@16: int id = std::use_facet >(out.getloc()).domain(dom.domain_id); Chris@16: ios_info::get(out).domain_id(id); Chris@16: return out; Chris@16: } Chris@16: } // details Chris@16: /// \endcond Chris@16: Chris@16: /// Chris@16: /// \addtogroup manipulators Chris@16: /// Chris@16: /// @{ Chris@16: Chris@16: /// Chris@16: /// Manipulator for switching message domain in ostream, Chris@16: /// Chris@16: /// \note The returned object throws std::bad_cast if the I/O stream does not have \ref message_format facet installed Chris@16: /// Chris@16: inline Chris@16: #ifdef BOOST_LOCALE_DOXYGEN Chris@16: unspecified_type Chris@16: #else Chris@16: details::set_domain Chris@16: #endif Chris@16: domain(std::string const &id) Chris@16: { Chris@16: details::set_domain tmp = { id }; Chris@16: return tmp; Chris@16: } Chris@16: /// @} Chris@16: } // as Chris@16: } // locale Chris@16: } // boost Chris@16: Chris@16: #ifdef BOOST_MSVC Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: Chris@16: #endif Chris@16: Chris@16: // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4 Chris@16: