############################################################################
#    Copyright (C) 2014 by Ahmed Charles - acharles@outlook.com            #
#                                                                          #
#    Copying and distribution of this file, with or without modification,  #
#    are permitted in any medium without royalty provided the copyright    #
#    notice and this notice are preserved.  This file is offered as-is,    #
#    without any warranty.                                                 #
############################################################################

# For more information on clang-format:
# http://clang.llvm.org/docs/ClangFormat.html

BasedOnStyle: LLVM

# language
Language: Cpp
Standard: Cpp11
DisableFormat: false

# line length
ColumnLimit: 200 # revisit when tuning.

# indentation
IndentWidth: 4
UseTab: Never
TabWidth: 8
AccessModifierOffset: -4
ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 8
IndentCaseLabels: false
IndentWrappedFunctionNames: false
NamespaceIndentation: None

# line breaks
AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: true
BraceWrapping:
  AfterClass: true
  AfterControlStatement: false
  AfterEnum: false
  AfterFunction: true
  AfterNamespace: false
  AfterStruct: true
  AfterUnion: false
  BeforeCatch: false
  BeforeElse: false
  IndentBraces: false
BreakBeforeBinaryOperators: NonAssignment
BreakBeforeBraces: Custom
BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true
# BreakStringLiterals: true
ConstructorInitializerAllOnOneLineOrOnePerLine: true
KeepEmptyLinesAtTheStartOfBlocks: false
MaxEmptyLinesToKeep: 2

# spaces
SpaceAfterCStyleCast: false
# SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: false
SpacesInCStyleCastParentheses: false
SpacesInParentheses: false
SpacesInSquareBrackets: false

# parameters/arguments
AllowAllParametersOfDeclarationOnNextLine: true
BinPackArguments: false
BinPackParameters: false

# pointers
DerivePointerAlignment: false
PointerAlignment: Left

# braces
Cpp11BracedListStyle: true

# single line statements
AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: Inline
AllowShortIfStatementsOnASingleLine: false
AllowShortLoopsOnASingleLine: false

# alignment
AlignAfterOpenBracket: Align
AlignConsecutiveAssignments: false
AlignConsecutiveDeclarations: false
AlignEscapedNewlinesLeft: false
AlignOperands: true
AlignTrailingComments: true

# penalties (revisit)
PenaltyBreakBeforeFirstCallParameter: 19
PenaltyBreakComment: 300
PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60

# includes
IncludeCategories:
  - Regex: '^"post_guard.h"$'
    Priority: 7
  - Regex: '^"pre_guard.h"$'
    Priority: 2
  - Regex: '^"ui_.*'
    Priority: 3
  - Regex: '^<Qt.*'
    Priority: 4
  - Regex: '^<Q.*'
    Priority: 5
  - Regex: '^<boost/.*'
    Priority: 6
  - Regex: '^<'
    Priority: 8
  - Regex: '^"'
    Priority: 1
# IncludeIsMainRegex: '$'
SortIncludes: true

# macros
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
MacroBlockBegin: ''
MacroBlockEnd:   ''

# comments
CommentPragmas: ''
ReflowComments: false # revisit
