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)86const char *indent(IndentorBase<tabWidth> &indentor) 87 { 88 ++indentor.indent; 89 return ""; 90 } 91 92 template <int tabWidth> outdent(IndentorBase<tabWidth> & indentor)93const char *outdent(IndentorBase<tabWidth> &indentor) 94 { 95 --indentor.indent; 96 return ""; 97 } 98 99 #endif // GENERATOR_H 100