Wed, 17 Jul 2013 00:31:04 +0300
argh
| 0 | 1 | #ifndef TYPES_H |
| 2 | #define TYPES_H | |
| 3 | ||
| 4 | #include "main.h" | |
| 5 | #include <QString> | |
| 6 | #include <QList> | |
| 7 | ||
| 8 | typedef QString str; | |
| 9 | typedef QChar qchar; | |
| 10 | template<class T> using list = QList<T>; | |
| 11 | typedef unsigned int uint; | |
| 12 | typedef unsigned short ushort; | |
| 13 | typedef unsigned long ulong; | |
| 14 | template<class T> using initlist = std::initializer_list<T>; | |
| 15 | using std::size_t; | |
| 16 | ||
| 17 | // ============================================================================= | |
| 18 | // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * | |
| 19 | // ============================================================================= | |
| 20 | // StringFormatArg | |
| 21 | // | |
| 22 | // Converts a given value into a string that can be retrieved with ::value (). | |
| 23 | // Used as the argument type to the formatting functions, hence its name. | |
| 24 | // ============================================================================= | |
| 25 | class StringFormatArg { | |
| 26 | public: | |
| 27 | StringFormatArg( const str& v ); | |
| 28 | StringFormatArg( const char& v ); | |
| 29 | StringFormatArg( const uchar& v ); | |
| 30 | StringFormatArg( const qchar& v ); | |
| 31 | ||
| 32 | #define NUMERIC_FORMAT_ARG(T,C) \ | |
| 33 | StringFormatArg (const T& v) { \ | |
| 34 | char valstr[32]; \ | |
| 35 | sprintf (valstr, "%" #C, v); \ | |
| 36 | m_val = valstr; \ | |
| 37 | } | |
| 38 | ||
| 39 | NUMERIC_FORMAT_ARG( int, d ) | |
| 40 | NUMERIC_FORMAT_ARG( short, d ) | |
| 41 | NUMERIC_FORMAT_ARG( long, ld ) | |
| 42 | NUMERIC_FORMAT_ARG( uint, u ) | |
| 43 | NUMERIC_FORMAT_ARG( ushort, u ) | |
| 44 | NUMERIC_FORMAT_ARG( ulong, lu ) | |
| 45 | ||
| 46 | StringFormatArg( const float& v ); | |
| 47 | StringFormatArg( const double& v ); | |
| 48 | StringFormatArg( const char* v ); | |
| 49 | StringFormatArg( const void* v ); | |
| 50 | ||
| 51 | template<class T> StringFormatArg( const list<T>& v ) { | |
| 52 | m_val = "{ "; | |
| 53 | uint i = 0; | |
| 54 | ||
| 55 | for( const T& it : v ) { | |
| 56 | if( i++ ) | |
| 57 | m_val += ", "; | |
| 58 | ||
| 59 | StringFormatArg arg( it ); | |
| 60 | m_val += arg.value(); | |
| 61 | } | |
| 62 | ||
| 63 | if( i ) | |
| 64 | m_val += " "; | |
| 65 | ||
| 66 | m_val += "}"; | |
| 67 | } | |
| 68 | ||
| 69 | str value() const { | |
| 70 | return m_val; | |
| 71 | } | |
| 72 | private: | |
| 73 | str m_val; | |
| 74 | }; | |
| 75 | ||
| 76 | // Formatter function | |
| 1 | 77 | str doFormat( initlist<StringFormatArg> args ); |
| 0 | 78 | |
| 79 | // printf replacement | |
| 1 | 80 | void doPrint( initlist<StringFormatArg> args ); |
| 0 | 81 | |
| 82 | // Macros to access these functions | |
| 83 | #ifndef IN_IDE_PARSER | |
| 84 | # define fmt(...) doFormat({ __VA_ARGS__ }) | |
| 85 | # define print(...) doPrint({ __VA_ARGS__ }) | |
| 86 | #else | |
| 87 | str fmt( const char* fmtstr, ... ); | |
| 88 | void print( const char* fmtstr, ... ); | |
| 89 | #endif | |
| 90 | ||
| 91 | #endif // TYPES_H |