diff -r 9374fea8f77f -r f1b8cb53d2a2 src/config.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/config.h Wed May 08 15:19:06 2013 +0300 @@ -0,0 +1,227 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013 Santeri Piippo + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef CONFIG_H +#define CONFIG_H + +#include "common.h" +#include "str.h" + +// ============================================================================= +#include +#include + +#define MAX_INI_LINE 512 +#define NUM_CONFIG (g_pConfigPointers.size ()) + +#define cfg(T, NAME, DEFAULT) \ + T##config NAME (DEFAULT, #NAME, #T, #DEFAULT) + +#define extern_cfg(T, NAME) \ + extern T##config NAME + +// ============================================================================= +enum configtype_e { + CONFIG_none, + CONFIG_int, + CONFIG_str, + CONFIG_float, + CONFIG_bool, + CONFIG_keyseq, +}; + +// ========================================================= +class config { +public: + const char* name, *typestring, *defaultstring; + + virtual configtype_e getType () { + return CONFIG_none; + } + + virtual void resetValue () {} + + // ------------------------------------------ + static bool load (); + static bool save (); + static void reset (); + static str dirpath (); + static str filepath (); +}; + +extern std::vector g_configPointers; + +// ============================================================================= +#define DEFINE_UNARY_OPERATOR(T, OP) \ + T operator OP () { \ + return (OP value); \ + } \ + +#define DEFINE_BINARY_OPERATOR(T, OP) \ + T operator OP (const T other) { \ + return (value OP other); \ + } \ + +#define DEFINE_ASSIGN_OPERATOR(T, OP) \ + T& operator OP (const T other) { \ + return (value OP other); \ + } \ + +#define DEFINE_COMPARE_OPERATOR(T, OP) \ + bool operator OP (const T other) { \ + return (value OP other); \ + } \ + +#define DEFINE_CAST_OPERATOR(T) \ + operator T () { \ + return (T) value; \ + } \ + +#define DEFINE_ALL_COMPARE_OPERATORS(T) \ + DEFINE_COMPARE_OPERATOR (T, ==) \ + DEFINE_COMPARE_OPERATOR (T, !=) \ + DEFINE_COMPARE_OPERATOR (T, >) \ + DEFINE_COMPARE_OPERATOR (T, <) \ + DEFINE_COMPARE_OPERATOR (T, >=) \ + DEFINE_COMPARE_OPERATOR (T, <=) \ + +#define DEFINE_INCREMENT_OPERATORS(T) \ + T operator++ () {return ++value;} \ + T operator++ (int) {return value++;} \ + T operator-- () {return --value;} \ + T operator-- (int) {return value--;} + +#define CONFIGTYPE(T) \ +class T##config : public config + +#define IMPLEMENT_CONFIG(T) \ + T value, defval; \ + \ + T##config (T _defval, const char* _name, const char* _typestring, \ + const char* _defaultstring) \ + { \ + value = defval = _defval; \ + name = _name; \ + typestring = _typestring; \ + defaultstring = _defaultstring; \ + g_pConfigPointers.push_back (this); \ + } \ + operator T () { \ + return value; \ + } \ + configtype_e getType () { \ + return CONFIG_##T; \ + } \ + virtual void resetValue () { \ + value = defval; \ + } + +// ============================================================================= +CONFIGTYPE (int) { +public: + IMPLEMENT_CONFIG (int) + + // Int-specific operators + DEFINE_ALL_COMPARE_OPERATORS (int) + DEFINE_INCREMENT_OPERATORS (int) + DEFINE_BINARY_OPERATOR (int, +) + DEFINE_BINARY_OPERATOR (int, -) + DEFINE_BINARY_OPERATOR (int, *) + DEFINE_BINARY_OPERATOR (int, /) + DEFINE_BINARY_OPERATOR (int, %) + DEFINE_BINARY_OPERATOR (int, ^) + DEFINE_BINARY_OPERATOR (int, |) + DEFINE_BINARY_OPERATOR (int, &) + DEFINE_BINARY_OPERATOR (int, >>) + DEFINE_BINARY_OPERATOR (int, <<) + DEFINE_UNARY_OPERATOR (int, !) + DEFINE_UNARY_OPERATOR (int, ~) + DEFINE_UNARY_OPERATOR (int, -) + DEFINE_UNARY_OPERATOR (int, +) + DEFINE_ASSIGN_OPERATOR (int, =) + DEFINE_ASSIGN_OPERATOR (int, +=) + DEFINE_ASSIGN_OPERATOR (int, -=) + DEFINE_ASSIGN_OPERATOR (int, *=) + DEFINE_ASSIGN_OPERATOR (int, /=) + DEFINE_ASSIGN_OPERATOR (int, %=) + DEFINE_ASSIGN_OPERATOR (int, >>=) + DEFINE_ASSIGN_OPERATOR (int, <<=) +}; + +// ============================================================================= +CONFIGTYPE (str) { +public: + IMPLEMENT_CONFIG (str) + + DEFINE_ALL_COMPARE_OPERATORS (str) + DEFINE_BINARY_OPERATOR (str, -) + DEFINE_BINARY_OPERATOR (str, *) + DEFINE_UNARY_OPERATOR (str, !) + DEFINE_ASSIGN_OPERATOR (str, =) + DEFINE_ASSIGN_OPERATOR (str, +=) + DEFINE_ASSIGN_OPERATOR (str, -=) + DEFINE_ASSIGN_OPERATOR (str, *=) + DEFINE_CAST_OPERATOR (char*) + + char operator[] (size_t n) { + return value[n]; + } + +#ifdef CONFIG_WITH_QT + operator QString () { + return QString (value.chars()); + } +#endif // CONFIG_WITH_QT +}; + +// ============================================================================= +CONFIGTYPE (float) { +public: + IMPLEMENT_CONFIG (float) + + DEFINE_ALL_COMPARE_OPERATORS (float) + DEFINE_INCREMENT_OPERATORS (float) + DEFINE_BINARY_OPERATOR (float, +) + DEFINE_BINARY_OPERATOR (float, -) + DEFINE_BINARY_OPERATOR (float, *) + DEFINE_UNARY_OPERATOR (float, !) + DEFINE_ASSIGN_OPERATOR (float, =) + DEFINE_ASSIGN_OPERATOR (float, +=) + DEFINE_ASSIGN_OPERATOR (float, -=) + DEFINE_ASSIGN_OPERATOR (float, *=) +}; + +// ============================================================================= +CONFIGTYPE (bool) { +public: + IMPLEMENT_CONFIG (bool) + DEFINE_ALL_COMPARE_OPERATORS (bool) + DEFINE_ASSIGN_OPERATOR (bool, =) +}; + +// ============================================================================= +typedef QKeySequence keyseq; + +CONFIGTYPE (keyseq) { +public: + IMPLEMENT_CONFIG (keyseq) + DEFINE_ALL_COMPARE_OPERATORS (keyseq) + DEFINE_ASSIGN_OPERATOR (keyseq, =) +}; + +#endif // CONFIG_H \ No newline at end of file