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