Warning, /multimedia/subtitlecomposer/README.CodingStyle.md is written in an unsupported language. File is not indexed.

0001 ## SubtitleComposer Coding Style ##
0002 
0003 ### Indentation
0004 
0005 1 tab is used for indentation
0006 
0007 Tab, not spaces!
0008 
0009 
0010 ### Declaring variables
0011 
0012 Declare each variable on a separate line
0013 
0014 Avoid short or meaningless names (e.g. "a", "rbarr", "nughdeget")
0015 
0016 Single character variable names are only okay for counters and temporaries, where the purpose of the variable is obvious
0017 
0018 Wait when declaring a variable until it is needed
0019 
0020 ```C++
0021         // Wrong
0022         int a, b;
0023         char *c, *d;
0024 
0025         // Correct
0026         int height;
0027         int width;
0028         char *nameOfThis;
0029         char *nameOfThat;
0030 ```
0031 
0032 Variables and functions start with a lower-case letter. Each consecutive word in a variable’s name starts with an upper-case letter
0033 
0034 Avoid abbreviations
0035 
0036 ```C++
0037         // Wrong
0038         short Cntr;
0039         char ITEM_DELIM = '\t';
0040 
0041         // Correct
0042         short counter;
0043         char itemDelimiter = '\t';
0044 ```
0045 
0046 Classes always start with an upper-case letter. Public classes start with a ‘Q’ (QRgb) followed by an upper case letter. Public functions most often start with a ‘q’ (qRgb).
0047 Acronyms are camel-cased (e.g. QXmlStreamReader, not QXMLStreamReader).
0048 
0049 
0050 ### Whitespace
0051 
0052 Use blank lines to group statements together where suited
0053 Always use only one blank line
0054 Do not use space after a keyword
0055 Always use one single space before a curly brace:
0056 
0057 ```C++
0058         // Wrong
0059         if (foo){
0060         }
0061 
0062         // Correct
0063         if(foo) {
0064         }
0065 ```
0066 
0067 For pointers or references, always use a single space between the type and ‘*’ or ‘&’, but no space between the ‘*’ or ‘&’ and the variable name:
0068 
0069 ```C++
0070         // Correct
0071         char *x;
0072         const QString &myString;
0073         const char * const y = "hello";
0074 ```
0075 
0076 Surround binary operators with spaces
0077 No space after a cast
0078 Avoid C-style casts when possible
0079 
0080 ```C++
0081         // Wrong
0082         char* blockOfMemory = (char*)malloc(data.size());
0083 
0084         // Correct
0085         char *blockOfMemory = reinterpret_cast<char *>(malloc(data.size()));
0086 ```
0087 
0088 Do not put multiple statements on one line
0089 By extension, use a new line for the body of a control flow statement:
0090 
0091 ```C++
0092         // Wrong
0093         if(foo) bar();
0094 
0095         // Correct
0096         if(foo)
0097                 bar();
0098 ```
0099 
0100 
0101 ### Braces
0102 
0103 Use attached braces: The opening brace goes on the same line as the start of the statement. If the closing brace is followed by another keyword, it goes into the same line as well:
0104 
0105 ```C++
0106         // Wrong
0107         if(codec)
0108         {
0109         }
0110         else
0111         {
0112         }
0113 
0114         // Correct
0115         if(codec) {
0116         } else {
0117         }
0118 ```
0119 
0120 Exception: Function implementations and class declarations always have the left brace on the start of a line:
0121 
0122 ```C++
0123         // Correct
0124         static void
0125         foo(int g)
0126         {
0127                 qDebug("foo: %i", g);
0128         }
0129 
0130         class Moo
0131         {
0132         };
0133 ```
0134 
0135 Use curly braces only when the body of a conditional statement contains more than one line:
0136 
0137 ```C++
0138         // Wrong
0139         if(address.isEmpty()) {
0140                 return false;
0141         }
0142 
0143         for(int i = 0; i < 10; ++i) {
0144                 qDebug("%i", i);
0145         }
0146 
0147         // Correct
0148         if(address.isEmpty())
0149                 return false;
0150 
0151         for(int i = 0; i < 10; ++i)
0152                 qDebug("%i", i);
0153 ```
0154 
0155 Exception 1: Use braces also if the parent statement covers several lines / wraps:
0156 
0157 ```C++
0158         // Correct
0159         if(address.isEmpty() || !isValid()
0160                 || !codec) {
0161                 return false;
0162         }
0163 ```
0164 
0165 Exception 2: Brace symmetry: Use braces also in if-then-else blocks where either the if-code or the else-code covers several lines:
0166 
0167 ```C++
0168         // Wrong
0169         if(address.isEmpty())
0170                 return false;
0171         else {
0172                 qDebug("%s", qPrintable(address));
0173                 ++it;
0174         }
0175 
0176         // Correct
0177         if(address.isEmpty()) {
0178                 return false;
0179         } else {
0180                 qDebug("%s", qPrintable(address));
0181                 ++it;
0182         }
0183 
0184         // Wrong
0185         if(a)
0186                 if(b)
0187                         ...
0188                 else
0189                         ...
0190         // Correct
0191         if(a) {
0192                 if(b)
0193                         ...
0194                 else
0195                         ...
0196         }
0197 ```
0198 
0199 Use curly braces when the body of a conditional statement is empty
0200 
0201 ```C++
0202         // Wrong
0203         while(a);
0204 
0205         // Correct
0206         while(a) {}
0207 ```
0208 
0209 
0210 ### Parentheses
0211 
0212 Use parentheses to group expressions:
0213 
0214 ```C++
0215         // Wrong
0216         if(a && b || c)
0217 
0218         // Correct
0219         if((a && b) || c)
0220 
0221         // Wrong
0222         a + b & c
0223 
0224         // Correct
0225         (a + b) & c
0226 ```
0227 
0228 
0229 ### Switch statements
0230 
0231 The case labels are in the same column as the switch
0232 Every case must have a break (or return) statement at the end or a comment to indicate that there’s intentionally no break, unless another case follows immediately.
0233 
0234 ```C++
0235         // Correct
0236         switch(myEnum) {
0237         case Value1:
0238                 doSomething();
0239                 break;
0240         case Value2:
0241         case Value3:
0242                 doSomethingElse();
0243                 // fall through
0244         default:
0245                 defaultHandling();
0246                 break;
0247         }
0248 ```
0249 
0250 Jump statements (break, continue, return, and goto)
0251 
0252 Do not put ‘else’ after jump statements:
0253 
0254 ```C++
0255         // Wrong
0256         if(thisOrThat)
0257                 return;
0258         else
0259                 somethingElse();
0260 
0261         // Correct
0262         if(thisOrThat)
0263                 return;
0264         somethingElse();
0265 ```
0266 
0267 Exception: If the code is inherently symmetrical, use of ‘else’ is allowed to visualize that symmetry
0268 
0269 
0270 ### Line breaks
0271 
0272 Keep lines shorter than 100 characters; wrap if necessary
0273 Commas go at the end of wrapped lines; operators start at the beginning of the new lines. An operator at the end of the line is easy to miss if the editor is too narrow.
0274 
0275 ```C++
0276         // Wrong
0277         if(longExpression +
0278                 otherLongExpression +
0279                 otherOtherLongExpression) {
0280         }
0281 
0282         // Correct
0283         if(longExpression
0284                 + otherLongExpression
0285                 + otherOtherLongExpression) {
0286         }
0287 ```
0288 
0289 
0290 ### Inheritance and the `virtual` keyword
0291 
0292 When reimplementing a virtual method, do not put the `virtual` keyword in the header file.
0293 On Qt5, annotate them with the [Q_DECL_OVERRIDE](http://qt-project.org/doc/qt-5.0/qtcore/qtglobal.html#Q_DECL_OVERRIDE) macro after the function declaration, just before the ‘;’ (or the ‘{’ ).
0294 
0295 
0296 ### Qt Includes
0297 
0298 Do not use both the module and class name for Qt includes.
0299 
0300 ```C++
0301         // Correct
0302         #include <QString>
0303 
0304         // Wrong
0305         #include <QtCore/QString>
0306 ```
0307 
0308 
0309 ### C++11 Lambdas
0310 
0311 You can use lambdas with the following restrictions:
0312 
0313 * You have to explicitly specify the return type (unless it's void), if the lambda contains more than a single expression.
0314 
0315 ```C++
0316         // Correct
0317         []() -> QString {
0318                 Foo *foo = activeFoo();
0319                 return foo ? foo->displayName() : QString();
0320         });
0321 
0322         // Wrong
0323         []() {
0324                 Foo *foo = activeFoo();
0325                 return foo ? foo->displayName() : QString();
0326         });
0327 ```
0328 
0329 * If you use static functions from the class that the lambda is located in, you have to explicitly capture this. Otherwise it does not compile with g++ 4.7 and earlier.
0330 ```C++
0331         // Correct
0332         void
0333         Foo::something()
0334         {
0335                 ...
0336                 [this]() { Foo::someStaticFunction(); }
0337                 ...
0338         }
0339 
0340         // Wrong
0341         void
0342         Foo::something()
0343         {
0344                 ...
0345                 []() { Foo::someStaticFunction(); }
0346                 ...
0347         }
0348 ```
0349 
0350 Format the lambda according to the following rules:
0351 
0352 * Always write parentheses for the parameter list, even if the function does not take parameters.
0353 
0354 ```C++
0355         // Correct
0356         []() { doSomething(); }
0357 
0358         // Wrong
0359         [] { doSomething(); }
0360 ```
0361 
0362 * Place the capture-list, parameter list, return type, and opening brace on the first line, the body indented on the following lines, and the closing brace on a new line.
0363 ```C++
0364         // Correct
0365         []() -> bool {
0366                 something();
0367                 return isSomethingElse();
0368         }
0369 
0370         // Wrong
0371         []() -> bool { something();
0372                 somethingElse(); }
0373 ```
0374 
0375 * Place a closing parenthesis and semicolon of an enclosing function call on the same line as the closing brace of the lambda.
0376 ```C++
0377         // Correct
0378         foo([]() {
0379                 something();
0380         });
0381 ```
0382 
0383 * If you are using a lambda in an 'if' statement, start the lambda on a new line, to avoid confusion between the opening brace for the lambda and the opening brace for the 'if' statement.
0384 ```C++
0385         // Correct
0386         if(anyOf(fooList,
0387                 [](Foo foo) {
0388                         return foo.isGreat();
0389                 }) {
0390                 return;
0391         }
0392 
0393         // Correct - place the lambda completely on one line if it fits
0394         if(foo([]() { return true; })) {
0395                 ...
0396         }
0397 
0398         // Wrong
0399         if(anyOf(fooList, [](Foo foo) {
0400                         return foo.isGreat();
0401                 }) {
0402                 return;
0403         }
0404 ```
0405 
0406 
0407 ### C++11 auto keyword
0408 
0409 You can use the auto keyword in the following cases. If in doubt (e.g. using auto could make the code less readable) do not use auto. Keep in mind that code is read much more often than written.
0410 
0411 * When it avoids repetition of a type in the same statement.
0412 ```C++
0413         // Correct
0414         auto something = new MyCustomType;
0415         auto keyEvent = static_cast<QKeyEvent *>(event);
0416 ```
0417 
0418 * When assigning iterator types.
0419 ```C++
0420         // Correct
0421         auto it = myList.const_iterator();
0422 ```
0423 
0424 ### C++11 initializer lists
0425 
0426 You should prefer initializer lists over adding the entries at runtime.
0427 
0428 ```C++
0429         // Wrong
0430     auto myList = QStringList() << QLatin1String("FooThing") << QLatin1String("BarThing");
0431         // Correct
0432         QStringList myList{QStringLiteral("FooThing"), QStringLiteral("BarThing")};
0433         QStringList myListWithSingleEntry{QStringLiteral("FooThing")};
0434 ```
0435 
0436 ### General exception
0437 
0438 When strictly following a rule makes your code look bad, feel free to break it