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)
27 : collection(c), delimiter(std::move(delim))
28 {
29 }
30
31 template <class Stream>
32 friend Stream&
33 operator<<(Stream& s, CollectionAndDelimiter const& cd)
34 {
35 return join(s, std::begin(cd.collection), std::end(cd.collection), cd.delimiter);
36 }
37};
38
39template <class Collection, std::size_t N>
40class CollectionAndDelimiter<Collection[N]>
41{
42public:
43 Collection const* collection;
45
46 explicit CollectionAndDelimiter(Collection const c[N], std::string delim)
47 : collection(c), delimiter(std::move(delim))
48 {
49 }
50
51 template <class Stream>
52 friend Stream&
53 operator<<(Stream& s, CollectionAndDelimiter const& cd)
54 {
55 return join(s, cd.collection, cd.collection + N, cd.delimiter);
56 }
57};
58
59// Specialization for const char* strings
60template <std::size_t N>
62{
63public:
64 char const* collection;
66
67 explicit CollectionAndDelimiter(char const c[N], std::string delim)
68 : collection(c), delimiter(std::move(delim))
69 {
70 }
71
72 template <class Stream>
73 friend Stream&
74 operator<<(Stream& s, CollectionAndDelimiter const& cd)
75 {
76 auto end = cd.collection + N;
77 if (N > 0 && *(end - 1) == '\0')
78 --end;
79 return join(s, cd.collection, end, cd.delimiter);
80 }
81};
82
83} // namespace xrpl
T begin(T... args)
CollectionAndDelimiter(Collection const c[N], std::string delim)
Definition join.h:46
CollectionAndDelimiter(char const c[N], std::string delim)
Definition join.h:67
friend Stream & operator<<(Stream &s, CollectionAndDelimiter const &cd)
Definition join.h:33
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