# version 0.0.1
# depends: clang-format --version >=10

# 注释命令为clang10暂不兼容命令，可以更新到13版本使用
---
# 关闭格式化
DisableFormat:	false
# 语言: None, Cpp, Java, JavaScript, ObjC, Proto, TableGen, TextProto
Language: Cpp
# 标准: Cpp03, Cpp11, Auto
Standard: c++11
# 访问说明符(public、private等)的偏移
AccessModifierOffset:   -4
# 缩进宽度
IndentWidth: 4
# tab宽度
TabWidth: 4
# 使用tab字符: Never, ForIndentation, ForContinuationAndIndentation, Always
UseTab:	Never
# 构造函数的初始化列表的缩进宽度
ConstructorInitializerIndentWidth: 4
# 延续的行的缩进宽度
ContinuationIndentWidth: 4
# 每行字符的限制，0表示没有限制
ColumnLimit: 120
# 允许短的if语句保持在同一行
AllowShortIfStatementsOnASingleLine: Never
# 允许短的函数放在同一行: None, InlineOnly(定义在类中), Empty(空函数), Inline(定义在类中，空函数), All
AllowShortFunctionsOnASingleLine:	Empty
# 允许短的块放在同一行
AllowShortBlocksOnASingleLine: Empty
# 允许短的循环保持在同一行
AllowShortLoopsOnASingleLine:	false
# 允许短的lambda语句保持在同一行
AllowShortLambdasOnASingleLine: Empty

# 大括号换行原则：
# 只有函数定义 namespace定义 class定义 struct定义 union定义 extern定义后换行，其余情况均不换行
# 大括号换行，只有当BreakBeforeBraces设置为Custom时才有效
BraceWrapping:
  # case后面
  AfterCaseLabel: false
  # class定义后面
  AfterClass: true	
  ## 控制语句后面
  AfterControlStatement: Never
  # enum定义后面
  AfterEnum: false
  # 函数定义后面
  AfterFunction: true
  # 命名空间定义后面
  AfterNamespace:	true
  # struct定义后面
  AfterStruct: true
  # union定义后面
  AfterUnion: true
  # extern定义后面
  AfterExternBlock: true
  # catch之前
  BeforeCatch: false
  # else之前
  BeforeElse: false
  # lambda之前
  #seBeforeLambdaBody: false
  # while之前
  #BeforeWhile: false
  # 缩进大括号
  IndentBraces:	false
  # 数据类型为空时大括号换行
  SplitEmptyRecord: false
  # namespace为空时大括号换行
  SplitEmptyNamespace: false

#   在大括号前换行: Attach(始终将大括号附加到周围的上下文), Linux(除函数、命名空间和类定义，与Attach类似),
#   Mozilla(除枚举、函数、记录定义，与Attach类似), Stroustrup(除函数定义、catch、else，与Attach类似),
#   Allman(总是在大括号前换行), GNU(总是在大括号前换行，并对于控制语句的大括号增加额外的缩进), WebKit(在函数前换行), Custom
#   注：这里认为语句块也属于函数
BreakBeforeBraces: Custom

## 水平对齐二元和三元表达式的操作数
#AlignOperands: Align

## 允许函数调用的所有参数在放在下一行
AllowAllArgumentsOnNextLine: false
## 允许函数声明的所有参数在放在下一行
AllowAllParametersOfDeclarationOnNextLine: false

# 允许短的case标签放在同一行
AllowShortCaseLabelsOnASingleLine: false
# 允许短的enum放在同一行
#AllowShortEnumsOnASingleLine: false

## 在二元运算符前换行: None(在操作符后换行), NonAssignment(在非赋值的操作符前换行), All(在操作符前换行)
BreakBeforeBinaryOperators:	NonAssignment

# 在三元运算符前换行
BreakBeforeTernaryOperators: true


# 去除C++11的列表初始化的大括号{后和}前的空格
Cpp11BracedListStyle:	true

# 继承最常用的指针和引用的对齐方式
DerivePointerAlignment:	false

# 为namespace 结尾添加注释
FixNamespaceComments: true
# 需要被解读为foreach循环而不是函数调用的宏
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]

# 函数返回类型换行时，缩进函数声明或函数定义的函数名
IndentWrappedFunctionNames:	false

## 指针和引用的对齐: Left, Right, Middle
PointerAlignment:	Right

# ! 后面加空格
SpaceAfterLogicalNot: false

## 指针限定符前/后加空格
#SpaceAroundPointerQualifiers: Default
# 在赋值运算符之前添加空格
SpaceBeforeAssignmentOperators:	true
# 大括号前空格
SpaceBeforeCpp11BracedList: true
# 构造函数赋初值冒号前空格
SpaceBeforeCtorInitializerColon: true

# (前加空格策略：仅 if for switch while 加空格 其余情况不加空格
# 开圆括号之前添加一个空格: Never, ControlStatements, ControlStatementsExceptControlMacros, ControlStatementsExceptControlMacros, Always, custom
SpaceBeforeParens:	ControlStatements
## for(auto i : v) for后是否有空格
SpaceBeforeRangeBasedForLoopColon: true


# 描述具有特殊意义的注释的正则表达式，它不应该被分割为多行或以其它方式改变
CommentPragmas:	'^ IWYU pragma:'

# 自动检测函数的调用和定义是否被格式为每行一个参数(Experimental)
ExperimentalAutoDetectBinPacking:	false

# 允许排序#include
SortIncludes: false
#SortIncludes: Never

## 连续空行的最大数量
MaxEmptyLinesToKeep: 10000