Antares Xpansion
Investment simulations for Antares studies
Loading...
Searching...
No Matches
StringManip.h
1#pragma once
2
3#include <algorithm>
4#include <cstdlib>
5#include <fstream>
6#include <iomanip>
7#include <iostream>
8#include <ranges>
9#include <sstream>
10#include <string>
11#include <vector>
12
13namespace StringManip
14{
15
16template<std::ctype_base::mask mask>
17class IsNot
18{
19 std::locale myLocale; // To ensure lifetime of facet...
20 const std::ctype<char>* myCType;
21
22public:
23 explicit IsNot(const std::locale& l = std::locale()):
24 myLocale(l),
25 myCType(&std::use_facet<std::ctype<char>>(l))
26 {
27 }
28
29 bool operator()(char ch) const
30 {
31 return !myCType->is(mask, ch);
32 }
33};
34
36
43inline std::string& trim_in_place(std::string& original)
44{
45 // Start with the end to avoid memory displacement modifying begin
46 original.erase(
47 std::ranges::find_if(original | std::ranges::views::reverse, IsNotSpace()).base(),
48 original.end());
49 original.erase(original.begin(), std::ranges::find_if(original, IsNotSpace()));
50 return original;
51}
52
53inline std::string trim(std::string_view original)
54{
55 auto right = std::find_if(original.rbegin(), original.rend(), IsNotSpace()).base();
56 auto left = std::find_if(original.begin(), right, IsNotSpace());
57 return std::string(left, right);
58}
59
60inline std::vector<std::string> split(std::string_view original, char delimiter = ' ')
61{
62 // TODO C++20 https://en.cppreference.com/w/cpp/ranges/split_view
63 std::vector<std::string> strings;
64 auto left = original.begin();
65 for (auto it = left; it != original.end(); ++it)
66 {
67 if (*it == delimiter)
68 {
69 strings.emplace_back(&*left, it - left);
70 left = it + 1;
71 }
72 }
73 if (left != original.end())
74 {
75 strings.emplace_back(&*left, original.end() - left);
76 }
77 return strings;
78}
79
80inline std::vector<std::string> split(std::string_view original, std::string_view delimiter)
81{
82 size_t pos = 0;
83 auto copy_original = trim(original);
84 std::vector<std::string> result;
85 while ((pos = copy_original.find(delimiter)) != std::string::npos)
86 {
87 result.push_back(copy_original.substr(0, pos));
88 copy_original.erase(0, pos + delimiter.length());
89 }
90 if (!copy_original.empty())
91 {
92 result.push_back(copy_original);
93 }
94 return result;
95}
96
98{
99public:
100 static std::string ToLowercase(std::string_view s)
101 {
102 std::string result;
103 std::transform(s.cbegin(),
104 s.cend(),
105 std::back_inserter(result),
106 [](const char& c) { return std::tolower(c); });
107 return result;
108 }
109
110 static bool contains(const std::string& v1, const std::string& v2)
111 {
112 return v1.find(v2) != std::string::npos;
113 }
114};
115} // namespace StringManip
Definition StringManip.h:18
Definition StringManip.h:98