summaryrefslogtreecommitdiffstats
path: root/src/include/str_list.h
blob: 518db1cac713a3cb697e4ed7a5e6e1f3fbe47905 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#ifndef CEPH_STRLIST_H
#define CEPH_STRLIST_H

#include <list>
#include <set>
#include <string>
#include <string_view>
#include <vector>

namespace ceph {

/// Split a string using the given delimiters, passing each piece as a
/// (non-null-terminated) std::string_view to the callback.
template <typename Func> // where Func(std::string_view) is a valid call
void for_each_substr(std::string_view s, const char *delims, Func&& f)
{
  auto pos = s.find_first_not_of(delims);
  while (pos != s.npos) {
    s.remove_prefix(pos); // trim delims from the front
    auto end = s.find_first_of(delims);
    f(s.substr(0, end));
    pos = s.find_first_not_of(delims, end);
  }
}

} // namespace ceph

/**
 * Split **str** into a list of strings, using the ";,= \t" delimiters and output the result in **str_list**.
 * 
 * @param [in] str String to split and save as list
 * @param [out] str_list List modified containing str after it has been split
**/
extern void get_str_list(const std::string& str,
			 std::list<std::string>& str_list);

/**
 * Split **str** into a list of strings, using the **delims** delimiters and output the result in **str_list**.
 * 
 * @param [in] str String to split and save as list
 * @param [in] delims characters used to split **str**
 * @param [out] str_list List modified containing str after it has been split
**/
extern void get_str_list(const std::string& str,
                         const char *delims,
			 std::list<std::string>& str_list);

std::list<std::string> get_str_list(const std::string& str,
                                    const char *delims = ";,= \t");

/**
 * Split **str** into a list of strings, using the ";,= \t" delimiters and output the result in **str_vec**.
 * 
 * @param [in] str String to split and save as Vector
 * @param [out] str_vec Vector modified containing str after it has been split
**/
extern void get_str_vec(const std::string& str,
			 std::vector<std::string>& str_vec);

/**
 * Split **str** into a list of strings, using the **delims** delimiters and output the result in **str_vec**.
 * 
 * @param [in] str String to split and save as Vector
 * @param [in] delims characters used to split **str**
 * @param [out] str_vec Vector modified containing str after it has been split
**/
extern void get_str_vec(const std::string& str,
                         const char *delims,
			 std::vector<std::string>& str_vec);

std::vector<std::string> get_str_vec(const std::string& str,
                                     const char *delims = ";,= \t");
/**
 * Split **str** into a list of strings, using the ";,= \t" delimiters and output the result in **str_list**.
 * 
 * @param [in] str String to split and save as Set
 * @param [out] str_list Set modified containing str after it has been split
**/
extern void get_str_set(const std::string& str,
			std::set<std::string>& str_list);

/**
 * Split **str** into a list of strings, using the **delims** delimiters and output the result in **str_list**.
 * 
 * @param [in] str String to split and save as Set
 * @param [in] delims characters used to split **str**
 * @param [out] str_list Set modified containing str after it has been split
**/
template<class Compare = std::less<std::string> >
void get_str_set(const std::string& str,
                 const char *delims,
                 std::set<std::string, Compare>& str_list)
{
  str_list.clear();
  for_each_substr(str, delims, [&str_list] (auto token) {
                  str_list.emplace(token.begin(), token.end());
                  });
}

std::set<std::string> get_str_set(const std::string& str,
                                  const char *delims = ";,= \t");



/**
 * Return a String containing the vector **v** joined with **sep**
 * 
 * If **v** is empty, the function returns an empty string
 * For each element in **v**,
 * it will concatenate this element and **sep** with result
 * 
 * @param [in] v Vector to join as a String
 * @param [in] sep String used to join each element from **v**
 * @return empty string if **v** is empty or concatenated string
**/
inline std::string str_join(const std::vector<std::string>& v, const std::string& sep)
{
  if (v.empty())
    return std::string();
  std::vector<std::string>::const_iterator i = v.begin();
  std::string r = *i;
  for (++i; i != v.end(); ++i) {
    r += sep;
    r += *i;
  }
  return r;
}

#endif