forked from crosire/reshade
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathvariant.hpp
132 lines (122 loc) · 2.88 KB
/
variant.hpp
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
/**
* Copyright (C) 2014 Patrick Mours. All rights reserved.
* License: https://github.com/crosire/reshade#license
*/
#pragma once
#include <string>
#include <vector>
#include "filesystem.hpp"
namespace reshade
{
class variant
{
public:
variant() { }
variant(const char *value) : _values(1, value) { }
template <typename T>
variant(const T &value) : variant(std::to_string(value)) { }
template <>
variant(const bool &value) : variant(value ? "1" : "0") { }
template <>
variant(const std::string &value) : _values(1, value) { }
template <>
variant(const std::vector<std::string> &values) : _values(values) { }
template <>
variant(const filesystem::path &value) : variant(value.string()) { }
template <>
variant(const std::vector<filesystem::path> &values) : _values(values.size())
{
for (size_t i = 0; i < values.size(); i++)
_values[i] = values[i].string();
}
template <typename T>
variant(const T *values, size_t count) : _values(count)
{
for (size_t i = 0; i < count; i++)
_values[i] = std::to_string(values[i]);
}
template <>
variant(const bool *values, size_t count) : _values(count)
{
for (size_t i = 0; i < count; i++)
_values[i] = values[i] ? "1" : "0";
}
template <typename T, size_t COUNT>
variant(const T(&values)[COUNT]) : variant(values, COUNT) { }
template <typename T>
variant(std::initializer_list<T> values) : variant(values.begin(), values.size()) { }
std::vector<std::string> &data()
{
return _values;
}
const std::vector<std::string> &data() const
{
return _values;
}
template <typename T>
const T as(size_t index = 0) const;
template <>
const bool as(size_t i) const
{
return as<int>(i) != 0 || i < _values.size() && (_values[i] == "true" || _values[i] == "True" || _values[i] == "TRUE");
}
template <>
const int as(size_t i) const
{
return static_cast<int>(as<long>(i));
}
template <>
const unsigned int as(size_t i) const
{
return static_cast<unsigned int>(as<unsigned long>(i));
}
template <>
const long as(size_t i) const
{
if (i >= _values.size())
{
return 0l;
}
return std::strtol(_values[i].c_str(), nullptr, 10);
}
template <>
const unsigned long as(size_t i) const
{
if (i >= _values.size())
{
return 0ul;
}
return std::strtoul(_values[i].c_str(), nullptr, 10);
}
template <>
const float as(size_t i) const
{
return static_cast<float>(as<double>(i));
}
template <>
const double as(size_t i) const
{
if (i >= _values.size())
{
return 0.0;
}
return std::strtod(_values[i].c_str(), nullptr);
}
template <>
const std::string as(size_t i) const
{
if (i >= _values.size())
{
return std::string();
}
return _values[i];
}
template <>
const filesystem::path as(size_t i) const
{
return as<std::string>(i);
}
private:
std::vector<std::string> _values;
};
}