35 inline bool contains(std::string
const &s, std::string
const &infix)
37 return s.find(infix) != std::string::npos;
40 inline bool contains(std::string
const &s,
char const infix)
42 return s.find(infix) != std::string::npos;
45 inline bool starts_with(std::string
const &s, std::string
const &prefix)
47 return (s.size() >= prefix.size()) &&
48 (0 == s.compare(0, prefix.size(), prefix));
51 inline bool starts_with(std::string
const &s,
char const prefix)
53 return !s.empty() && s[0] == prefix;
56 inline bool ends_with(std::string
const &s, std::string
const &
suffix)
58 return (s.size() >=
suffix.size()) &&
62 inline bool ends_with(std::string
const &s,
char const suffix)
64 return !s.empty() && s.back() ==
suffix;
67 inline std::string replace_first(
69 std::string
const &target,
70 std::string
const &replacement)
72 std::string::size_type pos = s.find(target);
73 if (pos == std::string::npos)
75 s.replace(pos, target.size(), replacement);
81 inline std::string replace_last(
83 std::string
const &target,
84 std::string
const &replacement)
86 std::string::size_type pos = s.rfind(target);
87 if (pos == std::string::npos)
89 s.replace(pos, target.size(), replacement);
95 inline std::string replace_all_nonrecursively(
97 std::string
const &target,
98 std::string
const &replacement)
100 std::string::size_type pos = 0;
101 auto tsize = target.size();
102 auto rsize = replacement.size();
105 pos = s.find(target, pos);
106 if (pos == std::string::npos)
108 s.replace(pos, tsize, replacement);
115 inline std::string replace_all(
117 std::string
const &target,
118 std::string
const &replacement)
120 std::string::size_type pos = 0;
121 auto tsize = target.size();
123 auto rsize = replacement.size();
126 pos = s.find(target, pos);
127 if (pos == std::string::npos)
129 s.replace(pos, tsize, replacement);
134 pos += rsize - std::min(tsize - 1, rsize);
140 inline std::vector<std::string> split(
141 std::string
const &s,
142 std::string
const &delimiter,
143 bool includeDelimiter =
false)
145 std::vector<std::string> ret;
146 std::string::size_type pos, lastPos = 0, length = s.size();
147 while (lastPos < length + 1)
149 pos = s.find_first_of(delimiter, lastPos);
150 if (pos == std::string::npos)
153 includeDelimiter =
false;
157 ret.push_back(s.substr(
159 pos + (includeDelimiter ? delimiter.size() : 0) - lastPos));
167 inline std::string strip(std::string s, std::vector<char> to_remove)
169 for (
auto const &c : to_remove)
170 s.erase(std::remove(s.begin(), s.end(), c), s.end());
176 template <
typename F>
177 std::string trim(std::string
const &s, F &&to_remove)
179 auto begin = s.begin();
180 for (; begin != s.end(); ++begin)
182 if (!to_remove(*begin))
187 auto end = s.rbegin();
188 for (; end != s.rend(); ++end)
190 if (!to_remove(*end))
195 return s.substr(begin - s.begin(), end.base() - begin);
199 join(std::vector<std::string>
const &vs, std::string
const &delimiter)
208 std::ostringstream ss;
212 std::ostream_iterator<std::string>(ss, delimiter.c_str()));
213 ss << *(vs.end() - 1);
224 inline std::string removeSlashes(std::string s)
226 if (auxiliary::starts_with(s,
'/'))
228 s = auxiliary::replace_first(s,
"/",
"");
230 if (auxiliary::ends_with(s,
'/'))
232 s = auxiliary::replace_last(s,
"/",
"");
237 template <
typename S>
240 std::transform(s.begin(), s.end(), s.begin(), [](
unsigned char c) {
241 return std::tolower(c);
243 return std::forward<S>(s);
Public definitions of openPMD-api.
Definition: Date.cpp:29
std::string suffix(Format f)
Determine the default filename suffix for a given storage format.
Definition: Format.cpp:55