# SPDX-FileCopyrightText: Copyright (c) 2022 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

---
BasedOnStyle: Microsoft
IndentWidth: 4
TabWidth:    8
---
Language:        Cpp

AccessModifierOffset: -4

AlignArrayOfStructures: Right
AlignConsecutiveMacros: AcrossComments
AlignConsecutiveAssignments: Consecutive
AlignConsecutiveBitFields: AcrossComments
AlignConsecutiveDeclarations: AcrossComments
AlignEscapedNewlines: Left
AlignOperands:   AlignAfterOperator

AllowAllArgumentsOnNextLine: false
AllowAllParametersOfDeclarationOnNextLine: false
AllowShortFunctionsOnASingleLine: Empty
AllowShortLambdasOnASingleLine: Inline
AllowShortLoopsOnASingleLine: true

AlwaysBreakBeforeMultilineStrings: true
AlwaysBreakTemplateDeclarations: Yes

BreakBeforeBraces: Custom
BraceWrapping:
  AfterCaseLabel:  true
  AfterUnion:      true

  # Must be false or else CompactNamespace=true won't work.
  # Tested with clang-format-14
  AfterNamespace:  false

  BeforeLambdaBody: true
  BeforeWhile:     true

BreakBeforeBinaryOperators: All
BreakInheritanceList: BeforeComma
BreakConstructorInitializers: BeforeComma
QualifierAlignment: Custom

QualifierOrder:
  - inline
  - static
  - const
  - volatile
  - type

CompactNamespaces: true

PackConstructorInitializers: Never

IncludeBlocks:   Regroup
IncludeCategories:
  - Regex:           '^".*Fwd\.hpp"'
    Priority:        9
  - Regex:           '^<.*Fwd\.hpp>'
    Priority:        11
  - Regex:           '^".*\.h.*"'
    Priority:        2
  - Regex:           '^".*\.cuh"'
    Priority:        3
  - Regex:           '^".*'
    Priority:        4
  - Regex:           '^<.*\.h.*>'
    Priority:        5
  - Regex:           '^<.*\.cuh>'
    Priority:        7
  - Regex:           '^<.*'
    Priority:        8
  - Regex:           '[^.]+'
    Priority:        11
  - Regex:           '.*'
    Priority:        12

IncludeIsMainRegex: '([-_](test|unittest))?$'

IndentGotoLabels: false
IndentPPDirectives: AfterHash
IndentExternBlock: NoIndent
IndentWrappedFunctionNames: true

KeepEmptyLinesAtTheStartOfBlocks: false

PenaltyBreakBeforeFirstCallParameter: 1
PenaltyReturnTypeOnItsOwnLine: 200
ReferenceAlignment: Right
ReflowComments:  false
SeparateDefinitionBlocks: Always

SpaceAfterTemplateKeyword: false
SpaceBeforeParens: Custom
SpacesInContainerLiterals: false

Standard:        c++17
