async_mqtt 9.0.1
Loading...
Searching...
No Matches
json_like_out.hpp
1// Copyright Takatoshi Kondo 2022
2//
3// Distributed under the Boost Software License, Version 1.0.
4// (See accompanying file LICENSE_1_0.txt or copy at
5// http://www.boost.org/LICENSE_1_0.txt)
6
7#if !defined(ASYNC_MQTT_UTIL_JSON_LIKE_OUT_HPP)
8#define ASYNC_MQTT_UTIL_JSON_LIKE_OUT_HPP
9
10#include <ostream>
11#include <iomanip>
12
13#include <async_mqtt/util/buffer.hpp>
14
15namespace async_mqtt {
16
17struct json_like_out_t {
18 template <
19 typename StringViewLike,
20 std::enable_if_t<
21 std::is_convertible_v<std::decay_t<StringViewLike>, std::string_view>,
22 std::nullptr_t
23 > = nullptr
24 >
25 explicit json_like_out_t(StringViewLike const& sv): sv {sv} {}
26
27 friend std::ostream& operator<<(std::ostream& o, json_like_out_t const& v) {
28 for (char c : v.sv) {
29 switch (c) {
30 case '\\':
31 o << "\\\\";
32 break;
33 case '"':
34 o << "\\\"";
35 break;
36 case '/':
37 o << "\\/";
38 break;
39 case '\b':
40 o << "\\b";
41 break;
42 case '\f':
43 o << "\\f";
44 break;
45 case '\n':
46 o << "\\n";
47 break;
48 case '\r':
49 o << "\\r";
50 break;
51 case '\t':
52 o << "\\t";
53 break;
54 default: {
55 unsigned int code = static_cast<unsigned int>(c);
56 if (code < 0x20 || code >= 0x7f) {
57 std::ios::fmtflags flags(o.flags());
58 o << "\\u" << std::hex << std::setw(4) << std::setfill('0') << (code & 0xff);
59 o.flags(flags);
60 }
61 else {
62 o << c;
63 }
64 } break;
65 }
66 }
67 return o;
68 }
69
70private:
71 std::string_view sv;
72};
73
74
75template <
76 typename StringViewLike,
77 std::enable_if_t<
78 std::is_convertible_v<std::decay_t<StringViewLike>, std::string_view>,
79 std::nullptr_t
80 > = nullptr
81>
82inline json_like_out_t json_like_out(StringViewLike const& sv) {
83 return json_like_out_t{sv};
84}
85
86} // namespace async_mqtt
87
88#endif // ASYNC_MQTT_UTIL_JSON_LIKE_OUT_HPP