BasedOnStyle: Google

AccessModifierOffset: -2

# alignment
AlignAfterOpenBracket: AlwaysBreak
AlignConsecutiveAssignments: 'false'
AlignConsecutiveDeclarations: 'false'
AlignEscapedNewlines: Left
AlignOperands: AlignAfterOperator
AlignTrailingComments: 'true'

# inlining
AllowAllArgumentsOnNextLine: 'true'
AllowShortBlocksOnASingleLine: 'false'
AllowShortCaseLabelsOnASingleLine: 'false'
AllowShortFunctionsOnASingleLine: 'Inline'
AllowShortIfStatementsOnASingleLine: 'false'
AllowShortLoopsOnASingleLine: 'false'
RequiresClausePosition: 'OwnLine'

# breaking
AlwaysBreakAfterReturnType: None
AlwaysBreakTemplateDeclarations: Yes
BreakBeforeBinaryOperators: None
BreakBeforeBraces: Custom
BreakBeforeConceptDeclarations: 'Always'
BreakBeforeTernaryOperators: 'true'
BreakConstructorInitializers: AfterColon
PenaltyBreakString: '3'

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

ColumnLimit: 125
CompactNamespaces: 'true'
ConstructorInitializerIndentWidth: 8
ContinuationIndentWidth: 8
Cpp11BracedListStyle: 'true'
IndentWidth: 4
KeepEmptyLinesAtTheStartOfBlocks: 'true'
NamespaceIndentation: All
QualifierAlignment: Left
RemoveSemicolon: true

#includes
SortIncludes: CaseInsensitive
IncludeBlocks: Regroup
IncludeCategories:
  - Regex: '".+\.h'
    Priority: 2
  - Regex: '^<(oxenc|oxen)'
    Priority: 3
  - Regex: '^<(event2|ngtcp2)'
    Priority: 4
  - Regex: '<winsock2\.h>'
    Priority: 5
  - Regex: '<windows\.h>'
    Priority: 6
  - Regex: '^<CLI'
    Priority: 7
  - Regex: '^<catch2'
    Priority: 8
  - Regex: '^<.*\.h(pp)?>$'
    Priority: 9
  - Regex: '(<)(.)+(>)'
    Priority: 10

# spacing
SpaceBeforeParens: ControlStatements
SpacesInAngles: 'false'
SpacesInContainerLiterals: 'false'
SpacesInParentheses: 'false'
SpacesInSquareBrackets: 'false'

Standard: c++20

UseTab: Never

# treat pointers and reference declarations as if part of the type
DerivePointerAlignment: false
PointerAlignment: Left

# when wrapping function calls/declarations, force each parameter to have its own line
BinPackParameters: 'false'
BinPackArguments: 'false'
