blob: 8e021bc49bf1d619fe86fb36507e891f230bb180 [file] [log] [blame]
Thomas Psota6bf79382019-09-16 16:42:15 +02001// Formatting library for C++ - std::locale support
2//
3// Copyright (c) 2012 - present, Victor Zverovich
4// All rights reserved.
5//
6// For the license information refer to format.h.
7
8#ifndef FMT_LOCALE_H_
9#define FMT_LOCALE_H_
10
11#include "format.h"
12#include <locale>
13
14FMT_BEGIN_NAMESPACE
15
16namespace internal {
17template <typename Char>
18typename buffer_context<Char>::type::iterator vformat_to(
19 const std::locale &loc, basic_buffer<Char> &buf,
20 basic_string_view<Char> format_str,
21 basic_format_args<typename buffer_context<Char>::type> args) {
22 typedef back_insert_range<basic_buffer<Char> > range;
23 return vformat_to<arg_formatter<range>>(
24 buf, to_string_view(format_str), args, internal::locale_ref(loc));
25}
26
27template <typename Char>
28std::basic_string<Char> vformat(
29 const std::locale &loc, basic_string_view<Char> format_str,
30 basic_format_args<typename buffer_context<Char>::type> args) {
31 basic_memory_buffer<Char> buffer;
32 internal::vformat_to(loc, buffer, format_str, args);
33 return fmt::to_string(buffer);
34}
35}
36
37template <typename S, typename Char = FMT_CHAR(S)>
38inline std::basic_string<Char> vformat(
39 const std::locale &loc, const S &format_str,
40 basic_format_args<typename buffer_context<Char>::type> args) {
41 return internal::vformat(loc, to_string_view(format_str), args);
42}
43
44template <typename S, typename... Args>
45inline std::basic_string<FMT_CHAR(S)> format(
46 const std::locale &loc, const S &format_str, const Args &... args) {
47 return internal::vformat(
48 loc, to_string_view(format_str),
49 *internal::checked_args<S, Args...>(format_str, args...));
50}
51
52template <typename String, typename OutputIt, typename... Args>
53inline typename std::enable_if<internal::is_output_iterator<OutputIt>::value,
54 OutputIt>::type
55 vformat_to(OutputIt out, const std::locale &loc, const String &format_str,
56 typename format_args_t<OutputIt, FMT_CHAR(String)>::type args) {
57 typedef output_range<OutputIt, FMT_CHAR(String)> range;
58 return vformat_to<arg_formatter<range>>(
59 range(out), to_string_view(format_str), args, internal::locale_ref(loc));
60}
61
62template <typename OutputIt, typename S, typename... Args>
63inline typename std::enable_if<
64 internal::is_string<S>::value &&
65 internal::is_output_iterator<OutputIt>::value, OutputIt>::type
66 format_to(OutputIt out, const std::locale &loc, const S &format_str,
67 const Args &... args) {
68 internal::check_format_string<Args...>(format_str);
69 typedef typename format_context_t<OutputIt, FMT_CHAR(S)>::type context;
70 format_arg_store<context, Args...> as{args...};
71 return vformat_to(out, loc, to_string_view(format_str),
72 basic_format_args<context>(as));
73}
74
75FMT_END_NAMESPACE
76
77#endif // FMT_LOCALE_H_