xtd 0.2.0
Loading...
Searching...
No Matches
__enum_formatter.h
Go to the documentation of this file.
1
3#pragma once
5#if !defined(__XTD_CORE_INTERNAL__)
6#error "Do not include this file: Internal use only"
7#endif
9
10#include "__numeric_formatter.h"
11#include "__format_exception.h"
12
14template<typename enum_t>
15std::string __enum_to_string(enum_t value) noexcept;
16
17template<typename char_t, typename value_t>
18inline std::basic_string<char_t> __enum_formatter(const std::basic_string<char_t>& format, value_t value, const std::locale& loc) {
19 auto fmt = format;
20 if (fmt.empty()) fmt = {'G'};
21
22 switch (fmt[0]) {
23 case 'b':
24 case 'B':
25 case 'd':
26 case 'D':
27 case 'o':
28 case 'O':
29 case 'x':
30 case 'X': return __numeric_formatter(fmt, static_cast<long long int>(value), loc);
31 case 'g':
32 case 'G': return __enum_to_string(value);
33 default: __format_exception("Invalid format expression"); return {};
34 }
35}
36
37template<typename value_t>
38static std::string __to_string_enum(const value_t& value, const std::string& fmt, const std::locale& loc, std::true_type) {return __enum_formatter(fmt, value, loc);}
39
40template<typename value_t>
41static std::string __to_string_enum(const value_t& value, const std::string& fmt, const std::locale& loc, std::false_type) {
42 __format_exception(typeid(value)); return {};
43}
44
45template<typename value_t>
46static std::wstring __to_string_enum(const value_t& value, const std::wstring& fmt, const std::locale& loc, std::true_type) {return __enum_formatter(fmt, value, loc);}
47
48template<typename value_t>
49static std::wstring __to_string_enum(const value_t& value, const std::wstring& fmt, const std::locale& loc, std::false_type) {
50 __format_exception(typeid(value)); return {};
51}
Contains throw format exception method.
Contains __numeric_formatter method.