64 static constexpr std::string_view base64_chars =
65 "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
66 "abcdefghijklmnopqrstuvwxyz"
70 static constexpr uint32_t mask_6bit = 0x3F;
71 static constexpr int shift_byte_0 = 16;
72 static constexpr int shift_byte_1 = 8;
73 static constexpr int shift_b64_0 = 18;
74 static constexpr int shift_b64_1 = 12;
75 static constexpr int shift_b64_2 = 6;
78 const size_t len = data.size();
80 out = astarte_fmt::format_to(out,
"\"");
82 while (idx + 2 < len) {
83 const uint32_t chunk =
84 (data[idx] << shift_byte_0) | (data[idx + 1] << shift_byte_1) | data[idx + 2];
85 out = astarte_fmt::format_to(out,
"{}{}{}{}", base64_chars[(chunk >> shift_b64_0) & mask_6bit],
86 base64_chars[(chunk >> shift_b64_1) & mask_6bit],
87 base64_chars[(chunk >> shift_b64_2) & mask_6bit],
88 base64_chars[chunk & mask_6bit]);
93 uint32_t chunk = data[idx] << shift_byte_0;
95 chunk |= data[idx + 1] << shift_byte_1;
98 out = astarte_fmt::format_to(out,
"{}{}", base64_chars[(chunk >> shift_b64_0) & mask_6bit],
99 base64_chars[(chunk >> shift_b64_1) & mask_6bit]);
101 out = astarte_fmt::format_to(out,
"{}=", base64_chars[(chunk >> shift_b64_2) & mask_6bit]);
103 out = astarte_fmt::format_to(out,
"==");
107 out = astarte_fmt::format_to(out,
"\"");
119 out = astarte_fmt::format_to(out,
"\"");
120#if (__cplusplus >= 202002L) && (__has_include(<format>))
121 out = astarte_fmt::format_to(
123 astarte_fmt::format(
"{0:%F}T{0:%T}Z",
124 std::chrono::time_point_cast<std::chrono::milliseconds>(data)));
126 const std::time_t time = std::chrono::system_clock::to_time_t(data);
127 const std::tm utc_tm = *std::gmtime(&time);
128 std::stringstream stream;
129 stream << std::put_time(&utc_tm,
"%FT%T.000Z");
130 out = astarte_fmt::format_to(out,
"{}", stream.str());
132 out = astarte_fmt::format_to(out,
"\"");
145 if constexpr (std::is_same_v<T, bool>) {
146 astarte_fmt::format_to(out,
"{}", (data ?
"true" :
"false"));
147 }
else if constexpr (std::is_same_v<T, std::string>) {
148 astarte_fmt::format_to(out, R
"("{}")", data);
149 } else if constexpr (std::is_same_v<T, std::vector<uint8_t>>) {
151 }
else if constexpr (std::is_same_v<T, std::chrono::system_clock::time_point>) {
154 astarte_fmt::format_to(out,
"{}", data);
168 out = astarte_fmt::format_to(out,
"[");
169 for (
size_t i = 0; i < data.size(); ++i) {
171 if (i != data.size() - 1) {
172 out = astarte_fmt::format_to(out,
", ");
175 out = astarte_fmt::format_to(out,
"]");