Tue, 16 Jul 2013 23:53:31 +0300
Initial commit
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 | |
77 | str doFormat( std::vector< StringFormatArg > args ); | |
78 | ||
79 | // printf replacement | |
80 | void doPrint( initlist<StringFormatArg> args ); // heh | |
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 |