Skip to content

Commit 4b7256b

Browse files
Merge branch 'unstable' into unstable
2 parents 9dc61cf + 27f2eb1 commit 4b7256b

File tree

2 files changed

+38
-21
lines changed

2 files changed

+38
-21
lines changed

src/server/redis_reply.cc

Lines changed: 6 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,15 +60,12 @@ std::string StatusToRedisErrorMsg(const Status &s) {
6060
return prefix + " " + s.Msg();
6161
}
6262

63-
std::string BulkString(const std::string &data) { return "$" + std::to_string(data.length()) + CRLF + data + CRLF; }
64-
65-
std::string Array(const std::vector<std::string> &list) {
66-
size_t n = std::accumulate(list.begin(), list.end(), 0, [](size_t n, const std::string &s) { return n + s.size(); });
67-
std::string result = MultiLen(list.size());
68-
std::string::size_type final_size = result.size() + n;
69-
result.reserve(final_size);
70-
for (const auto &i : list) result += i;
71-
return result;
63+
std::string BulkString(std::string_view data) {
64+
std::string res = "$" + std::to_string(data.length()) + CRLF;
65+
res.reserve(res.size() + data.size() + 2);
66+
res += data;
67+
res += CRLF;
68+
return res;
7269
}
7370

7471
std::string ArrayOfBulkStrings(const std::vector<std::string> &elems) {
@@ -131,13 +128,4 @@ std::string MapOfBulkStrings(RESP ver, const std::vector<std::string> &elems) {
131128
return result;
132129
}
133130

134-
std::string Map(RESP ver, const std::map<std::string, std::string> &map) {
135-
std::string result = HeaderOfMap(ver, map.size());
136-
for (const auto &pair : map) {
137-
result += pair.first;
138-
result += pair.second;
139-
}
140-
return result;
141-
}
142-
143131
} // namespace redis

src/server/redis_reply.h

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,9 @@
2222

2323
#include <event2/buffer.h>
2424

25+
#include <initializer_list>
2526
#include <map>
27+
#include <numeric>
2628
#include <string>
2729
#include <string_view>
2830
#include <vector>
@@ -59,23 +61,38 @@ inline std::string NilString(RESP ver) {
5961
return "$-1" CRLF;
6062
}
6163

62-
std::string BulkString(const std::string &data);
64+
std::string BulkString(std::string_view data);
6365

6466
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
6567
std::string MultiLen(T len) {
6668
return "*" + std::to_string(len) + CRLF;
6769
}
6870

69-
std::string Array(const std::vector<std::string> &list);
71+
template <typename Con>
72+
std::string Array(const Con &list) {
73+
size_t total_size =
74+
std::accumulate(list.begin(), list.end(), 0, [](size_t n, const auto &s) { return n + s.size(); });
75+
std::string result = MultiLen(list.size());
76+
result.reserve(result.size() + total_size);
77+
for (const auto &i : list) result += i;
78+
return result;
79+
}
80+
template <typename T>
81+
std::string Array(std::initializer_list<T> list) {
82+
return Array<std::initializer_list<T>>(list);
83+
}
7084
std::string ArrayOfBulkStrings(const std::vector<std::string> &elements);
7185

7286
std::string Bool(RESP ver, bool b);
87+
7388
inline std::string BigNumber(RESP ver, const std::string &n) {
7489
return ver == RESP::v3 ? "(" + n + CRLF : BulkString(n);
7590
}
91+
7692
inline std::string Double(RESP ver, double d) {
7793
return ver == RESP::v3 ? "," + util::Float2String(d) + CRLF : BulkString(util::Float2String(d));
7894
}
95+
7996
// ext is the extension of file to send, 'txt' for text file, 'md ' for markdown file
8097
// at most 3 chars, padded with space
8198
// if RESP is V2, treat verbatim string as blob string
@@ -89,6 +106,7 @@ inline std::string VerbatimString(RESP ver, std::string ext, const std::string &
89106
}
90107

91108
inline std::string NilArray(RESP ver) { return ver == RESP::v3 ? "_" CRLF : "*-1" CRLF; }
109+
92110
std::string MultiBulkString(RESP ver, const std::vector<std::string> &values);
93111
std::string MultiBulkString(RESP ver, const std::vector<std::string> &values,
94112
const std::vector<rocksdb::Status> &statuses);
@@ -98,16 +116,27 @@ std::string HeaderOfSet(RESP ver, T len) {
98116
return ver == RESP::v3 ? "~" + std::to_string(len) + CRLF : MultiLen(len);
99117
}
100118
std::string SetOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
119+
101120
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
102121
std::string HeaderOfMap(RESP ver, T len) {
103122
return ver == RESP::v3 ? "%" + std::to_string(len) + CRLF : MultiLen(len * 2);
104123
}
105-
std::string Map(RESP ver, const std::map<std::string, std::string> &map);
124+
template <typename Con>
125+
std::string Map(RESP ver, const Con &map) {
126+
std::string result = HeaderOfMap(ver, map.size());
127+
for (const auto &pair : map) {
128+
result += pair.first;
129+
result += pair.second;
130+
}
131+
return result;
132+
}
106133
std::string MapOfBulkStrings(RESP ver, const std::vector<std::string> &elems);
134+
107135
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
108136
std::string HeaderOfAttribute(T len) {
109137
return "|" + std::to_string(len) + CRLF;
110138
}
139+
111140
template <typename T, std::enable_if_t<std::is_integral_v<T>, int> = 0>
112141
std::string HeaderOfPush(RESP ver, T len) {
113142
return ver == RESP::v3 ? ">" + std::to_string(len) + CRLF : MultiLen(len);

0 commit comments

Comments
 (0)