Thrill  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
split_view.hpp
Go to the documentation of this file.
1 /*******************************************************************************
2  * tlx/string/split_view.hpp
3  *
4  * Split a std::string and call a functor with tlx::string_view for each part.
5  *
6  * Part of tlx - http://panthema.net/tlx
7  *
8  * Copyright (C) 2016-2019 Timo Bingmann <[email protected]>
9  *
10  * All rights reserved. Published under the Boost Software License, Version 1.0
11  ******************************************************************************/
12 
13 #ifndef TLX_STRING_SPLIT_VIEW_HEADER
14 #define TLX_STRING_SPLIT_VIEW_HEADER
15 
17 
18 namespace tlx {
19 
20 //! \addtogroup tlx_string
21 //! \{
22 //! \name Split and Join
23 //! \{
24 
25 /*!
26  * Split the given string at each separator character into distinct substrings,
27  * and call the given callback with a StringView for each substring. Multiple
28  * consecutive separators are considered individually and will result in empty
29  * split substrings.
30  *
31  * \param str string to split
32  * \param sep separator character
33  * \param callback callback taking StringView of substring
34  * \param limit maximum number of parts returned
35  */
36 template <typename Functor>
37 static inline
39  char sep, const std::string& str, Functor&& callback,
40  std::string::size_type limit = std::string::npos) {
41 
42  if (limit == 0) {
43  callback(StringView(str.begin(), str.end()));
44  return;
45  }
46 
47  std::string::size_type count = 0;
48  auto it = str.begin(), last = it;
49 
50  for ( ; it != str.end(); ++it)
51  {
52  if (*it == sep)
53  {
54  if (count == limit)
55  {
56  callback(StringView(last, str.end()));
57  return;
58  }
59  callback(StringView(last, it));
60  ++count;
61  last = it + 1;
62  }
63  }
64  callback(StringView(last, it));
65 }
66 
67 //! \}
68 //! \}
69 
70 } // namespace tlx
71 
72 #endif // !TLX_STRING_SPLIT_VIEW_HEADER
73 
74 /******************************************************************************/
std::basic_string< char, std::char_traits< char >, Allocator< char > > string
string with Manager tracking
Definition: allocator.hpp:220
StringView is a reference to a part of a string, consisting of only a char pointer and a length...
Definition: string_view.hpp:32
static void split_view(char sep, const std::string &str, Functor &&callback, std::string::size_type limit=std::string::npos)
Split the given string at each separator character into distinct substrings, and call the given callb...
Definition: split_view.hpp:38