Checks: >
  clang-diagnostic-*,
  clang-analyzer-*,
  bugprone-*,
  performance-*,
  readability-identifier-naming,
  readability-make-member-function-const,
  google-readability-casting,
  google-readability-todo,
  modernize-use-std-numbers,
  modernize-avoid-c-arrays,
  modernize-use-default,
  modernize-use-nullptr,
  modernize-use-override,
  modernize-use-using,
  cppcoreguidelines-no-malloc,
  cppcoreguidelines-owning-memory,
  cppcoreguidelines-avoid-const-or-ref-data-members,
  cppcoreguidelines-avoid-non-const-global-variables,
  cppcoreguidelines-virtual-class-destructor,
  -bugprone-easily-swappable-parameters,
  -bugprone-implicit-widening-of-multiplication-result,
  -bugprone-unchecked-optional-access,
  -clang-diagnostic-builtin-macro-redefined

# There may be good reason for occasionally different naming, only warn about it
WarningsAsErrors: "*,-cppcoreguidelines-avoid-const-or-ref-data-members,-readability-identifier-naming"
# Google Style Guide naming conventions, can be automatically enforced with clang-tidy --fix:
# https://google.github.io/styleguide/cppguide.html
CheckOptions:
  - { key: modernize-avoid-c-arrays.AllowStringArrays,           value: true       }
  - { key: readability-identifier-naming.NamespaceCase,          value: lower_case }
  - { key: readability-identifier-naming.ClassCase,              value: CamelCase  }
  - { key: readability-identifier-naming.StructCase,             value: CamelCase  }
  - { key: readability-identifier-naming.TemplateParameterCase,  value: CamelCase  }
  - { key: readability-identifier-naming.FunctionCase,           value: aNy_CasE  }
  - { key: readability-identifier-naming.VariableCase,           value: lower_case }
  - { key: readability-identifier-naming.ClassMemberCase,        value: lower_case }
  - { key: readability-identifier-naming.ClassMemberSuffix,      value: _          }
  - { key: readability-identifier-naming.PrivateMemberSuffix,    value: _          }
  - { key: readability-identifier-naming.ProtectedMemberSuffix,  value: _          }
  - { key: readability-identifier-naming.EnumConstantCase,         value: CamelCase }
  - { key: readability-identifier-naming.EnumConstantPrefix,       value: k         }
  - { key: readability-identifier-naming.ConstexprVariableCase,    value: CamelCase }
  - { key: readability-identifier-naming.ConstexprVariablePrefix,  value: k         }
  - { key: readability-identifier-naming.GlobalConstantCase,       value: CamelCase }
  - { key: readability-identifier-naming.GlobalConstantPrefix,     value: k         }
  - { key: readability-identifier-naming.MemberConstantCase,       value: CamelCase }
  - { key: readability-identifier-naming.MemberConstantPrefix,     value: k         }
  - { key: readability-identifier-naming.StaticConstantCase,       value: CamelCase }
  - { key: readability-identifier-naming.StaticConstantPrefix,     value: k         }
  - { key: readability-implicit-bool-conversion.AllowIntegerConditions,  value: 1   }
  - { key: readability-implicit-bool-conversion.AllowPointerConditions,  value: 1   }
  - { key: readability-function-cognitive-complexity.IgnoreMacros,  value: 1   }
