# OSv Coding Style

This is a coding style guide for OSv.  It is meant to be helpful, not a tool
for bikeshedding patches on the mailing list.  The use of common sense when
applying these rules is required.

## 1. Indentation and layout
1.1 We use 4 spaces for indentation, no tabs.

1.2 switch statements, put the case with same indentation as the switch
```
    switch(op) {
    case 1:
            i++;
            break;
    case 2:
    case 3:
           i *= 2;
           break;
    default:
           break;
```

1.3 Avoid multiple statements on the same line:
```
    i++; j++;
```

1.4 Line length should not exceed 80 characters.

## 2. Spaces
2.1 Use spaces around binary and ternary operators.
```
   a = a + 3;
   if (a == 1 || b < 2)
   a += 1;
   a = 1 + 2 * 3;
   a = b < 1 ? b : 1;
```

2.2 Do not use spaces around unary operators.
```
   a = -2;
   s = *p;
   for (int i = 3; i < 10; ++i)
```

2.3 Do not use spaces between a function and its parameters, or a
template and its paramters.
```
   sqrt(2.0)
   std::vector<object*>
```

2.4 Bind '*' or '&' to the type, not the variable
...
   int* a;
   int& b;
...

Please note that the rule obviously does not make sense when multiple variables
are declared on the same line.  In such cases, it is preferable to do:

...
   int *a, *b;
...

## 3. Braces
3.1 Always use curly braces for if statement, even if it is a one line if.

3.2 When a brace-delimited block is part of a statement (e.g., if, for,
switch, WITH_LOCK, etc.), separate the open brace from the statement
with a single space - not with a newline.
```
    if (a == 3) {
        ....
    }
````

3.2 In inline method, you can use the open braces at the same line of the method.
```
    int get_age() {
        return age;
    }
```

3.3 In longer method,  the opening brace should be at the beginning of the line.
```
    void clear()
    {
       .....
    }
```

## 4. Naming Convention
4.1 Use all lower snake_case names

## 5. Commenting
5.1 Use the // C++ comment style for normal comment
5.2 When documenting a namespace, class, method or function using Doxygen, use /** */ comments.

## 6. Macros, Enums and RTL
6.1 Avoid Macros when a method would do. Prefer enum and constant to macro.
6.2 Prefer "enum class" to "enum".

6.3 Macro names and enum label should be capitalized. For "enum class",
non-capitalized values are fine.

## 7. Functions
7.1 When declaring or defining a function taking no arguments in C++ code,
avoid the unnecessary "void" as an argument list.

This "void" was only necessary in C to maintain backward-compatibility with
pre-1989 prototype-less declarations, but was never needed in C++ code.
For example, write:

```C++
void abort() {
```

and not:

```C++
void abort(void) {
```

7.2 Put no space between function name and the argument list. For example:

```C++
double sqrt(double d) {
```

7.3 Avoid parantheses around return value

"return" is not a function - it doesn't need parantheses. For example:

```C++
return 0;
return a + b;
```