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
6466template <typename T, std::enable_if_t <std::is_integral_v<T>, int > = 0 >
6567std::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+ }
7084std::string ArrayOfBulkStrings (const std::vector<std::string> &elements);
7185
7286std::string Bool (RESP ver, bool b);
87+
7388inline std::string BigNumber (RESP ver, const std::string &n) {
7489 return ver == RESP::v3 ? " (" + n + CRLF : BulkString (n);
7590}
91+
7692inline 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
91108inline std::string NilArray (RESP ver) { return ver == RESP::v3 ? " _" CRLF : " *-1" CRLF; }
109+
92110std::string MultiBulkString (RESP ver, const std::vector<std::string> &values);
93111std::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}
100118std::string SetOfBulkStrings (RESP ver, const std::vector<std::string> &elems);
119+
101120template <typename T, std::enable_if_t <std::is_integral_v<T>, int > = 0 >
102121std::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+ }
106133std::string MapOfBulkStrings (RESP ver, const std::vector<std::string> &elems);
134+
107135template <typename T, std::enable_if_t <std::is_integral_v<T>, int > = 0 >
108136std::string HeaderOfAttribute (T len) {
109137 return " |" + std::to_string (len) + CRLF;
110138}
139+
111140template <typename T, std::enable_if_t <std::is_integral_v<T>, int > = 0 >
112141std::string HeaderOfPush (RESP ver, T len) {
113142 return ver == RESP::v3 ? " >" + std::to_string (len) + CRLF : MultiLen (len);
0 commit comments