# Coding Standard for the ANGLE Project

## Google Style Guide

We generally use the [Google C++ Style Guide]
(https://google.github.io/styleguide/cppguide.html) as a basis for
our Coding Standard, however we will deviate from it in a few areas, as noted
below.

Items marked {DEV} indicate a deviation from the Google guidelines. Items marked
{DO} are reiterating points from the Google guidelines.

Before you upload code to Gerrit, use `git cl format` to auto-format your code.
This will catch most of the trivial formatting errors and save you time.

### [Header Files](https://google.github.io/styleguide/cppguide.html#Header_Files)

*   We use **`.h`** for C++ headers.
*   {DEV} #define guards should be of the form: `<PATH>_<FILE>_H_`. (Compiler
    codebase is varied, including `<PROJECT>_` makes the names excessively
    long).

### [Scoping](https://google.github.io/styleguide/cppguide.html#Scoping)

*   {DO} avoid globally scoped variables, unless absolutely necessary.

### [Classes](https://google.github.io/styleguide/cppguide.html#Classes)

*   {DEV} Inherit (privately) from angle::NonCopyable helper class (defined in
    common/angleutils.h) to disable default copy and assignment operators.

### [Other C++ Features](https://google.github.io/styleguide/cppguide.html#Other_C++_Features)

*   {DEV} all parameters passed by reference, except for STL containers (e.g.
    std::vector, std::list), must be labeled `const`. For return parameters
    other than STL containers, use a pointer.
*   {DO} avoid use of default arguments.
*   {DONT} use C++ exceptions, they are disabled in the builds and not caught.
*   {DO} use nullptr (instead of 0 or NULL) for pointers.
*   {DO} use size\_t for loop iterators and size values.
*   {DO} use uint8\_t pointers instead of void pointers to denote binary data.
*   {DO} use C++11/14 according to the [Chromium c++ 11/14 guide]
    (http://chromium-cpp.appspot.com/).

### [Naming](https://google.github.io/styleguide/cppguide.html#Naming)

#### File Names

*   {DEV} Filenames should be all lowercase and can include underscores (`_`).
    If the file is an implementation of a class, the filename may be capitalized
    the same as the major class.
*   {DEV} We use .cpp (instead of .cc), .h and .inl (inlined files) for C++
    files and headers.

#### Directory Names
*   Directory names should be all lowercase, unless following an externally
    imposed capitalization (eg include/EGL, or src/libGLESv2, etc)

#### Variable Names

Use the following guidelines, they do deviate somewhat from the Google
guidelines.

* class and type names: start with capital letter and use CamelCase.
* {DEV} class member variables: use an **`m`** prefix instead of trailing
underscore and use CamelCase.
* global variables (if they must be used): use a **`g`** prefix.
* {DEV} variable names: start with lower case and use CamelCase (chosen for consistency)
* {DEV} function names: Member functions start with lower case and use CamelCase. Non-member functions start with capital letter and
use CamelCase (chosen for consistency)
* Constants: start with a **`k`** and use CamelCase
* namespaces: use all lower case
* Enum Names - use class enums, and the values should be uppercase with underscores.
* macros: all uppercase with underscores
* exceptions to naming: use common sense!

### [Comments](https://google.github.io/styleguide/cppguide.html#Comments)

*   {DO} read and follow Google's recommendations.
*   Each file **must** start with the following boilerplate notice:

```
//
//  Copyright $YEAR The ANGLE Project Authors. All rights reserved.
//  Use of this source code is governed by a BSD-style license that can be
//  found in the LICENSE file.
//
```

* $YEAR should be set to the current year at the time a file is created, and not changed thereafter.

### [Formatting](https://google.github.io/styleguide/cppguide.html#Formatting)

*   {DEV} Avoid excessively long lines. Please keep lines under 100 columns
    long.
*   Use unix-style newlines.
*   {DO} use only spaces. No tab characters. Configure your editor to emit
    spaces when you hit the TAB-key.
*   {DEV} indent 4 spaces at a time.
*   conditionals: place space outside the parenthesis. No spaces inside.
*   switch statements: use the output of `git cl format`.
*   class format(eg private, public, protected): indent by 2 spaces. Regular
    4-space indent from the outer scope for declarations/definitions.
*   pointers and references: **`*`** and **`&`** tight against the variable
*   namespaces: are not indented.
*   extern code blocks: are not indented.
*   {DEV} braces should go on a separate line, except for functions defined in a
    header file where the whole function declaration and definition fit on one
    line.

Examples:

```
if (conditional)
{
    stuff();
}
else
{
    otherstuff()
}
```

```
switch (conditional)
{
  case foo:
    dostuff();
    break;
  case bar:
    otherstuff();
    break;
  default:
    WTFBBQ();
}
```

```
class MyClass : public Foo
{
  public:
    MyClass();
    ~MyClass() {};
  private:
    DISALLOW_COPY_AND_ASSIGN(MyClass);
};
```

```
char *c;
const string &str;
```

### [Exceptions to the Rules](https://google.github.io/styleguide/cppguide.html#Exceptions_to_the_Rules)

*   If modifying pre-existing code that does not match the standard, the altered
    portions of the code should be changed to match the standard.
