Graph Cpp
Helper Graph class for C++ with CMake support
Loading...
Searching...
No Matches
utils.hpp
Go to the documentation of this file.
1#pragma once
2
3// std libs:
4#include <algorithm>
5#include <iostream>
6#include <numeric>
7#include <stdexcept>
8#include <string>
9#include <unordered_map>
10#include <unordered_set>
11#include <utility>
12#include <variant>
13#include <vector>
14
15using std::size_t;
16
17/**
18 * @brief Выводит все элементы пары в поток.
19 *
20 * @tparam Type1: тип, возможный к выводу в консоль.
21 * @tparam Type2: тип, возможный к выводу в консоль.
22 * @param os: ссылка на поток, в который надо вывести (мод.).
23 * @param pair: пара элементов произвольного типа.
24 *
25 * @return `std::ostream`: ссылка на поток, в который вывели.
26 */
27template <typename Type1, typename Type2>
28inline std::ostream& operator<<(std::ostream& os,
29 const std::pair<Type1, Type2>& pair) {
30 return os << "{" << pair.first << "; " << pair.second << "}";
31}
32
33/**
34 * @brief Выводит все элементы `std::tuple` в поток.
35 *
36 * @tparam I: текущий индекс, обрабатываемый в кортеже.
37 * @tparam Ts: типы элементов в кортеже.
38 * @param os: выходной поток, в который будут записаны элементы кортежа.
39 * @param t: кортеж, который нужно распечатать.
40 *
41 * @return `std::ostream`: модифицированный выходной поток.
42 */
43template <std::size_t I = 0, typename... Ts>
44static std::ostream& PrintTuple(std::ostream& os, const std::tuple<Ts...>& t) {
45 if constexpr (I < sizeof...(Ts)) {
46 if (I != 0) os << "; ";
47
48 os << std::get<I>(t);
49 return PrintTuple<I + 1, Ts...>(os, t);
50 } else
51 return os;
52}
53
54/**
55 * @brief Выводит все элементы `std::tuple` в поток.
56 *
57 * @tparam Ts: типы элементов в кортеже.
58 * @param os: выходной поток, в который будет записан кортеж.
59 * @param t: кортеж, который нужно распечатать.
60 *
61 * @return `std::ostream`: модифицированный выходной поток.
62 */
63template <typename... Ts>
64std::ostream& operator<<(std::ostream& os, const std::tuple<Ts...>& t) {
65 os << "{";
66 PrintTuple(os, t);
67 return os << "}";
68}
69
70/**
71 * @brief Выводит все элементы вектора в поток.
72 *
73 * @tparam Type: тип, возможный к выводу в консоль.
74 * @param os: ссылка на поток, в который надо вывести (мод.).
75 * @param vec: вектор элементов произвольного типа.
76 *
77 * @return `std::ostream`: ссылка на поток, в который вывели.
78 */
79template <typename Type>
80inline std::ostream& operator<<(std::ostream& os,
81 const std::vector<Type>& vec) {
82 os << "{";
83
84 for (std::size_t i = 0; i < vec.size(); i++) {
85 os << vec[i];
86 if (i != vec.size() - 1) os << "; ";
87 }
88
89 return os << "}";
90}
91
92/**
93 * @brief Выводит все элементы `std::unordered_map` в выходной поток.
94 *
95 * @tparam K: тип ключей в неупорядоченной карте.
96 * @tparam V: тип значений в неупорядоченной карте.
97 * @param os: выходной поток, в который будет записан словарь.
98 * @param map: словарь, который нужно распечатать.
99 *
100 * @return `std::ostream`: модифицированный выходной поток.
101 */
102template <typename K, typename V>
103std::ostream& operator<<(std::ostream& os,
104 const std::unordered_map<K, V>& map) {
105 os << "{";
106
107 bool first = true;
108 for (const auto& [key, value] : map) {
109 if (!first) os << "; ";
110
111 os << key << ": " << value;
112 first = false;
113 }
114
115 return os << "}";
116}
117
118/**
119 * @brief Функция, которая обрезает незнач. нули `float` при преобр. в строку.
120 *
121 * @param number: число типа float.
122 *
123 * @return `std::string`: итоговое число, записанное в строку.
124 */
125inline std::string ErasedZerosStr(float number) {
126 std::string origin = std::to_string(number);
127
128 // удаляем незначащие нули
129 origin.erase(origin.find_last_not_of('0') + 1, std::string::npos);
130
131 // если последний символ - десятичная точка, удаляем
132 if (origin.back() == '.') origin.pop_back();
133
134 return origin;
135}
136
137/**
138 * @brief Перегрузка, которая вводит все элементы вектора из потока.
139 * (работает исключительно с консолью, так как
140 * (вывод о текущем состоянии происходит туда)
141 *
142 * @tparam Type: тип, возможный к выводу в консоль.
143 * @param is: ссылка на поток, из которого надо ввести (мод.).
144 * @param vec: вектор элементов типа Type (мод.).
145 *
146 * @return `std::istream`: ссылка на поток, из которого ввели.
147 */
148template <typename Type>
149inline std::istream& operator>>(std::istream& is, std::vector<Type>& vec) {
150 // @brief Размер вектора
151 long size = 0;
152
153 std::cout << "Enter array size: ";
154 while (size <= 0) {
155 is >> size;
156 if (!is) {
157 std::cerr << "Invalid size input." << std::endl;
158 return is;
159 }
160
161 if (size <= 0) std::cout << "Invalid size input. Try again: ";
162 }
163
164 // @brief Текущий элемент
165 Type curr;
166
167 vec.clear(); // (для перезаписи нужна отчистка)
168 std::cout << "Enter array elements: ";
169 for (std::size_t i = 0; i < std::size_t(size); i++) {
170 is >> curr;
171 if (!is) {
172 std::cerr << "Invalid array input. The entry is incorrect." << std::endl;
173 return is;
174 }
175
176 vec.push_back(curr);
177 }
178
179 return is;
180}
181
182/**
183 * @brief Проверяет наличие элемента в векторе.
184 *
185 * @tparam T: тип элемента.
186 * @param vec: исходный вектор.
187 * @param value: искомое значение.
188 *
189 * @return `true`: элемент найден.
190 * @return `false`: элемент не найден.
191 */
192template <typename T>
193inline bool Contains(const std::vector<T>& vec, const T& value) {
194 return std::find(vec.begin(), vec.end(), value) != vec.end();
195}
196
197/**
198 * @brief Удаляет подстроку из начала строки, если она там присутствует.
199 *
200 * @param origin: исходная строка, из которой нужно удалить подстроку.
201 * @param substring: подстрока, которую нужно удалить из начала строки.
202 *
203 * @return `std::string`: строка, в которой подстрока (если она была) удалена из
204 * начала.
205 */
206inline std::string ReplacedString(std::string origin,
207 const std::string& substring) {
208 return origin.rfind(substring, 0) == 0 ? origin.erase(0, substring.length())
209 : origin;
210}
static std::ostream & PrintTuple(std::ostream &os, const std::tuple< Ts... > &t)
Выводит все элементы std::tuple в поток.
Definition utils.hpp:44
std::ostream & operator<<(std::ostream &os, const std::pair< Type1, Type2 > &pair)
Выводит все элементы пары в поток.
Definition utils.hpp:28
bool Contains(const std::vector< T > &vec, const T &value)
Проверяет наличие элемента в векторе.
Definition utils.hpp:193
std::string ReplacedString(std::string origin, const std::string &substring)
Удаляет подстроку из начала строки, если она там присутствует.
Definition utils.hpp:206
std::string ErasedZerosStr(float number)
Функция, которая обрезает незнач. нули float при преобр. в строку.
Definition utils.hpp:125
std::istream & operator>>(std::istream &is, std::vector< Type > &vec)
Перегрузка, которая вводит все элементы вектора из потока. (работает исключительно с консолью,...
Definition utils.hpp:149