add an helper class to process strings

This commit is contained in:
Sven Czarnian
2021-08-10 08:39:34 +02:00
parent 557c781fa6
commit 4de1e2fc43
2 changed files with 91 additions and 0 deletions

View File

@@ -0,0 +1,86 @@
/*
* @brief Defines and implements functions to handle strings
* @file aman/helper/String.h
* @author Sven Czarnian <devel@svcz.de>
* @copyright Copyright 2021 Sven Czarnian
* @license This project is published under the GNU General Public License v3 (GPLv3)
*/
#pragma once
#include <string>
#include <vector>
namespace aman {
/**
* @brief Implements and defines convinience functions for the string handling
* @ingroup helper
*/
class String {
private:
template <typename Separator>
static auto splitAux(const std::string& value, Separator&& separator) -> std::vector<std::string> {
std::vector<std::string> result;
std::string::size_type p = 0;
std::string::size_type q;
while ((q = separator(value, p)) != std::string::npos) {
result.emplace_back(value, p, q - p);
p = q + 1;
}
result.emplace_back(value, p);
return result;
}
public:
String() = delete;
String(const String&) = delete;
String(String&&) = delete;
String& operator=(const String&) = delete;
String& operator=(String&&) = delete;
/**
* @brief Replaces all markers by replace in message
* @param[in,out] message The message which needs to be modified
* @param[in] marker The wildcard which needs to be found in message and which needs to be replaced
* @param[in] replace The replacement of marker in message
* @return
*/
static __inline void stringReplace(std::string& message, const std::string& marker, const std::string& replace) {
std::size_t pos = message.find(marker, 0);
while (std::string::npos != pos) {
auto it = message.cbegin() + pos;
message.replace(it, it + marker.length(), replace);
pos = message.find(marker, pos + marker.length());
}
}
/**
* @brief Splits value into chunks and the separator is defined in separators
* @param[in] value The string which needs to be splitted up
* @param[in] separators The separators which split up the value
* @return The list of splitted chunks
*/
static auto splitString(const std::string& value, const std::string& separators) -> std::vector<std::string> {
return String::splitAux(value, [&](const std::string& v, std::string::size_type p) noexcept {
return v.find_first_of(separators, p);
});
}
/**
* @brief Removes leading and trailing whitespaces
* @param[in] value The trimable string
* @param[in] spaces The characters that need to be removed
* @return The trimmed version of value
*/
static auto trim(const std::string& value, const std::string& spaces = " \t") -> std::string {
const auto begin = value.find_first_not_of(spaces, 0);
if (std::string::npos == begin)
return "";
const auto end = value.find_last_not_of(spaces);
const auto range = end - begin + 1;
return value.substr(begin, range);
}
};
}

View File

@@ -19,12 +19,16 @@ SET(SOURCE_FILES_RES
${CMAKE_SOURCE_DIR}/res/resource.h ${CMAKE_SOURCE_DIR}/res/resource.h
${CMAKE_SOURCE_DIR}/res/targetver.h ${CMAKE_SOURCE_DIR}/res/targetver.h
) )
SET(INCLUDE_HELPER_FILES
${CMAKE_SOURCE_DIR}/include/aman/helper/String.h
)
# define the plug in # define the plug in
ADD_LIBRARY( ADD_LIBRARY(
ArrivalMANager SHARED ArrivalMANager SHARED
${SOURCE_FILES_RES} ${SOURCE_FILES_RES}
${SOURCE_FILES} ${SOURCE_FILES}
${INCLUDE_HELPER_FILES}
) )
# define the dependencies # define the dependencies
@@ -46,3 +50,4 @@ ENDIF()
SOURCE_GROUP("Source Files" FILES ${SOURCE_FILES}) SOURCE_GROUP("Source Files" FILES ${SOURCE_FILES})
SOURCE_GROUP("Source Files\\res" FILES ${SOURCE_FILES_RES}) SOURCE_GROUP("Source Files\\res" FILES ${SOURCE_FILES_RES})
SOURCE_GROUP("Header Files\\helper" FILES ${INCLUDE_HELPER_FILES})