Warning, /games/killbots/README.codestyle is written in an unsupported language. File is not indexed.
0001 ==========================
0002 Killbots C++ Style Guide
0003 ==========================
0004
0005 *******************************************************************************
0006 Indentation
0007 *******************************************************************************
0008
0009 Structural indentation is done with tabs. Formatting is done with spaces. All
0010 code having the same nested depth has the same number of tabs. This separates
0011 meaning from presentation.
0012
0013 Tabwidth is a matter of personal preference. If the above is followed source is
0014 tabwidth independent.
0015
0016 Ensure your editor doesn't do automatic conversion from spaces to tabs, as this
0017 will break things.
0018
0019 Labels (public, private, goto, case, etc.) do not get indented.
0020
0021 Empty lines do not get indentation. In fact, no lines should have trailing
0022 whitespace.
0023
0024 If a pair of parentheses span multiple lines, the closing parenthesis should be
0025 indented (with spaces) to appear in the same column as the opening parenthesis.
0026
0027 Examples:
0028 -------------------------------------------------------------------------------
0029 bool Killbots::Engine::cellIsValid( const QPoint & cell ) const
0030 {
0031 ____return ( 0 <= cell.x()
0032 ____.........&& cell.x() < m_rules->columns()
0033 ____.........&& 0 <= cell.y()
0034 ____.........&& cell.y() < m_rules->rows()
0035 ____.......);
0036 }
0037 -------------------------------------------------------------------------------
0038 namespace Killbots
0039 {
0040 ____class RenderPrivate
0041 ____{
0042 ____public:
0043 ________RenderPrivate()
0044 ________..:.m_svgRenderer(),
0045 ________....m_pixmapCache("killbots-cache"),
0046 ________....m_cursors(),
0047 ________....m_hasBeenLoaded( false )
0048 ________{};
0049 -------------------------------------------------------------------------------
0050 ____if ( m_rulesetChanged )
0051 ____{
0052 ________if ( ! m_engine->gameHasStarted() ||
0053 ________.....KMessageBox::questionYesNo( this,
0054 ________.................................i18n("A new ruleset has been selected, but there is already a game in progress."),
0055 ________.................................i18n("Rule Set Changed"),
0056 ________.................................KGuiItem( i18n("Continue Current Game") ),
0057 ________.................................KGuiItem( i18n("Start a New Game") )
0058 ________...............................) == KMessageBox::No
0059 ________...)
0060 ________{
0061 -------------------------------------------------------------------------------
0062
0063
0064 *******************************************************************************
0065 Braces
0066 *******************************************************************************
0067
0068 Opening and closing braces are always on a new line.
0069
0070 For loop or conditional statements, braces can be omitted if the block is a
0071 single-line statement and the conditional fits on a single line. If braces are
0072 used in one block of an if-elseif-else statement, they should be used in the
0073 other blocks even if those blocks are a single line.
0074
0075 Blocks never appear on the same line as the loop/conditional, even if braces
0076 aren't used.
0077
0078 Empty blocks are represented on a single line as '{}'
0079
0080 Examples:
0081 -------------------------------------------------------------------------------
0082 void Killbots::Engine::refreshSpriteMap()
0083 {
0084 m_spriteMap.clear();
0085 for (Sprite * bot : std::as_const(m_bots))
0086 m_spriteMap.insert( bot->gridPos(), bot );
0087 for (Sprite * junkheap : std::as_const(m_junkheaps))
0088 m_spriteMap.insert( junkheap->gridPos(), junkheap );
0089 }
0090 -------------------------------------------------------------------------------
0091 if ( m_rules->pushableJunkheaps() != Ruleset::None && cellIsValid( nextCell ) )
0092 {
0093 if ( spriteTypeAt( nextCell ) == NoSprite )
0094 return true;
0095 else if ( spriteTypeAt( nextCell ) == Junkheap )
0096 return m_rules->pushableJunkheaps() == Ruleset::Many && canPushJunkheap( m_spriteMap.value( nextCell ), direction );
0097 else
0098 return m_rules->squaskKillsEnabled();
0099 }
0100 else
0101 {
0102 return false;
0103 }
0104 -------------------------------------------------------------------------------
0105 while ( m_rulesetMap.contains( name ) )
0106 name += '_';
0107 -------------------------------------------------------------------------------
0108
0109 *******************************************************************************
0110 Whitespace
0111 *******************************************************************************
0112
0113 Lines should generally be kept to less than 100 characters, but don't make code
0114 uglier just to avoid width.
0115
0116 Two empty lines should be used to separate function definitions.
0117
0118 Within a block, empty lines may be used to break up unrelated lines, but never
0119 more than one.
0120
0121 No space appears between the function name and the opening bracket.
0122
0123 A single space appears between the loop/conditional statement name and the
0124 opening bracket.
0125
0126 Padding spaces appear inside of all parentheses, unless the parentheses are
0127 empty or contain only a string literal.
0128
0129 Binary operators are separated from their operands with a single space. Unary
0130 operators are not.
0131
0132 Pointer and reference symbols have a space on either side.
0133
0134 No padding spaces appear inside angle brackets when using template functions
0135 or classes.
0136
0137 No space appears between a label and the following colon.
0138
0139 No whitespace should appear inside Qt's SIGNAL and SLOT macros.
0140
0141
0142 *******************************************************************************
0143 Indentifiers
0144 *******************************************************************************
0145
0146 All identifiers should use camel case.
0147
0148 Classnames and namespaces begin with uppercase letters. All other identifiers
0149 begin with lowercase letters.
0150
0151 Class data members are prefixed with 'm_', unless they are public KConfigXT
0152 widgets, in which case, they are prefixed with 'kfcg_'.
0153
0154 Indentifiers should favour descriptiveness over brevity. Single letter
0155 variables are acceptable only for iterators or coordinates.
0156
0157 All indentifiers should use American English spelling. (Comments can be in your
0158 choice of English.)
0159
0160 Examples:
0161 -------------------------------------------------------------------------------
0162 namespace Killbots
0163 {
0164 class Ruleset;
0165
0166 class RulesetSelector : public QWidget
0167 {
0168 Q_OBJECT
0169
0170 public: // functions
0171 explicit RulesetSelector( QWidget * parent = 0 );
0172 virtual ~RulesetSelector();
0173
0174 public: // data members
0175 KLineEdit * kcfg_Ruleset;
0176
0177 private: // functions
0178 void findRulesets();
0179
0180 private Q_SLOTS:
0181 void selectionChanged( QString rulesetName );
0182
0183 private: // data members
0184 QListWidget * m_listWidget;
0185 QLabel * m_author;
0186 QLabel * m_authorContact;
0187 QLabel * m_description;
0188 QMap< QString, Ruleset * > m_rulesetMap;
0189 };
0190 }
0191 -------------------------------------------------------------------------------
0192
0193
0194 *******************************************************************************
0195 Comments
0196 *******************************************************************************
0197
0198 Feel free to comment as much as possible.
0199
0200 Comments should describe the purpose of logic or give background details not
0201 obvious from the code. Comments should not describe what the code is doing,
0202 unless the code is extremely dense (in which case the code should probably be
0203 rewritten/refactored anyway).
0204
0205 Comments appear on the line before the code it is commenting on.
0206
0207 Use '/**/' for comments longer than 3 lines.
0208
0209
0210 *******************************************************************************
0211 Class Definitions
0212 *******************************************************************************
0213
0214 Classes should be given simple names and placed inside the Killbots namespace
0215 instead of adding a prefix. (i.e. Killbots::MainWindow instead of
0216 KillbotsMainWindow)
0217
0218 No inline function definitions in the header, even if they are a single
0219 statement. Same goes for constructors.
0220
0221 Define destructors even if they're empty.
0222
0223 Class definitions should be layed out in the following order.
0224 public: // types
0225 public: // functions
0226 public Q_SLOTS:
0227 public: // data members
0228 Q_SIGNALS:
0229 protected: // types
0230 protected: // functions
0231 protected Q_SLOTS:
0232 protected: // data members
0233 private: // types
0234 private: // functions
0235 private Q_SLOTS:
0236 private: // data members
0237
0238
0239 *******************************************************************************
0240 Includes
0241 *******************************************************************************
0242
0243 Include guards are of the form NAMESPACE_CLASSNAME_H.
0244
0245 Group includes in the following order with blank lines in between:
0246 File's own header
0247 Killbots headers
0248 KDE headers
0249 Qt headers
0250
0251 Inside of groups, sort includes alphabetically.
0252
0253 Use the "new" style includes with directory names where appropriate
0254
0255 Forward declare whenever possible in headers.
0256
0257 moc includes appear at the bottom of the source file.
0258
0259 Examples:
0260 -------------------------------------------------------------------------------
0261 #ifndef KILLBOTS_RULESETSELECTOR_H
0262 #define KILLBOTS_RULESETSELECTOR_H
0263
0264 class KLineEdit;
0265
0266 #include <QtCore/QMap>
0267 class QLabel;
0268 class QListWidget;
0269 #include <QWidget>
0270
0271 namespace Killbots
0272 {
0273 class Ruleset;
0274 -------------------------------------------------------------------------------
0275 #include "rulesetselector.h"
0276
0277 #include "ruleset.h"
0278 #include "settings.h"
0279
0280 #include <KDE/KDebug>
0281 #include <KDE/KDialog>
0282 #include <KDE/KLineEdit>
0283 #include <KDE/KLocalizedString>
0284 #include <KDE/KStandardDirs>
0285
0286 #include <QLabel>
0287 #include <QListWidget>
0288 -------------------------------------------------------------------------------
0289
0290
0291 *******************************************************************************
0292 Miscellaneous
0293 *******************************************************************************
0294
0295 It is generally preferred that functions have a single return statement, but
0296 multiple returns statements are exceptable if a single return would make the
0297 code more complicated.
0298
0299 Use the "Q_UNUSED" macro on unused function parameters.
0300
0301 Use "static_cast<>" instead of the C or C++ style type casts when casting
0302 pointers.
0303
0304 When converting one type to another use C++ or constructor style casts. For
0305 example, use "int()" to convert floating types to integers.
0306
0307 Make sure code passes all the English Breakfast Network checks.