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
|
//
// Copyright © 2020 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//
#pragma once
#include <iostream>
#include <sstream>
namespace armnn
{
namespace stringUtils
{
/// Function to take a string and a list of delimiters and split the string into tokens based on those delimiters
/// This assumes that tokens are also to be split by newlines
/// Enabling token compression causes this to ignore multiple concurrent delimiters
inline std::vector<std::string> StringTokenizer(const std::string& str,
const char* delimiters,
bool tokenCompression = true)
{
std::stringstream stringStream(str);
std::string line;
std::vector<std::string> wordVector;
while (std::getline(stringStream, line))
{
std::size_t prev = 0;
std::size_t pos;
while ((pos = line.find_first_of(delimiters, prev)) != std::string::npos)
{
if (pos > prev)
{
// If token compression is enabled ignore delimiters that are next to each other
if (tokenCompression && (pos - prev == 1))
{
prev = pos + 1;
continue;
}
wordVector.push_back(line.substr(prev, pos - prev));
}
prev = pos + 1;
}
if (prev < line.length())
{
wordVector.push_back(line.substr(prev, std::string::npos));
}
}
return wordVector;
}
// Set of 3 utility functions for trimming std::strings
// Default char set for common whitespace characters
///
/// Trim from the start of a string
///
inline std::string& StringStartTrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
str.erase(0, str.find_first_not_of(chars));
return str;
}
///
/// Trim for the end of a string
///
inline std::string& StringEndTrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
str.erase(str.find_last_not_of(chars) + 1);
return str;
}
///
/// Trim from both the start and the end of a string
///
inline std::string& StringTrim(std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
return StringStartTrim(StringEndTrim(str, chars), chars);
}
///
/// Trim from both the start and the end of a string, returns a trimmed copy of the string
///
inline std::string StringTrimCopy(const std::string& str, const std::string& chars = "\t\n\v\f\r ")
{
std::string strCopy = str;
return StringStartTrim(StringEndTrim(strCopy, chars), chars);
}
/// Takes a vector of strings and concatenates them together into one long std::string with an optional
/// seperator between each.
inline std::string StringConcat(const std::vector<std::string>& strings, std::string seperator = "")
{
std::stringstream ss;
for (auto string : strings)
{
ss << string << seperator;
}
return ss.str();
}
///
/// Iterates over a given str and replaces all instance of substring oldStr with newStr
///
inline void StringReplaceAll(std::string& str,
const std::string& oldStr,
const std::string& newStr)
{
std::string::size_type pos = 0u;
while ((pos = str.find(oldStr, pos)) != std::string::npos)
{
str.replace(pos, oldStr.length(), newStr);
pos += newStr.length();
}
}
} // namespace stringUtils
} // namespace armnn
|