summaryrefslogtreecommitdiffstats
path: root/contrib/restricted/boost/locale/src/shared/generator.cpp
diff options
context:
space:
mode:
authorthegeorg <[email protected]>2025-05-07 11:09:12 +0300
committerthegeorg <[email protected]>2025-05-07 11:25:22 +0300
commit4c98f14a2491da2bc1a9d40fed1d1682c7ec5dd6 (patch)
tree8142081775c27c8780fa0282a0273ee268e13b98 /contrib/restricted/boost/locale/src/shared/generator.cpp
parent40b86c68b431bb65d67bba51ef9159066a833b68 (diff)
Update contrib/restricted/boost/locale to 1.88.0
commit_hash:87b595328ea79c6ba38cb973580804486ca4a3ff
Diffstat (limited to 'contrib/restricted/boost/locale/src/shared/generator.cpp')
-rw-r--r--contrib/restricted/boost/locale/src/shared/generator.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/contrib/restricted/boost/locale/src/shared/generator.cpp b/contrib/restricted/boost/locale/src/shared/generator.cpp
new file mode 100644
index 00000000000..ddff3ba655e
--- /dev/null
+++ b/contrib/restricted/boost/locale/src/shared/generator.cpp
@@ -0,0 +1,186 @@
+//
+// Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
+// Copyright (c) 2024 Alexander Grund
+//
+// Distributed under the Boost Software License, Version 1.0.
+// https://www.boost.org/LICENSE_1_0.txt
+
+#include <boost/locale/encoding.hpp>
+#include <boost/locale/generator.hpp>
+#include <boost/locale/localization_backend.hpp>
+#include <boost/thread/locks.hpp>
+#include <boost/thread/mutex.hpp>
+#include <algorithm>
+#include <map>
+#include <vector>
+
+namespace boost { namespace locale {
+ struct generator::data {
+ data(const localization_backend_manager& mgr) :
+ cats(all_categories), chars(all_characters), caching_enabled(false), use_ansi_encoding(false),
+ backend_manager(mgr)
+ {}
+
+ mutable std::map<std::string, std::locale> cached;
+ mutable boost::mutex cached_lock;
+
+ category_t cats;
+ char_facet_t chars;
+
+ bool caching_enabled;
+ bool use_ansi_encoding;
+
+ std::vector<std::string> paths;
+ std::vector<std::string> domains;
+
+ std::map<std::string, std::vector<std::string>> options;
+
+ localization_backend_manager backend_manager;
+ };
+
+ generator::generator(const localization_backend_manager& mgr) : d(new generator::data(mgr)) {}
+ generator::generator() : d(new generator::data(localization_backend_manager::global())) {}
+ generator::~generator() = default;
+
+ category_t generator::categories() const
+ {
+ return d->cats;
+ }
+ void generator::categories(category_t t)
+ {
+ d->cats = t;
+ }
+
+ void generator::characters(char_facet_t t)
+ {
+ d->chars = t;
+ }
+
+ char_facet_t generator::characters() const
+ {
+ return d->chars;
+ }
+
+ void generator::add_messages_domain(const std::string& domain)
+ {
+ if(std::find(d->domains.begin(), d->domains.end(), domain) == d->domains.end())
+ d->domains.push_back(domain);
+ }
+
+ void generator::set_default_messages_domain(const std::string& domain)
+ {
+ const auto p = std::find(d->domains.begin(), d->domains.end(), domain);
+ if(p != d->domains.end())
+ d->domains.erase(p);
+ d->domains.insert(d->domains.begin(), domain);
+ }
+
+ void generator::clear_domains()
+ {
+ d->domains.clear();
+ }
+ void generator::add_messages_path(const std::string& path)
+ {
+ d->paths.push_back(path);
+ }
+ void generator::clear_paths()
+ {
+ d->paths.clear();
+ }
+ void generator::clear_cache()
+ {
+ d->cached.clear();
+ }
+
+ std::locale generator::generate(const std::string& id) const
+ {
+ return generate(std::locale::classic(), id);
+ }
+
+ std::locale generator::generate(const std::locale& base, const std::string& id) const
+ {
+ if(d->caching_enabled) {
+ boost::unique_lock<boost::mutex> guard(d->cached_lock);
+ const auto p = d->cached.find(id);
+ if(p != d->cached.end())
+ return p->second;
+ }
+ auto backend = d->backend_manager.create();
+ set_all_options(*backend, id);
+
+ std::locale result = base;
+ const category_t facets = d->cats;
+ const char_facet_t chars = d->chars;
+
+ for(category_t facet = per_character_facet_first; facet <= per_character_facet_last; ++facet) {
+ if(!(facets & facet))
+ continue;
+ for(char_facet_t ch = character_facet_first; ch <= character_facet_last; ++ch) {
+ if(ch & chars)
+ result = backend->install(result, facet, ch);
+ }
+ }
+ for(category_t facet = non_character_facet_first; facet <= non_character_facet_last; ++facet) {
+ if(facets & facet)
+ result = backend->install(result, facet, char_facet_t::nochar);
+ }
+ if(d->caching_enabled) {
+ boost::unique_lock<boost::mutex> guard(d->cached_lock);
+ const auto p = d->cached.find(id);
+ if(p == d->cached.end())
+ d->cached[id] = result;
+ }
+ return result;
+ }
+
+ bool generator::use_ansi_encoding() const
+ {
+ return d->use_ansi_encoding;
+ }
+
+ void generator::use_ansi_encoding(bool v)
+ {
+ d->use_ansi_encoding = v;
+ }
+
+ bool generator::locale_cache_enabled() const
+ {
+ return d->caching_enabled;
+ }
+ void generator::locale_cache_enabled(bool enabled)
+ {
+ d->caching_enabled = enabled;
+ }
+
+ void generator::set_all_options(localization_backend& backend, const std::string& id) const
+ {
+ backend.set_option("locale", id);
+ backend.set_option("use_ansi_encoding", d->use_ansi_encoding ? "true" : "false");
+ for(const std::string& domain : d->domains)
+ backend.set_option("message_application", domain);
+ for(const std::string& path : d->paths)
+ backend.set_option("message_path", path);
+ }
+
+ // Sanity check
+
+ static_assert((char_facet_t::char_f | char_facet_t::wchar_f) & char_facet_t::char_f, "!");
+ static_assert((char_facet_t::char_f | char_facet_t::wchar_f) & char_facet_t::wchar_f, "!");
+ static_assert(!((all_characters ^ char_facet_t::wchar_f) & char_facet_t::wchar_f), "!");
+
+ static_assert((category_t::calendar | category_t::convert) & category_t::calendar, "!");
+ static_assert((category_t::calendar | category_t::convert) & category_t::convert, "!");
+ static_assert(!((all_categories ^ category_t::calendar) & category_t::calendar), "!");
+
+#ifndef BOOST_NO_CXX14_CONSTEXPR
+ template<typename T>
+ constexpr T inc_enum(T v)
+ {
+ return ++v;
+ }
+ static_assert(inc_enum(char_facet_t::nochar) == char_facet_t::char_f, "!");
+ static_assert(inc_enum(char_facet_t::char_f) == char_facet_t::wchar_f, "!");
+ static_assert(inc_enum(category_t::convert) == category_t::collation, "!");
+#endif
+
+}} // namespace boost::locale