rippled
Loading...
Searching...
No Matches
join.h
1#ifndef JOIN_H_INCLUDED
2#define JOIN_H_INCLUDED
3
4#include <string>
5
6namespace ripple {
7
8template <class Stream, class Iter>
9Stream&
10join(Stream& s, Iter iter, Iter end, std::string const& delimiter)
11{
12 if (iter == end)
13 return s;
14 s << *iter;
15 for (++iter; iter != end; ++iter)
16 s << delimiter << *iter;
17 return s;
18}
19
20template <class Collection>
22{
23public:
24 Collection const& collection;
26
27 explicit CollectionAndDelimiter(Collection const& c, std::string delim)
28 : collection(c), delimiter(std::move(delim))
29 {
30 }
31
32 template <class Stream>
33 friend Stream&
34 operator<<(Stream& s, CollectionAndDelimiter const& cd)
35 {
36 return join(
37 s,
40 cd.delimiter);
41 }
42};
43
44template <class Collection, std::size_t N>
45class CollectionAndDelimiter<Collection[N]>
46{
47public:
48 Collection const* collection;
50
51 explicit CollectionAndDelimiter(Collection const c[N], std::string delim)
52 : collection(c), delimiter(std::move(delim))
53 {
54 }
55
56 template <class Stream>
57 friend Stream&
58 operator<<(Stream& s, CollectionAndDelimiter const& cd)
59 {
60 return join(s, cd.collection, cd.collection + N, cd.delimiter);
61 }
62};
63
64// Specialization for const char* strings
65template <std::size_t N>
67{
68public:
69 char const* collection;
71
72 explicit CollectionAndDelimiter(char const c[N], std::string delim)
73 : collection(c), delimiter(std::move(delim))
74 {
75 }
76
77 template <class Stream>
78 friend Stream&
79 operator<<(Stream& s, CollectionAndDelimiter const& cd)
80 {
81 auto end = cd.collection + N;
82 if (N > 0 && *(end - 1) == '\0')
83 --end;
84 return join(s, cd.collection, end, cd.delimiter);
85 }
86};
87
88} // namespace ripple
89
90#endif
T begin(T... args)
CollectionAndDelimiter(Collection const c[N], std::string delim)
Definition join.h:51
CollectionAndDelimiter(char const c[N], std::string delim)
Definition join.h:72
Collection const & collection
Definition join.h:24
friend Stream & operator<<(Stream &s, CollectionAndDelimiter const &cd)
Definition join.h:34
CollectionAndDelimiter(Collection const &c, std::string delim)
Definition join.h:27
std::string const delimiter
Definition join.h:25
T end(T... args)
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:6
Stream & join(Stream &s, Iter iter, Iter end, std::string const &delimiter)
Definition join.h:10
STL namespace.