diff options
Diffstat (limited to 'src/util')
-rw-r--r-- | src/util/string.hpp | 16 | ||||
-rw-r--r-- | src/util/string_impl.hpp | 29 |
2 files changed, 45 insertions, 0 deletions
diff --git a/src/util/string.hpp b/src/util/string.hpp new file mode 100644 index 0000000..a571c50 --- /dev/null +++ b/src/util/string.hpp @@ -0,0 +1,16 @@ +#pragma once + +#include "util/concepts.hpp" + +#include <concepts> +#include <string> + +template < + typename ContainerType, + typename Char = char, + typename String = std::basic_string<Char>> +requires Container<ContainerType> && HasPushBack<ContainerType> && + std::same_as<typename ContainerType::value_type, String> +auto split_string(const String &str, Char delimiter) noexcept -> ContainerType; + +#include "string_impl.hpp" diff --git a/src/util/string_impl.hpp b/src/util/string_impl.hpp new file mode 100644 index 0000000..8c85947 --- /dev/null +++ b/src/util/string_impl.hpp @@ -0,0 +1,29 @@ +#pragma once + +#include "string.hpp" + +template <typename ContainerType, typename Char, typename String> +requires Container<ContainerType> && HasPushBack<ContainerType> && + std::same_as<typename ContainerType::value_type, String> +auto split_string(const String &str, Char delimiter) noexcept -> ContainerType +{ + auto result_container = ContainerType(); + + auto str_copy = str; + + size_t pos = 0; + String token; + + while ((pos = str_copy.find(delimiter)) != String::npos) + { + token = str_copy.substr(0, pos); + + result_container.push_back(token); + + str_copy.erase(0, pos + 1U); + } + + result_container.push_back(str_copy); + + return result_container; +} |