Skip to content

Commit 4e9592d

Browse files
committed
json: string_view without char* as intermediate step
Enables reuse of already available string length info
1 parent 643639a commit 4e9592d

File tree

4 files changed

+11
-17
lines changed

4 files changed

+11
-17
lines changed

include/cgimap/json_writer.hpp

+8-3
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@ class json_writer : public output_writer {
3434
~json_writer() noexcept override;
3535

3636
void start_object();
37-
void object_key(const char* s);
3837
void object_key(std::string_view sv);
3938
void end_object();
4039

@@ -49,8 +48,14 @@ class json_writer : public output_writer {
4948
yajl_gen_integer(gen, i);
5049
}
5150

52-
void entry(const char* s);
53-
void entry(std::string_view sv);
51+
template <typename T,
52+
std::enable_if_t<std::is_convertible_v<T&&, std::string_view>,
53+
bool> = true>
54+
void entry(T&& s)
55+
{
56+
auto sv = std::string_view(s);
57+
yajl_gen_string(gen, (const unsigned char *)sv.data(), sv.size());
58+
}
5459

5560
template <typename TKey, typename TValue>
5661
void property(TKey&& key, TValue&& val) {

include/cgimap/output_formatter.hpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@ enum class action_type {
4040

4141
namespace {
4242

43-
const char* element_type_name(element_type elt) {
43+
template <typename T = const char *>
44+
T element_type_name(element_type elt) noexcept {
4445

4546
switch (elt) {
4647
case element_type::node:

src/json_formatter.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -157,7 +157,7 @@ void json_formatter::write_relation(const element_info &elem,
157157
writer->start_array();
158158
for (const auto & member : members) {
159159
writer->start_object();
160-
writer->property("type", element_type_name(member.type));
160+
writer->property("type", element_type_name<std::string_view>(member.type));
161161
writer->property("ref", member.ref);
162162
writer->property("role", member.role);
163163
writer->end_object();

src/json_writer.cpp

-12
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,6 @@ void json_writer::start_object() {
6363
yajl_gen_map_open(gen);
6464
}
6565

66-
void json_writer::object_key(const char* s) {
67-
entry(s);
68-
}
69-
7066
void json_writer::object_key(std::string_view sv) {
7167
entry(sv);
7268
}
@@ -102,14 +98,6 @@ void json_writer::entry(double d) {
10298
yajl_gen_number(gen, str, len);
10399
}
104100

105-
void json_writer::entry(const char* s) {
106-
entry(std::string_view(s));
107-
}
108-
109-
void json_writer::entry(std::string_view sv) {
110-
yajl_gen_string(gen, (const unsigned char *)sv.data(), sv.size());
111-
}
112-
113101
void json_writer::start_array() {
114102
yajl_gen_array_open(gen);
115103
}

0 commit comments

Comments
 (0)