# # https://clang.llvm.org/docs/ClangFormatStyleOptions.html
# # https://clang-format-configurator.site

IndentWidth: 4
TabWidth: 4
UseTab: Never
ColumnLimit: 80

AlignAfterOpenBracket: AlwaysBreak # Align, DontAlign, AlwaysBreak, BlockIndent
AlignArrayOfStructures: Right # Left, Right
AlignConsecutiveAssignments:
    Enabled: true
    AcrossEmptyLines: false
    AcrossComments: true
    AlignCompound: true
    PadOperators: true
AlignConsecutiveBitFields:
    Enabled: true
    AcrossEmptyLines: false
    AcrossComments: true
    AlignCompound: true
    PadOperators: true
AlignConsecutiveDeclarations: None
AlignConsecutiveMacros:
    Enabled: true
    AcrossEmptyLines: false
    AcrossComments: true
    AlignCompound: true
    PadOperators: true
AlignEscapedNewlines: Right # DontAlign, Left, Right

AllowShortCaseLabelsOnASingleLine: true
AlignConsecutiveShortCaseStatements: # AllowShortCaseLabelsOnASingleLine: true
    Enabled: false

BreakBeforeBinaryOperators: true
AlignOperands: AlignAfterOperator # Align, AlignAfterOperator

AlignTrailingComments:
    Kind: Always # Leave, Always, Never
    OverEmptyLines: 1

AllowShortBlocksOnASingleLine: Never # Never, Empty, Always
AllowShortEnumsOnASingleLine: false
AllowShortFunctionsOnASingleLine: None # None, InlineOnly, Empty, Inline, All
AllowShortIfStatementsOnASingleLine: Never # Never, WithoutElse, OnlyFirstIf, AllIfsAndElse
AllowShortLambdasOnASingleLine: None # None, Empty, Inline, All
AllowShortLoopsOnASingleLine: false
AlwaysBreakAfterReturnType: All # None, All, TopLevel, AllDefinitions, TopLevelDefinitions
AlwaysBreakBeforeMultilineStrings: false
AlwaysBreakTemplateDeclarations: Yes # No, MultiLine, Yes

# AttributeMacros # TODO

AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
BinPackArguments: false
BinPackParameters: false

BitFieldColonSpacing: Both # Both, None, Before, After

BreakBeforeBraces: Custom
BraceWrapping:
    AfterCaseLabel: false
    AfterClass: true
    AfterControlStatement: MultiLine # Never, MultiLine, Always
    AfterEnum: true
    AfterFunction: true
    AfterNamespace: false
    AfterStruct: true
    AfterUnion: true
    AfterExternBlock: false
    BeforeCatch: true
    BeforeElse: true
    BeforeLambdaBody: false
    BeforeWhile: false
    IndentBraces: false
    SplitEmptyFunction: true
    SplitEmptyRecord: true
    SplitEmptyNamespace: true

# BracedInitializerIndentWidth: 4
BreakAfterAttributes: Always # Always, Leave, Never
# BreakBeforeBinaryOperators # TODO
# BreakBeforeConceptDeclarations # TODO
# BreakBeforeInlineASMColon # TODO
BreakBeforeTernaryOperators: true

ConstructorInitializerIndentWidth: 2
BreakConstructorInitializers: BeforeComma # BeforeColon, BeforeComma, AfterColon
BreakInheritanceList: BeforeComma # BeforeColon, BeforeComma, AfterColon, AfterComma

BreakStringLiterals: true
# ColumnLimit # TODO
# CommentPragmas # TODO
CompactNamespaces: false
# ContinuationIndentWidth: 4
Cpp11BracedListStyle: false
DerivePointerAlignment: false
# DisableFormat: false
EmptyLineAfterAccessModifier: Never # Never, Leave, Always
EmptyLineBeforeAccessModifier: Always # Never, Leave, LogicalBlock, Always
ExperimentalAutoDetectBinPacking: false
FixNamespaceComments: true
# ForEachMacros:
# IfMacros:
IncludeBlocks: Preserve # Preserve, Merge, Regroup
# IncludeCategories: # TODO
# IncludeIsMainRegex
# IncludeIsMainSourceRegex

AccessModifierOffset: -2
IndentAccessModifiers: false
IndentCaseBlocks: false
IndentCaseLabels: true
IndentExternBlock: NoIndent # AfterExternBlock, NoIndent, Indent
IndentGotoLabels: false
IndentPPDirectives: None # None, AfterHash, BeforeHash
IndentRequiresClause: true # C++
# IndentWrappedFunctionNames: false
InsertBraces: true
InsertNewlineAtEOF: true
# InsertTrailingCommas: #TODO

# works only for C++14 and C23
# IntegerLiteralSeparator:
#     Binary: 4
#     Decimal: 3
#     Hex: 2
IntegerLiteralSeparator:
    Binary: -1
    Decimal: -1
    Hex: -1

KeepEmptyLinesAtEOF: false
KeepEmptyLinesAtTheStartOfBlocks: false
LambdaBodyIndentation: Signature # Signature, OuterScope
# LineEnding:
# MacroBlockBegin:
# MacroBlockEnd:
# Macros:
MaxEmptyLinesToKeep: 1
NamespaceIndentation: None # None, Inner, All
# NamespaceMacros:
PPIndentWidth: -1
PackConstructorInitializers: Never # Never, BinPack, CurrentLine, NextLine, NextLineOnly
# PenaltyBreakAssignment:
# PenaltyBreakBeforeFirstCallParameter:
# PenaltyBreakComment
# PenaltyBreakFirstLessLess
# PenaltyBreakOpenParenthesis
# PenaltyBreakString
# PenaltyBreakTemplateDeclaration
# PenaltyExcessCharacter
# PenaltyIndentedWhitespace
# PenaltyReturnTypeOnItsOwnLine
PointerAlignment: Left
QualifierAlignment: Left
# QualifierOrder: TODO
# RawStringFormats:
ReferenceAlignment: Left
ReflowComments: true
RemoveBracesLLVM: false
RemoveParentheses: ReturnStatement
RemoveSemicolon: true
# RequiresClausePositionStyle: # TODO, C++
# RequiresExpressionIndentation: # TODO, C++
SeparateDefinitionBlocks: Always
# ShortNamespaceLines: 1
SortIncludes: CaseSensitive
SortUsingDeclarations: LexicographicNumeric
SpaceAfterCStyleCast: false
SpaceAfterLogicalNot: false
SpaceAfterTemplateKeyword: true
SpaceAroundPointerQualifiers: Default
SpaceBeforeAssignmentOperators: true
SpaceBeforeCaseColon: false
SpaceBeforeCpp11BracedList: false
SpaceBeforeCtorInitializerColon: true
SpaceBeforeInheritanceColon: true
SpaceBeforeParens: ControlStatements
SpaceBeforeRangeBasedForLoopColon: true
SpaceBeforeSquareBrackets: false
SpaceInEmptyBlock: false
SpacesBeforeTrailingComments: 2
SpacesInAngles: Never
SpacesInContainerLiterals: false
SpacesInLineCommentPrefix:
    Minimum: 1
    Maximum: -1
SpacesInParens: Never
# SpacesInParensOptions:
SpacesInSquareBrackets: false
# StatementAttributeLikeMacros:
# StatementMacros:
# TypeNames:
# TypenameMacros:
# WhitespaceSensitiveMacros:
