stdex
Additional custom or not Standard C++ covered algorithms
Loading...
Searching...
No Matches
locale.hpp
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 2016-2024 Amebis
4*/
5
6#pragma once
7
8#include "compat.hpp"
9#include <locale.h>
10#include <memory>
11
12namespace stdex
13{
14#ifdef _WIN32
15 using locale_t = _locale_t;
16
17 inline locale_t create_locale(_In_ int category, _In_z_ const char* locale) { return _create_locale(category, locale); }
18 inline locale_t create_locale(_In_ int category, _In_z_ const wchar_t* locale) { return _wcreate_locale(category, locale); }
19 inline void free_locale(_In_opt_ locale_t locale) { _free_locale(locale); }
20#else
21 using locale_t = ::locale_t;
22
23 inline locale_t create_locale(_In_ int category, _In_z_ const char* locale)
24 {
25 int mask = 0;
26 switch (category) {
27 case LC_ALL : mask = LC_ALL_MASK ; break;
28 case LC_COLLATE : mask = LC_COLLATE_MASK ; break;
29 case LC_CTYPE : mask = LC_CTYPE_MASK ; break;
30 case LC_MESSAGES: mask = LC_MESSAGES_MASK; break;
31 case LC_MONETARY: mask = LC_MONETARY_MASK; break;
32 case LC_NUMERIC : mask = LC_NUMERIC_MASK ; break;
33 case LC_TIME : mask = LC_TIME_MASK ; break;
34 }
35 return newlocale(mask, locale, LC_GLOBAL_LOCALE);
36 }
37
38 inline void free_locale(_In_opt_ locale_t locale) { freelocale(locale); }
39#endif
40
45 {
49 void operator()(_In_ locale_t locale) const
50 {
51 free_locale(locale);
52 }
53 };
54
56#if defined(_WIN32)
57 using _locale_t_ref = __crt_locale_pointers;
58#elif defined(__APPLE__)
59 using _locale_t_ref = struct _xlocale;
60#else
61 using _locale_t_ref = struct __locale_struct;
62#endif
64
68 class locale : public std::unique_ptr<_locale_t_ref, free_locale_delete>
69 {
70 public:
71 locale() = default;
72
73 locale(_In_ locale_t ptr) :
74 std::unique_ptr<_locale_t_ref, free_locale_delete>(ptr)
75 {}
76
77 locale(_In_ int category, _In_z_ const char* locale) :
78 stdex::locale(create_locale(category, locale))
79 {}
80
81#ifdef _WIN32
82 locale(_In_ int category, _In_z_ const wchar_t* locale) :
83 stdex::locale(create_locale(category, locale))
84 {}
85#endif
86
87 operator locale_t() const { return get(); }
88 };
89
93 const inline locale locale_C(create_locale(LC_ALL, "C"));
94
98 const inline locale locale_utf8(create_locale(LC_ALL, ".UTF-8"));
99
103 const inline locale locale_default(
104#ifdef WIN32
105#ifdef _CONSOLE
106 create_locale(LC_ALL, ".OCP")
107#else
108 create_locale(LC_ALL, ".ACP")
109#endif
110#else
111 nullptr
112#endif
113 );
114}
locale_t helper class to free_locale when going out of scope.
Definition locale.hpp:69
Deleter for unique_ptr using free_locale.
Definition locale.hpp:45
void operator()(locale_t locale) const
Delete a pointer.
Definition locale.hpp:49