
# Configuration of clang-format
# =============================
#
# Tested to work with versions: 8 to 11.

# This causes parameters on continuations to align to the opening brace.
#
#   like_this_long_name(parameter_one,
#                       parameter_two,
#                       parameter_three);
#
AlignAfterOpenBracket: 'Align'

# Disallow short functions on one line; break them up.
AllowShortBlocksOnASingleLine: false

# These two settings trigger stacking of parameters in most cases; this is
# easier to read and also makes diffs easier to read (since an added or removed
# parameter is obvious). For example, function calls will look like this:
#
#   like_this_long_name(parameter_one,
#                       parameter_two,
#                       parameter_three,
#                       parameter_four,
#                       parameter_five,
#                       parameter_six);
#
# Instead of:
#
#   like_this_long_name(parameter_one, parameter_two, parameter_three, parameter_four,
#                       parameter_five, parameter_six);
#
BinPackArguments: false
BinPackParameters: false

# Line width (don't exceed 120).
ColumnLimit: 119

# Cause initializer lists to have one member initialized per line, in the case
# that all initializers can't fit on a single line.
ConstructorInitializerAllOnOneLineOrOnePerLine: true

# Indent the : after a constructor. For example:
#
#   explicit foo_class ()
#       : member1_(5)
#   {
#   }
#
ConstructorInitializerIndentWidth: 4

# Make access modifier slightly more visible.
AccessModifierOffset: -1

# This will unfortunately use spaces in some cases where it's not desired (like
# function calls) but the overall result is better since it will allow
# alignment to work properly with different tab width settings.
ContinuationIndentWidth: 4

# For switch statements, indent the cases.
IndentCaseLabels: true

# Indent after the hash inside preprocessor directives
IndentPPDirectives: AfterHash

BreakBeforeTernaryOperators: false

SpaceAfterTemplateKeyword: false

# Handy comment at the end of each C++ name space.
FixNamespaceComments: true

# Use "if (...)" instead of "if(...)", but have function calls like foo().
SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false

# Use two spaces before trailing comments, for example
#
#   foo = bar;  // comment
#
# Note that this doesn't work for C-style comments.
SpacesBeforeTrailingComments: 2

# Reflow comments, developers must disable formatting as with code to override this.
ReflowComments: true

# Never use tabs for indentation.
# Note: TabWidth and IndentWidth must be the same, or strange things happen.
UseTab: Never
TabWidth: 2
IndentWidth: 2

# Add a big penalty on breaking after the return type of functions. For example,
#
#   static void foo(...)
#
# Instead of:
#
#   static void
#   foo(very long content here that maybe could be stacked)
#
PenaltyReturnTypeOnItsOwnLine: 10000

# Avoid having function calls broken onto a new line:
#
#   int a = foo(
#       long, list, of, many, params);
#
# Instead of:
#
#   int a =
#       foo(long, list, of, many, params);
#
PenaltyBreakAssignment: 100

AllowShortFunctionsOnASingleLine: None

SortIncludes: true

# Don't right align escaped newlines to the right because we have a wide default
AlignEscapedNewlines: DontAlign

# Always break:
#
#   const char *foo =
#       "multi"
#       "line";
#
# Instead of:
#
#   const char *foo = "multi"
#                     "line";
#
AlwaysBreakBeforeMultilineStrings: true

# We don't want literal strings to break,
# however clang-format seems to ignore this (sigh).
PenaltyBreakString: 1000000
