1 /*******************************************************************************
2  * tlx/string/join_generic.hpp
3  *
4  * Part of tlx - http://panthema.net/tlx
5  *
6  * Copyright (C) 2007-2017 Timo Bingmann <tb@panthema.net>
7  *
8  * All rights reserved. Published under the Boost Software License, Version 1.0
9  ******************************************************************************/
10 
11 #ifndef TLX_STRING_JOIN_GENERIC_HEADER
12 #define TLX_STRING_JOIN_GENERIC_HEADER
13 
14 #include <sstream>
15 #include <string>
16 
17 namespace tlx {
18 
19 //! \addtogroup tlx_string
20 //! \{
21 //! \name Split and Join
22 //! \{
23 
24 /*!
25  * Join a sequence of strings by some glue string between each pair from the
26  * sequence. The sequence in given as a range between two iterators.
27  *
28  * \param glue     string to glue
29  * \param first    the beginning iterator of the range to join
30  * \param last     the ending iterator of the range to join
31  * \return string  constructed from the range with the glue between two strings.
32  */
33 template <typename Glue, typename Iterator>
34 static inline
join(Glue glue,Iterator first,Iterator last)35 std::string join(Glue glue, Iterator first, Iterator last) {
36     std::ostringstream out;
37     if (first == last) return out.str();
38 
39     out << *first;
40     ++first;
41 
42     while (first != last)
43     {
44         out << glue;
45         out << *first;
46         ++first;
47     }
48 
49     return out.str();
50 }
51 
52 /*!
53  * Join a Container of strings by some glue character between each pair from the
54  * sequence.
55  *
56  * \param glue     character for glue
57  * \param parts    the vector of strings to join
58  * \return string  constructed from the vector with the glue between two strings
59  */
60 template <typename Container>
61 static inline
join(char glue,const Container & parts)62 std::string join(char glue, const Container& parts) {
63     return join(glue, std::begin(parts), std::end(parts));
64 }
65 
66 /*!
67  * Join a Container of strings by some glue string between each pair from the
68  * sequence.
69  *
70  * \param glue     string to glue
71  * \param parts    the vector of strings to join
72  * \return string  constructed from the vector with the glue between two strings
73  */
74 template <typename Container>
75 static inline
join(const char * glue,const Container & parts)76 std::string join(const char* glue, const Container& parts) {
77     return join(glue, std::begin(parts), std::end(parts));
78 }
79 
80 /*!
81  * Join a Container of strings by some glue string between each pair from the
82  * sequence.
83  *
84  * \param glue     string to glue
85  * \param parts    the vector of strings to join
86  * \return string  constructed from the vector with the glue between two strings
87  */
88 template <typename Container>
89 static inline
join(const std::string & glue,const Container & parts)90 std::string join(const std::string& glue, const Container& parts) {
91     return join(glue, std::begin(parts), std::end(parts));
92 }
93 
94 //! \}
95 //! \}
96 
97 } // namespace tlx
98 
99 #endif // !TLX_STRING_JOIN_GENERIC_HEADER
100 
101 /******************************************************************************/
102