1 /****************************************************************************
2 **
3 ** Copyright (C) 2019 The Qt Company Ltd.
4 ** Contact: https://www.qt.io/licensing/
5 **
6 ** This file is part of Qt for Python.
7 **
8 ** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and The Qt Company. For licensing terms
14 ** and conditions see https://www.qt.io/terms-conditions. For further
15 ** information use the contact form at https://www.qt.io/contact-us.
16 **
17 ** GNU General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU
19 ** General Public License version 3 as published by the Free Software
20 ** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21 ** included in the packaging of this file. Please review the following
22 ** information to ensure the GNU General Public License requirements will
23 ** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24 **
25 ** $QT_END_LICENSE$
26 **
27 ****************************************************************************/
28 
29 #ifndef INDENTOR_H
30 #define INDENTOR_H
31 
32 #include <QtCore/QTextStream>
33 
34 /**
35 * Utility class to store the indentation level, use it in a QTextStream.
36 */
37 
38 template <int tabWidth>
39 class IndentorBase
40 {
41 public:
total()42     int total() const { return tabWidth * indent; }
43 
44     int indent = 0;
45 };
46 
47 using Indentor = IndentorBase<4>;
48 using Indentor1 = IndentorBase<1>;
49 
50 /**
51 *   Class that use the RAII idiom to set and unset the indentation level.
52 */
53 
54 template <int tabWidth>
55 class IndentationBase
56 {
57 public:
58     using Indentor = IndentorBase<tabWidth>;
59 
m_count(count)60     IndentationBase(Indentor &indentor, int count = 1) : m_count(count), indentor(indentor)
61     {
62         indentor.indent += m_count;
63     }
64 
~IndentationBase()65     ~IndentationBase()
66     {
67         indentor.indent -= m_count;
68     }
69 
70 private:
71     const int m_count;
72     Indentor &indentor;
73 };
74 
75 using Indentation = IndentationBase<4>;
76 
77 template <int tabWidth>
78 inline QTextStream &operator <<(QTextStream &s, const IndentorBase<tabWidth> &indentor)
79 {
80     for (int i = 0, total = indentor.total(); i < total; ++i)
81         s << ' ';
82     return s;
83 }
84 
85 template <int tabWidth>
indent(IndentorBase<tabWidth> & indentor)86 const char *indent(IndentorBase<tabWidth> &indentor)
87 {
88     ++indentor.indent;
89     return "";
90 }
91 
92 template <int tabWidth>
outdent(IndentorBase<tabWidth> & indentor)93 const char *outdent(IndentorBase<tabWidth> &indentor)
94 {
95     --indentor.indent;
96     return "";
97 }
98 
99 #endif // GENERATOR_H
100