26inline ContainerT
split(
const typename ContainerT::value_type& s, std::basic_regex<typename ContainerT::value_type::value_type> regex)
28 using string_type =
typename ContainerT::value_type;
29 using const_iterator_type =
typename string_type::const_iterator;
34 std::vector<string_type>
ret;
35 std::copy(std::regex_token_iterator<const_iterator_type>{s.begin(), s.end(), regex, -1},
36 std::regex_token_iterator<const_iterator_type>{},
37 std::back_inserter(
ret));
50inline ContainerT
split(
const typename ContainerT::value_type& s,
typename ContainerT::value_type separator)
52 using string_type =
typename ContainerT::value_type;
53 using char_type =
typename string_type::value_type;
56 string_type sep_esc(separator.size()*2, char_type{
'\\'});
57 for (
size_t i = 0; i < separator.size(); ++i) {
58 sep_esc[i*2 + 1] = separator[i];
61 return split<ContainerT>(s, std::basic_regex<char_type>{string_type{
"("} + sep_esc + string_type{
")|$"}});
73inline ContainerT
split(
const typename ContainerT::value_type& s,
typename ContainerT::value_type::value_type separator)
75 using string_type =
typename ContainerT::value_type;
76 using char_type =
typename string_type::value_type;
78 return split<ContainerT>(s, std::basic_regex<char_type>{string_type{
"\\"} + string_type{separator} + string_type{
"|$"}});
92inline typename ContainerT::value_type
join(
typename ContainerT::const_iterator begin,
93 typename ContainerT::const_iterator end,
94 const typename ContainerT::value_type& separator =
", ")
96 using string_type =
typename ContainerT::value_type;
97 using char_type =
typename string_type::value_type;
98 using traits_type =
typename string_type::traits_type;
99 using allocator_type =
typename string_type::allocator_type;
105 std::basic_stringstream<char_type, traits_type, allocator_type> s;
106 std::copy(begin, end - 1, std::ostream_iterator<string_type, char_type, traits_type>(s, separator.c_str()));
122inline typename ContainerT::value_type
join(
typename ContainerT::const_iterator begin,
123 typename ContainerT::const_iterator end,
124 const typename ContainerT::value_type::value_type& separator)
126 return join<ContainerT>(begin, end,
typename ContainerT::value_type{separator});