-
Notifications
You must be signed in to change notification settings - Fork 0
/
Utilities.h
133 lines (112 loc) · 4.23 KB
/
Utilities.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#ifndef UTILITIES_H
#define UTILITIES_H
#include <algorithm>
#include <cassert>
#include <fstream>
#include <iostream>
#include <iterator>
#include <sstream>
#include <string>
#include <vector>
#include <SFML/Graphics/Text.hpp>
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
#include <Windows.h>
#include <pathcch.h>
#endif // WINDOWS
namespace utilities {
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
////////////////////////////////////////////////////////////
inline std::string getWorkingDirectory() {
char buff[MAX_PATH];
GetModuleFileName(NULL, buff, MAX_PATH);
std::string path{ buff };
path = path.substr(0, path.find_last_of('\\') + 1);
assert(!path.empty() && "utilities::getWorkingDirectory: Returned empty string as path.");
return std::move(path);
}
////////////////////////////////////////////////////////////
inline std::vector<std::pair<std::string, bool>> getFileList(const std::string& t_directory, const std::string& t_search = "*.*", bool t_directories = false) {
std::vector<std::pair<std::string, bool>> files;
if (t_search.empty()) { return std::move(files); }
std::string path{ t_directory + t_search };
WIN32_FIND_DATA data;
HANDLE found{ FindFirstFile(path.c_str(), &data) };
if (found == INVALID_HANDLE_VALUE) { return std::move(files); }
do {
if (!(data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) || t_directories) {
files.emplace_back(std::make_pair(std::string(data.cFileName),
((data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) != 0)));
}
} while (FindNextFile(found, &data));
FindClose(found);
return std::move(files);
}
#endif // WINDOWS
const std::string EMPTY_STR{ "" };
////////////////////////////////////////////////////////////
inline void readQuotedString(std::stringstream& t_stream, std::string& t_string) {
t_stream >> t_string;
if (t_string.at(0) == '"') {
while (t_string.at(t_string.length() - 1) != '"' || !t_stream.eof()) {
std::string str;
t_stream >> str;
t_string.append(" " + str);
}
}
t_string.erase(std::remove(t_string.begin(), t_string.end(), '"'), t_string.end());
}
////////////////////////////////////////////////////////////
template <class T>
inline T interpolate(float t_begin, float t_end, const T& t_begin_val, const T& t_end_val, float t_x) {
return static_cast<T>((
((t_end_val - t_begin_val) / (t_end - t_begin)) * (t_x - t_begin) + t_begin_val));
}
////////////////////////////////////////////////////////////
inline float getSFMLTextMaxHeight(const sf::Text& t_text) {
auto charSize{ t_text.getCharacterSize() };
auto font{ t_text.getFont() };
auto string{ t_text.getString().toAnsiString() };
bool bold{ (bool)(t_text.getStyle() & sf::Text::Bold) };
float max{ 0.f };
for (size_t i{ 0 }; i < string.length(); i++) {
auto character{ static_cast<sf::Uint32>(string[i]) };
auto glyph{ font->getGlyph(character, charSize, bold) };
auto height{ glyph.bounds.height };
if (height <= max) { continue; }
}
return max;
}
////////////////////////////////////////////////////////////
inline void centerSFMLText(sf::Text& t_text) {
sf::FloatRect rect{ t_text.getLocalBounds() };
auto maxHeight{ getSFMLTextMaxHeight(t_text) };
t_text.setOrigin(
rect.left + (rect.width * 0.5f),
rect.top + ((maxHeight >= rect.height ? maxHeight * 0.5f : rect.height * 0.5f)));
}
////////////////////////////////////////////////////////////
inline void sortFileList(std::vector<std::pair<std::string, bool >>& t_list) {
std::sort(t_list.begin(), t_list.end(),
[](std::pair<std::string, bool>& t_1, std::pair<std::string, bool>& t_2) {
if (t_1.second && !t_2.second) { return true; }
return false;
}
);
}
////////////////////////////////////////////////////////////
inline bool readFile(const std::string& t_fileNameWithPath, std::stringstream& t_out_stream, bool t_printError = false) {
std::ifstream file;
file.open(t_fileNameWithPath);
if (!file.is_open()) {
if (t_printError) {
std::cerr << "@ ERROR: Cannot open input file: \"" << t_fileNameWithPath << '\"' << std::endl;
}
return false;
}
t_out_stream.clear();
t_out_stream << file.rdbuf();
file.close();
return true;
}
};
#endif // ! UTILITIES_H