/**

    @page doc_code_style_guide Code Style Guide

    @tableofcontents

    This page describes the code style guide for LibrePCB developers.


    @section doc_code_style_guide_general General
    
        - Qt >= 5.2
        - C++11
        - Use strongly typed enums ("enum class", C++11) whenever reasonable
        - Use "nullptr" instead of "NULL" or "0"
        - Use keywords like "const", "constexpr", "final", ... whenever possible
        - Use exception specifier in method declarations:
            @code
            void foo() noexcept;            // this method never throws exceptions
            void bar() throw (Exception);   // this method can throw exceptions of type "Exception" (or any subclass of it)
            @endcode
    
    
    @section doc_code_style_guide_header_files Header Files
    
        - Use nearly always forward declarations when possible. Includes in header files are allowed:
            - for all Qt header files (like QtCore, QtWidgets,...)
            - when the header file uses other types by value (by reference/pointer --> use forward declaration)
            - when the header file highly depends on other types, even if only by reference/pointer
        
    
    @section doc_code_style_guide_naming Naming
    
        - File Names: Excatly same naming as classes, but all characters lowercase. Example: ses_select.cpp, ses_select.h
        - Include guards: Use the namespace as prefix before the class name. Example: @code #ifndef NAMESPACE_CLASSNAME_H @endcode
        - Namespaces: lowercase (with underline as separator if needed)
        - Classes: UpperCamelCase (for common prefixes, use the underline as separator. Example: project#SES_Select)
        - Interfaces: Like Classes, but with prefix "IF_". Example: #IF_GraphicsViewEventHandler)
        - Typedefs (POD, structs, enums): UpperCamelCase, with "_t" suffix. Examples: #LengthBase_t, LengthUnit#LengthUnit_t
        - Functions/Methods: lowerCamelCase
        - Member Variables: lowerCamelCase, beginning with a 'm'. Example: LengthUnit#mUnit
        - Static Variables: lowerCamelCase, beginning with a 's'. Example: sSomeStaticVariable
        - Function Parameters: lowerCamelCase
        - Local Variables: lowerCamelCase
        - Macros: uppercase, with underline as separator
        
    
    @section doc_code_style_guide_comments Comments
    
        - Use doxygen comments with '@' (not '\') as command character
        - Methods documentation only in header files, not in source files
        
    @section doc_code_style_guide_types Types
    
        - If you need integer types with fixed width, us Qt's typedefs (for example "qint32") instead of the types from <stdint.h> (for example "int32_t").
        - For floating point numbers, use Qt's typedef "qreal" instead of "float" or "double" whenever possible. This way, the application will work also on ARM platforms with single precision FPU quite well.
        
        
    @section doc_code_style_guide_qt_qobject QObject
    
        - Inherit from QObject only when needed (for example if you only need QObject::tr(), see note to @c Q_DECLARE_TR_FUNCTIONS() in @ref doc_code_style_guide_qt_macros)
        - Try to avoid using QObject::connect() with Qt's @c SIGNAL() and @c SLOT() macros. Use function addresses instead (whenever possible). This way, signals and slots are checked on compile-time instead of runtime.
            @code
            connect(&myTimer, SIGNAL(timeout()), this, SLOT(mySlot()));     // uses runtime check --> avoid this!
            connect(&myTimer, &QTimer::timeout, this, &MyClass::anyMethod); // uses compile-time check (and any method can be used as slots!) --> much better!
            connect(&mAutoSaveTimer, &QTimer::timeout, [this](){doSomething();});   // Using C++11 lambda functions as slots is also possible 
                                                                                    // --> can be very useful, but use it carefully (dangling pointers, ...)
            @endcode
        
    
    @section doc_code_style_guide_qt_macros Qt Macros
    
        - Do not use @c Q_CHECK_PTR() because it throws a std::bad_alloc exception which we will never catch (we only catch our own exception types). Use @c Q_ASSERT() instead.
        - The macro @c Q_DECLARE_TR_FUNCTIONS() is very useful to use the translation method QObject::tr() (resp. tr()) also in classes which do not inherit from QObject (but do NOT use this macro in interface classes because of possible multiple inheritance --> use QCoreApplication::translate() instead in this case). See http://doc.qt.io/qt-5/qcoreapplication.html#Q_DECLARE_TR_FUNCTIONS

*/
