diff --git a/doc/codingStyleGuide.org b/doc/codingStyleGuide.org index 7a1175adc02e67e086741ed4d1a0a29a4b0f715b..5dbc9344224f86c3ddc5c30ebf10f3052023de32 100644 --- a/doc/codingStyleGuide.org +++ b/doc/codingStyleGuide.org @@ -24,23 +24,23 @@ + stream output + =<<= is always four characters after the start of the stream, so that the =<<= symbols align, i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC c++ Info<< ... os << ... - #+END_EXAMPLE + #+END_SRC so - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ WarningIn("className::functionName()") << "Warning message" - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ WarningIn("className::functionName()") << "Warning message" - #+END_EXAMPLE + #+END_SRC + no unnecessary class section headers, i.e. remove -#+BEGIN_EXAMPLE +#+BEGIN_SRC C++ // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // // Check @@ -48,37 +48,96 @@ // Edit // Write -#+END_EXAMPLE +#+END_SRC if they contain nothing, even if planned for 'future use' + class titles are centred -#+BEGIN_EXAMPLE +#+BEGIN_SRC C++ /*---------------------------------------------------------------------------*\ Class exampleClass Declaration \*---------------------------------------------------------------------------*/ -#+END_EXAMPLE +#+END_SRC - NOT + *not* -#+BEGIN_EXAMPLE +#+BEGIN_SRC C++ /*---------------------------------------------------------------------------*\ Class exampleClass Declaration \*---------------------------------------------------------------------------*/ -#+END_EXAMPLE +#+END_SRC *** The /.H/ Files + header file spacing + Leave two empty lines between sections (as per functions in the /.C/ file etc) - + use =//- Comment= comments in header file - + add descriptions to class data and functions + + use =//- Comment= comments in header file to add descriptions to class + data and functions do be included in the Doxygen documentation: + + text on the line starting with =//-= becomes the Doxygen brief + description; + + text on subsequent lines becomes the Doxygen detailed description /e.g./ + #+BEGIN_SRC C++ + //- A function which returns a thing + // This is a detailed description of the function + // which processes stuff and returns other stuff + // depending on things. + thing function(stuff1, stuff2); + #+END_SRC + + list entries start with =-= or =-#= for numbered lists but cannot start + on the line immediately below the brief description so + #+BEGIN_SRC C++ + //- Compare triFaces + // Returns: + // - 0: different + // - +1: identical + // - -1: same face, but different orientation + static inline int compare(const triFace&, const triFace&); + #+END_SRC + or + #+BEGIN_SRC C++ + //- Compare triFaces returning 0, +1 or -1 + // + // - 0: different + // - +1: identical + // - -1: same face, but different orientation + static inline int compare(const triFace&, const triFace&); + #+END_SRC + *not* + #+BEGIN_SRC C++ + //- Compare triFaces returning 0, +1 or -1 + // - 0: different + // - +1: identical + // - -1: same face, but different orientation + static inline int compare(const triFace&, const triFace&); + #+END_SRC + + list can be nested for example + #+BEGIN_SRC C++ + //- Search for \em name + // in the following hierarchy: + // -# personal settings: + // - ~/.OpenFOAM/\<VERSION\>/ + // <em>for version-specific files</em> + // - ~/.OpenFOAM/ + // <em>for version-independent files</em> + // -# site-wide settings: + // - $WM_PROJECT_INST_DIR/site/\<VERSION\> + // <em>for version-specific files</em> + // - $WM_PROJECT_INST_DIR/site/ + // <em>for version-independent files</em> + // -# shipped settings: + // - $WM_PROJECT_DIR/etc/ + // + // \return the full path name or fileName() if the name cannot be found + // Optionally abort if the file cannot be found + fileName findEtcFile(const fileName&, bool mandatory=false); + #+END_SRC + + for more details see the Doxygen documentation. + destructor + If adding a comment to the destructor - use =//-= and code as a normal function: - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ //- Destructor ~className(); - #+END_EXAMPLE + #+END_SRC + inline functions + Use inline functions where appropriate in a separate /classNameI.H/ file. Avoid cluttering the header file with function bodies. @@ -86,23 +145,23 @@ *** The /.C/ Files + Do not open/close namespaces in a /.C/ file + Fully scope the function name, i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ Foam::returnType Foam::className::functionName() - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ namespace Foam { ... returnType className::functionName() ... } - #+END_EXAMPLE + #+END_SRC EXCEPTION When there are multiple levels of namespace, they may be used in the /.C/ file, i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ namespace Foam { namespace compressible @@ -113,7 +172,7 @@ } // End namespace RASModels } // End namespace compressible } // End namespace Foam - #+END_EXAMPLE + #+END_SRC + Use two empty lines between functions @@ -123,25 +182,25 @@ + const + Use everywhere it is applicable. + variable initialisation using - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ const className& variableName = otherClass.data(); - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ const className& variableName(otherClass.data()); - #+END_EXAMPLE + #+END_SRC + virtual functions + If a class is virtual, make all derived classes virtual. *** Conditional Statements - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ if (condition) { code; } - #+END_EXAMPLE + #+END_SRC OR - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ if ( long condition @@ -149,24 +208,24 @@ { code; } - #+END_EXAMPLE - NOT (no space between =if= and =(= used) - #+BEGIN_EXAMPLE + #+END_SRC + *not* (no space between =if= and =(= used) + #+BEGIN_SRC C++ if(condition) { code; } - #+END_EXAMPLE + #+END_SRC *** =for= and =while= Loops - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ for (i = 0; i < maxI; i++) { code; } - #+END_EXAMPLE + #+END_SRC OR - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ for ( i = 0; @@ -176,26 +235,26 @@ { code; } - #+END_EXAMPLE - NOT this (no space between =for= and =(= used) - #+BEGIN_EXAMPLE + #+END_SRC + *not* this (no space between =for= and =(= used) + #+BEGIN_SRC C++ for(i = 0; i < maxI; i++) { code; } - #+END_EXAMPLE + #+END_SRC Note that when indexing through iterators, it is often slightly more efficient to use the pre-increment form. Eg, =++iter= instead of =iter++= *** =forAll=, =forAllIter=, =forAllConstIter=, etc. loops like =for= loops, but - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ forAll( - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ forAll ( - #+END_EXAMPLE + #+END_SRC Using the =forAllIter= and =forAllConstIter= macros is generally advantageous - less typing, easier to find later. However, since they are macros, they will fail if the iterated object contains @@ -203,9 +262,9 @@ The following will FAIL!: - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ forAllIter(HashTable<labelPair, edge, Hash<edge> >, foo, iter) - #+END_EXAMPLE + #+END_SRC These convenience macros are also generally avoided in other container classes and OpenFOAM primitive classes. @@ -214,106 +273,106 @@ + split initially after the function return type and left align + do not put =const= onto its own line - use a split to keep it with the function name and arguments. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_EXAMPLE - NOR - #+BEGIN_EXAMPLE + #+END_SRC + *nor* + #+BEGIN_SRC C++ const Foam::longReturnTypeName& Foam::longClassName::longFunctionName const - #+END_EXAMPLE - NOR - #+BEGIN_EXAMPLE + #+END_SRC + *nor* + #+BEGIN_SRC C++ const Foam::longReturnTypeName& Foam::longClassName:: longFunctionName const - #+END_EXAMPLE + #+END_SRC + if it needs to be split again, split at the function name (leaving behind the preceding scoping =::=s), and again, left align, i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ const Foam::longReturnTypeName& Foam::veryveryveryverylongClassName:: veryveryveryverylongFunctionName const - #+END_EXAMPLE + #+END_SRC ***** Splitting long lines at an "=" Indent after split - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ variableName = longClassName.longFunctionName(longArgument); - #+END_EXAMPLE + #+END_SRC OR (where necessary) - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ variableName = longClassName.longFunctionName ( longArgument1, longArgument2 ); - #+END_EXAMPLE - NOT - #+BEGIN_EXAMPLE + #+END_SRC + *not* + #+BEGIN_SRC C++ variableName = longClassName.longFunctionName(longArgument); - #+END_EXAMPLE - NOR - #+BEGIN_EXAMPLE + #+END_SRC + *nor* + #+BEGIN_SRC C++ variableName = longClassName.longFunctionName ( longArgument1, longArgument2 ); - #+END_EXAMPLE + #+END_SRC *** Maths and Logic + operator spacing - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ a + b, a - b a*b, a/b a & b, a ^ b a = b, a != b a < b, a > b, a >= b, a <= b a || b, a && b - #+END_EXAMPLE + #+END_SRC + splitting formulae over several lines Split and indent as per "splitting long lines at an =" with the operator on the lower line. Align operator so that first variable, function or bracket on the next line is 4 spaces indented i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ variableName = a*(a + b) *exp(c/d) *(k + t); - #+END_EXAMPLE + #+END_SRC This is sometimes more legible when surrounded by extra parentheses: - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ variableName = ( a*(a + b) *exp(c/d) *(k + t) ); - #+END_EXAMPLE + #+END_SRC + splitting logical tests over several lines outdent the operator so that the next variable to test is aligned with the four space indentation, i.e. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ if ( a == true && b == c ) - #+END_EXAMPLE + #+END_SRC ** Documentation *** General @@ -331,7 +390,7 @@ description. For example, - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ Class Foam::myClass @@ -340,7 +399,7 @@ The class is implemented as a set of recommendations that may sometimes be useful. - #+END_EXAMPLE + #+END_SRC + The class name must be qualified by its namespace, otherwise Doxygen will think you are documenting some other class. @@ -348,33 +407,33 @@ + If you don't have anything to say about the class (at the moment), use the namespace-qualified class name for the description. This aids with finding these under-documented classes later. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ Class Foam::myUnderDocumentedClass Description Foam::myUnderDocumentedClass - #+END_EXAMPLE + #+END_SRC + Use 'Class' and 'Namespace' tags in the header files. The Description block then applies to documenting the class. + Use 'InClass' and 'InNamespace' in the source files. The Description block then applies to documenting the file itself. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ InClass Foam::myClass Description Implements the read and writing of files. - #+END_EXAMPLE + #+END_SRC *** Doxygen Special Commands Doxygen has a large number of special commands with a =\= prefix. Since the filtering removes the leading spaces within the blocks, the Doxygen commmands can be inserted within the block without problems. - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ InClass Foam::myClass @@ -398,7 +457,7 @@ ... // some operation } \endcode - #+END_EXAMPLE + #+END_SRC *** HTML Special Commands Since Doxygen also handles HTML tags to a certain extent, the angle @@ -418,16 +477,16 @@ + If the namespaces is used to hold sub-models, the namespace can be documented in the same file as the class with the model selector. eg, - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ documented namespace 'Foam::functionEntries' within the class 'Foam::functionEntry' - #+END_EXAMPLE + #+END_SRC + If nothing else helps, find some sensible header. eg, - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ namespace 'Foam' is documented in the foamVersion.H file - #+END_EXAMPLE + #+END_SRC *** Documenting typedefs and classes defined via macros ... not yet properly resolved @@ -456,9 +515,9 @@ used as a variable or class method name, it is probably better to use '-ize', which is considered the main form by the Oxford University Press. Eg, - #+BEGIN_EXAMPLE + #+BEGIN_SRC C++ myClass.initialize() - #+END_EXAMPLE + #+END_SRC The word "its" (possesive) vs. "it's" (colloquial for "it is" or "it has") seems to confuse non-native (and some native) English speakers.