Checks: >
  -*,
  # clang-analyzer-*,
  bugprone-*,
  -bugprone-easily-swappable-parameters,
  -bugprone-exception-escape,
  performance-*,
  readability-*,
  -readability-isolate-declaration,
  -readability-function-cognitive-complexity,
  -readability-identifier-naming,
  -readability-identifier-length,
  -readability-magic-numbers,
  modernize-*,
  -modernize-use-trailing-return-type,
  -modernize-avoid-c-arrays,
  # cppcoreguidelines-*,
  # -cppcoreguidelines-avoid-magic-numbers,
  # -cppcoreguidelines-avoid-c-arrays,
  # -cppcoreguidelines-pro-bounds-pointer-arithmetic,
  # -cppcoreguidelines-special-member-functions,
  # -cppcoreguidelines-pro-type-vararg,
  # -cppcoreguidelines-avoid-do-while,
  hicpp-*,
  -hicpp-avoid-c-arrays,
  -hicpp-vararg,
  -hicpp-avoid-goto,
  -hicpp-no-array-decay,
  misc-unused-parameters,
  misc-throw-by-value-catch-by-reference,
  misc-non-private-member-variables-in-classes,
  misc-definitions-in-headers,
  portability-*,
  cert-*,
  -cert-err33-c,
  -cert-err58-cpp

WarningsAsErrors: '*'
# HeaderFilterRegex: '(.*/)?(src|lib)/.*'
# ExcludeHeaderFilterRegex: '(.*/)?lib/external/.*'
FormatStyle: file

CheckOptions:
  #=== Type-like entities (top-level declarations) ===#
  - { key: readability-identifier-naming.ClassCase,               value: CamelCase }
  - { key: readability-identifier-naming.StructCase,              value: CamelCase }
  - { key: readability-identifier-naming.EnumCase,                value: CamelCase }
  - { key: readability-identifier-naming.EnumConstantCase,        value: UPPER_CASE }
  - { key: readability-identifier-naming.TypeAliasCase,           value: CamelCase }
  - { key: readability-identifier-naming.TemplateParameterCase,   value: CamelCase }
  - { key: readability-identifier-naming.TemplateParameterPrefix, value: T }

  #=== Functions and methods ===#
  - { key: readability-identifier-naming.FunctionCase,            value: camelBack }
  - { key: readability-identifier-naming.MethodCase,              value: camelBack }

  #=== Variables ===#
  - { key: readability-identifier-naming.VariableCase,            value: camelBack }
  - { key: readability-identifier-naming.LocalVariableCase,       value: camelBack }
  - { key: readability-identifier-naming.ParameterCase,           value: camelBack }
  - { key: readability-identifier-naming.ParameterPackCase,       value: camelBack }

  #=== Global/static/class-level variables ===#
  - { key: readability-identifier-naming.GlobalConstantCase,      value: UPPER_CASE }
  - { key: readability-identifier-naming.GlobalVariableCase,      value: camelBack }
  - { key: readability-identifier-naming.StaticConstantCase,      value: UPPER_CASE }
  - { key: readability-identifier-naming.StaticVariableCase,      value: camelBack }
  - { key: readability-identifier-naming.ConstexprVariableCase,   value: UPPER_CASE }
  - { key: readability-identifier-naming.ClassConstantCase,       value: UPPER_CASE }

  #=== Member variables by access level ===#
  - { key: readability-identifier-naming.PrivateMemberCase,       value: camelBack }
  - { key: readability-identifier-naming.ProtectedMemberCase,     value: camelBack }
  - { key: readability-identifier-naming.PublicMemberCase,        value: camelBack }
  - { key: readability-identifier-naming.MemberCase,              value: camelBack }

  #=== Namespaces ===#
  - { key: readability-identifier-naming.NamespaceCase,           value: lower_case }

  #=== Macros ===#
  - { key: readability-identifier-naming.MacroDefinitionCase,     value: UPPER_CASE }
  - { key: readability-identifier-naming.MacroArgumentCase,       value: UPPER_CASE }
