// // Copyright © 2020 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include 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 tokenCompression merges adjacent delimiters together, preventing empty tokens inline std::vector StringTokenizer(const std::string& str, const char* delimiters, bool tokenCompression = true) { std::stringstream stringStream(str); std::string line; std::vector tokenVector; 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) { // Ignore adjacent tokens if (pos > prev) { tokenVector.push_back(line.substr(prev, pos - prev)); } // Unless token compression is disabled else if (!tokenCompression) { tokenVector.push_back(line.substr(prev, pos - prev)); } prev = pos + 1; } if (prev < line.length()) { tokenVector.push_back(line.substr(prev, std::string::npos)); } } return tokenVector; } // 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& 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