#
# The clang-format (Clang 16) style file used by PRISMS-PF
#

AccessModifierOffset: -2

AlignAfterOpenBracket: Align
AlignArrayOfStructures: Left
AlignConsecutiveAssignments: true
AlignConsecutiveDeclarations: true
AlignEscapedNewlines: Left
AlignOperands: true
AlignTrailingComments: true

AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortBlocksOnASingleLine: Never
AllowShortCaseLabelsOnASingleLine: false
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None
AllowShortIfStatementsOnASingleLine: Never
AllowShortLambdasOnASingleLine: None
AllowShortLoopsOnASingleLine: false

AlwaysBreakAfterReturnType: All
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes

BinPackArguments: false
BinPackParameters: false

BraceWrapping:
  AfterCaseLabel: true
  AfterClass: true
  AfterControlStatement: Always
  AfterEnum: true
  AfterExternBlock: true
  AfterFunction: true
  AfterNamespace: true
  AfterStruct: true
  AfterUnion: true
  BeforeCatch: true
  BeforeElse: true
  BeforeLambdaBody: true
  BeforeWhile: true
  IndentBraces: true
  SplitEmptyFunction: false
  SplitEmptyRecord: false
  SplitEmptyNamespace: false

BreakAfterAttributes: Never
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: Always
BreakBeforeTernaryOperators: true
BreakConstructorInitializers: BeforeComma
BreakInheritanceList: BeforeComma
BreakStringLiterals: true

ColumnLimit: 90

CompactNamespaces: false

ConstructorInitializerIndentWidth: 2

ContinuationIndentWidth: 2

Cpp11BracedListStyle: true

DerivePointerAlignment: false

EmptyLineAfterAccessModifier: Never
EmptyLineBeforeAccessModifier: Always

FixNamespaceComments: true

IncludeBlocks:   Regroup
IncludeCategories:
  # custom_pde.h in main.cc must always be first
  - Regex:    '"custom_pde.h"'
    Priority:       -1
  # deal.II headers:
  - Regex:    '<deal.II.*>'
    Priority:       1
  # boost headers:
  - Regex:    '<boost.*>'
    Priority:       9
  # prismspf core headers:
  - Regex:    '<prismspf/core.*>'
    Priority:       10
  # prismspf user input headers:
  - Regex:    '<prismspf/user_inputs.*>'
    Priority:       11
  # prismspf solver headers:
  - Regex:    '<prismspf/solvers.*>'
    Priority:       12
  # prismspf utilities headers:
  - Regex:    '<prismspf/utilities.*>'
    Priority:       13
  # prismspf headers:
  - Regex:    '<prismspf.*>'
    Priority:       14
  # all standard <...> headers
  - Regex:    '<[-\w\/-_]+[\.\/]*[-\w\/-_]+>>'
    Priority:       99       
  # all local "..." headers
  - Regex:    '"[-\w\/-_]+[\.\/]*[-\w\/-_]+"'
    Priority:       999

IndentAccessModifiers: false
IndentCaseLabels: true
IndentGotoLabels : true
IndentPPDirectives: AfterHash
IndentRequiresClause: false
IndentWidth: 2
IndentWrappedFunctionNames: false

KeepEmptyLinesAtTheStartOfBlocks: false

Language: Cpp

MaxEmptyLinesToKeep: 1

NamespaceIndentation: All

PenaltyBreakBeforeFirstCallParameter: 90
PenaltyBreakComment: 90

PointerAlignment: Right

QualifierAlignment: Left

ReferenceAlignment: Right

ReflowComments: true

RequiresClausePosition: OwnLine

SeparateDefinitionBlocks: Always

SortIncludes: CaseSensitive
SortUsingDeclarations: true

SpaceAfterCStyleCast: true
SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeSquareBrackets: false
SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1
SpacesInAngles: Never
SpacesInContainerLiterals: false
SpacesInCStyleCastParentheses: false
SpacesInLineCommentPrefix:
  Minimum: 1
  Maximum: 1
SpacesInParentheses: false
SpacesInSquareBrackets: false

Standard: c++20

TabWidth: 2

UseTab: Never