9#include <QtCore/QtGlobal>
10#include <QtCore/QByteArray>
11#include <QtCore/QString>
12#include <QtCore/QStringList>
31#define I_EPSILON std::numeric_limits<double>::epsilon()
37#define I_HUGE_NUMBER 10e20
43#define I_INFINITY std::numeric_limits<double>::infinity()
59#define I_IF_DEBUG(instructions) instructions
60#define I_CRITICAL() Q_ASSERT(false)
67#define I_IF_DEBUG(instructions)
81#define I_ENUM_GET_VALUES(Enum, ...)\
82 static QList<int> Enum##GetValues(){\
84 int vars[] = {0, __VA_ARGS__};\
85 int count = (sizeof(vars) / sizeof(int));\
86 for(int i = 0; i < count; ++i){\
97#define I_ENUM_GET_STRINGS(Enum, ...)\
98 static QStringList Enum##GetStrings(){\
99 QString enumValuesString = #__VA_ARGS__;\
100 QStringList values = enumValuesString.split(",");\
101 for (int i = 0; i < values.count(); ++i){\
102 QString rawValue = values[i].simplified();\
103 QStringList splitNames = rawValue.split("_");\
104 if (splitNames.isEmpty()){\
105 values[i] = rawValue;\
108 QString formattedValue = rawValue;\
109 for (int partIndex = 1; partIndex < splitNames.count(); ++partIndex){\
110 QString partValue = splitNames[partIndex].toLower();\
111 if (partIndex == 1){\
112 formattedValue = partValue;\
115 formattedValue += partValue.at(0).toUpper() + partValue.mid(1);\
118 values[i] = formattedValue;\
127#define I_DECLARE_ENUM(Enum, ...)\
128 I_ENUM_GET_VALUES(Enum, __VA_ARGS__)\
129 I_ENUM_GET_STRINGS(Enum, __VA_ARGS__)\
130 static QByteArray ToString(Enum enumValue){\
131 static QByteArray emptyString;\
132 QStringList values = Enum##GetStrings();\
133 QList<int> enumValues = Enum##GetValues();\
134 Q_ASSERT(enumValues.count() == values.count());\
135 for (int i = 0; i < enumValues.count(); ++i){\
136 if (enumValues[i] == enumValue){\
137 return values[i].toUtf8();\
142 static bool FromString(const QByteArray& enumString, Enum& enumValue){\
143 QStringList values = Enum##GetStrings();\
144 QList<int> enumValues = Enum##GetValues();\
145 Q_ASSERT(enumValues.count() == values.count());\
146 for (int i = 0; i < enumValues.count(); ++i){\
147 if (values[i].toUtf8() == enumString){\
148 enumValue = Enum(enumValues[i]);\
155#define I_DECLARE_FLAGS(Enum, ...)\
156 I_ENUM_GET_VALUES(Enum, __VA_ARGS__)\
157 I_ENUM_GET_STRINGS(Enum, __VA_ARGS__)\
158 static QByteArray Enum##ToString(int flags){\
160 QStringList values = Enum##GetStrings();\
161 QList<int> enumValues = Enum##GetValues();\
162 Q_ASSERT(enumValues.count() == values.count());\
163 for (int i = 0; i < enumValues.count(); ++i){\
164 if (enumValues[i] & flags){\
165 if (!retVal.isEmpty()){\
168 retVal += values[i].toUtf8();\
173 static bool Enum##FromString(const QByteArray& enumString, int& flags){\
174 QStringList values = Enum##GetStrings();\
175 QList<int> enumValues = Enum##GetValues();\
177 Q_ASSERT(enumValues.count() == values.count());\
178 QList<QByteArray> separatedValues = enumString.split('|');\
179 for (int valueIndex = 0; valueIndex < separatedValues.count(); ++valueIndex){\
180 QByteArray value = separatedValues[valueIndex];\
181 for (int i = 0; i < enumValues.count(); ++i){\
182 if (values[i].toUtf8() == value){\
183 flags |= enumValues[i];\
static const QChar QCHAR_PERMILLE
static const QChar QCHAR_DEGREE
static const double I_BIG_EPSILON
static const QChar QCHAR_POW3
static const QChar QCHAR_POW2
Commonly used symbols.