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 locale(create_locale(category, locale))
79 {}
80
81 locale(_In_ int category, _In_z_ const wchar_t* locale) :
82 locale(create_locale(category, locale))
83 {}
84
85 operator locale_t() const { return get(); }
86 };
87
91 const inline locale locale_C(create_locale(LC_ALL, "C"));
92
96 const inline locale locale_utf8(create_locale(LC_ALL, ".UTF-8"));
97
101 const inline locale locale_default(create_locale(LC_ALL,
102#ifdef WIN32
103#ifdef _CONSOLE
104 ".OCP"
105#else
106 ".ACP"
107#endif
108#else
109 ""
110#endif
111 ));
112}
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