Coding Style Guide for the Android emulator:
--------------------------------------------

Introduction:
-------------

IMPORTANT:
    This guide only applies to the Android-specific code that is currently
    found under $AOSP/external/qemu/android/ only. Other parts of
    external/qemu/ should adhere to the QEMU coding style, whenever possible.

    See the section name "Source Code Organization" for more details.

This document serves as a *guide* for anyone working on the Android-specific
portions of the Android emulator source code. Don't forget that consistency
for the sake of consistency is a waste of time. Use this information as a way
to speed up your coding and code reviews, first and foremost.

A .clang_format file is provided to automatically reformat your modified code
through 'git clang-format'. Use it, this will save you a lot of time.

Also, there is no real need to reformat existing code to adhere to the guide.
Would you feel the need to do so, do it in independent patches that batch all
reformatting without any bugfix / changes at all.

Each rule below comes with a rationale. Again, strict adherence is not
necessary.

IMPORTANT: You need to use 'git-config' to ensure 'git clang-format' works
           correctly, see dedicated section below.


I. History:
-----------

This guide is a mix of the Android C++ coding style guide (not publicly
available) and the Chromium one, available at [1].

In case of doubt, fallback to the Chromium style guide.


II. Source Code Organization:
-----------------------------

It's important to understand when and how to apply this style guide.

The 'classic' Android emulator code base lives under $AOSP/external/qemu/,
with most of the Android-specific code under $AOSP/external/qemu/android/.

The 'qemu2' Android emulator code base lives under $AOSP/external/qemu/
and is *NOT* affected by this coding style guide.

  external/qemu/android/base/
      Set of low-level C++ interfaces to system facilities.
      These should be completely self-contained (i.e. not depend on other
      parts of the code base), and form the 'base platform' to rely on.

      This is very similar (but simpler) than the Chromium base/ component.

      *IMPORTANT*: Any new addition here should come with unit-tests that
                   will be run each time android/rebuild.sh runs.

                   Also see android/base/testing/ for helper classes to use
                   inside your unit tests.

      Generally speaking, the use of C++ makes it easier to provide abstract
      interfaces that can be replaced at runtime by mock versions. Doing so
      in C is also possible, but requires more typing / is more error-prone.

      This is very useful to be able to unit-test a sub-component without
      having to run a full emulator session. In particular try to use the
      features of base/system/System.h to access low-level system features,
      this interface can be easily mocked during unit-tests by creating
      an instance of base/testing/TestSystem.h, allowing your tests to not
      depend on the state of the development machine whenever possible.

      NOTE: Do not put high-level features here. Imagine you would reuse the
            classes in this directory in a completely different program.

  external/qemu/android/utils/
      Similar low-level C-based interfaces, some of them are actual wrappers
      for android/base/ features. Should not depend on anything else besides
      system interfaces.

      NOTE: Do not put high-level features here.

  external/qemu/android-qemu1-glue/base/
      Currently contains QEMU-specific implementations of android/base/
      interfaces. E.g. android-qemu1-glue/base/async/Looper.h provides
      android::qemu::createLooper(), which returns a Looper instance
      based on the QEMU main event loop.

      In this specific example, the idea is to use ThreadLooper::set() with
      its result to inject it into the main thread. Any code that uses
      ThreadLooper::get() to retrieve the current thread's Looper will use the
      QEMU-based main loop when it runs within the emulator's main thread,
      even if it doesn't know anything about QEMU.

      This kind of decoupling is very useful and should be encouraged in
      general.

  external/qemu/android/<feature>/
      Should contain code related to a specific feature used during emulation.
      Ideally, the code should only depend on android/base/ and android/utils/,
      stuff as much as possible. Anything that is QEMU-specific should be moved
      somewhere else.

      A good example is the GSM/SMS emulation code. Generic code is provided
      under external/qemu/android/telephony/ (with unit-tests), while
      QEMU-specific bindings are implemented under external/qemu/telephony/
      which depend on it, and other QEMU headers / functions.

      NOTE: It's essentially impossible to properly unit-test code that depends
            on any QEMU-specific function, so move as much of your code as
            possible out of it.

  external/qemu/android/
      The rest of the sources under this sub-directory are Android-specific
      and is probably still a little bit messy. We plan to sort this out by
      moving, over time, anything specific to QEMU outside of this directory.

  *IMPORTANT*: The end goal is to ensure that the sources under
               external/qemu/android/ will constitute a standalone component
               that can be compiled as a standalone library, that doesn't
               depend on the QEMU code, or its dependencies (e.g. GLib).

               Ultimately, we plan to link the QEMU2 code base to the same
               library, in order to ensure the same feature set for both the
               classic and new emulator engines.

  When adding new code, try hard to:

    - Avoid using QEMU-specific functions directly. It's better to decouple
      a 'clean' feature implementation, which can be unit-tested independently,
      and a QEMU-specific binding / user code for it (which will ultimately
      be re-implemented for QEMU2 as well).

    - Avoid using system interfaces directly. Use the abstractions provided
      by android/base/ and android/utils/ instead, since they can more easily
      be mocked during unit-tests, making our regression test suite more
      robust / less dependent on host/development system specifics.

  The style guide applies to any new code you want to add under
  external/qemu/android/ that should not depend on QEMU-specific headers and
  declarations.


  Finally, when adding new code, favor C++ over C if you can. The reason is
  that it's easier to provide abstract / mockable interfaces in this language
  compared to C. This leads to better de-coupling and unit-tests.


III. Rules:
-----------

As said previously, if something is not specified here, fall back to the
output of clang-format or the Chromium coding style guide at [1], otherwise
ask on the public mailing list for information.

1. Basic Code Formatting:

  NOTE: Most of these should be handled automatically by 'git clang-format' !!
        (See dedicated section below).

  - No TABs in source code allowed (except for Makefiles).
    Rationale: Life is too short to play with editor settings all the time.

  - Indent width is 4 characters.
    Rationale: Let's choose one reasonable default and stick with it.

  - Continuation indentation should be 8 characters.
    Rationale: This makes it slightly easier to detect that the second line
               is really the continuation from the first one.

    E.g.:

    [YES]
         SomeSuperLongTypeName someSuperLongVariableName =
                 CreateAnInstanceOfSomeSuperLongTypeName(withParameter);

    [NO]
         SomeSuperLongTypeName someSuperLongVariableName =
             CreateAnInstanceOfSomeSuperLongTypeName(withParameter);

  - Static word wrap at 80 characters.
    Rationale: That's good enough, let's not fight about it.

  - One space around each binary operator, e.g.:

       x = y + z - 4;

  - The opening curly brace is at the end of the line, e.g.:

       void foo(int x) {
          return x + 42;
       }

    Rationale: Let's just choose one convention, this one saves a little
               vertical space.

  - Single-statements conditionals can go into a single line, and always use
    accolades:

        if (error) {               [YES]
            return ENOPE;
        }

        if (error) { return ENOPE; }   [YES]

        if (error)
            return ENOPE;         [NO]

        if (error) return ENOPE;  [NO]

        if (error) { return ENOPE; } else { return 0; }  [NO]  // not single-statement

        if (error) {            [YES]
            return ENOPE;
        } else {
            return 0;
        }

        return error ? ENOPE : 0;   [YES]

    Rationale: Reduces the chance of introducing subtle bug later when
               adding more statements. Sadly this still happens occasionally
               to everyone.

  - The closing curly brace should appear at the start of its own line, or at
    the end of the line containing the opening brace:

    E.g.:
        Foo::Foo() {}         [YES]

        if (cond) {           [YES]
            doStuffA();
        } else {
            doStuffB();
        }

        if (cond) { return error; }  [YES]

  - The * and & go by the type rather than the variable name, e.g.:

       void foo(const char* str);       [YES]
       void foo(const char * str);      [NO]
       void foo(const char *str);       [NO]

    Rationale: it's more logical since they're really part of the type.

    Special exception: a space is allowed for casts, as in:

        return static_cast<const char*>(foo);   [YES]
        return static_cast<const char *>(foo);  [YES]

    Because there is no ambiguity that this is part of the type.


  - Don't indent within namespaces, and always add a comment when closing one,
    which should be exactly: '}' + 2 spaces + '// namespace' eventually
    followed by the namespace name if any, e.g.:

    [GOOD]

        namespace android {
        namespace foo {

        namespace {

        ... declarations inside anonymous namespace

        }  // namespace            <--- declare end of anonymous namespace

        // Declares android::foo::Foo
        class Foo {
           ...
        };

        }  // namespace foo
        }  // namespace android


  - C++ member initialization in constructors should happen either on a single
    line, or use one line per member, with member initializations aligned
    after the colon, e.g.:

         class Foo {
         public:
             Foo()
                 : mFirstMember(),
                   mSecondMember(),
                   mThirdMember(),
                   mFourthMember() {}
            ....
        };

2. Naming:

  - C++ class/struct names follow 'CapitalCamelCase'

  - C++ Functions and methods follow 'lowerCamelCase()'

  - C++ Class member names begin with an 'm' prefix, as in mFoo, mBar, ...

  - For C++ structs that are POD types (i.e. no constructor/destructor/virtual
    methods and private members), you can use 'lowerCamelCase' instead for
    (necessarily public) members.

  - C++ variables names use 'lowerCamelCase' or 'lower_underscore_spacing' to
    your convenience.

  - C types names follow 'CapitalCamelCase' as well.

  - C functions should preferably use 'lowerCamelCase'. Sometimes an underscore
    can be used to prefix a family of related functions though, as in:

          sandwich_grabCondiments()
          sandwich_addSauce()
          sandwich_putBread()

  - When implementing 'C with classes', follow 'objectType_methodName',
    and distinguish between functions that allocate objects in the heap,
    and those that only initialize them in place.

         typedef struct FooBar FooBar;

         FooBar* fooBar_new();                     // Allocate and initialize.
         void fooBar_free(FooBar* fooBar);         // Finalize and release.
         void fooBar_resetColor(FooBar* fooBar, int newColor);

         // NOTE: _create() and _destroy() are also valid suffixes for
                  functions that also perform heap allocation/releases.

         typedef struct {
             ... field declarations.
         } Zoo;

         void zoo_init(Zoo* bar, ...);  // Initialize instance in place.
         void zoo_done(Zoo* bar);       // Finalize instance.

    NOTE: The 'this' parameter always comes first.

  - C++ header files should be named according to the main class they declare
    and follow 'CapitalCamelCase.h'.

    C header files should be named similarly, but should use
    'lower_underscore_spacing.h' instead. That's actually a simple way to
    differentiate between both header types.

  - Don't use header inclusion guard macros, use '#pragma once' since it's
    supported by all our compilers now. I.e.

        // Copyright disclaimer blah blah
        // ....

        #pragma once

        ... declarations

    Instead of:

        // Copyright disclaimer blah blah
        // ....

        #ifndef ANDROID_STUFF_FOO_BAR_H
        #define ANDROID_STUFF_FOO_BAR_H

        ... declarations

        #endif  // ANDROID_STUFF_FOO_BAR_H

  - C++ namespace names are 'all_lowercase', and avoid using underscores
    if possible. Nested namespaces are ok, but use 'android' as the top-level
    one to avoid conflicts in the future when we need to include headers from
    other third-party C++ libraries (e.g. 'android::base', 'android::testing',
    etc)

  - C++ constants like unscoped enum values and static character arrays
    should be named using a 'k' prefix followed by CamelCase, as in:

       enum Mode {
          kRead = 1 << 0,
          kWrite = 1 << 1,
          kReadWrite = kRead | kWrite;
       };

       static char kString[] = "Hello World";

    Note that scoped enums (a.k.a. 'enum classes') don't need the k Prefix
    but should still use CamelCasing as in:

       enum class Mode {
           Read = 1 << 0,                    // Mode::Read
           Write = 1 << 1,                   // Mode::Write
           ReadWrite = Read | Write          // Mode::ReadWrite
       };

3. Comments:

  - Favor C++ style comments even in C source files.

    Rationale: They are easier to edit, and all recent C toolchains support
               then now.

  - When declaring a new C++ class, begin with a comment explaining its
    purpose and a usage example. Don't comment on the implementation though.

  - Document each parameter and the result of each function or method.
    Use |paramName| notation to denote a given parameter, or expression that
    uses the parameter inside the comment to make it clearer.

  - Inside the code, use comments to describe the code's intended behaviour,
    not the exact implementation. Anything that is subtle should have a comment
    that explain why things are the way they are, including temporary band-aids,
    work-arounds and 'clever hacks' to help future maintenance.

  - Try to add comments after #else and #endif directives to indicate what
    they relate to, as in:

       #ifdef _WIN32
       ...
       #endif  // !_WIN32

       #if defined(__linux__) || defined(_WIN32)
       ...
       #else  // !__linux__ && !_WIN32    <-- NOTE: condition inverted on #else
       ...
       #endif  // !__linux__ && !_WIN32


4. Header and ordering:

  When including header files, follow this order:

  - Each source file should first include the header file it relates to,
    using "" notation, with path relative to external/qemu/.

    For example, the source file 'android/myfeature/Foo.cpp' might use:

        #include "android/myfeature/Foo.h"    [YES]

    But not:

        #include <android/myfeature/Foo.h>    [NO]
        #include "Foo.h"                      [NO]

    Rationale:  If you end up not including a required header in
    your_fancy_module.h, then you catch that mistake while trying to
    compile your_fancy_module.c, instead of someone else hitting it later
    when including your_fancy_module.h in their client code.

  - Then list all other headers from the android/ sub-directory,
    use case-insensitive  alphabetical ordering to do this, with ""
    notation, e.g.:

    android/myfeature/Api.cpp:

        #include "android/myfeature/Api.h"

        #include "android/base/Log.h"
        #include "android/myfeature/Helper.h"
        #include "android/otherFeather.h"

  - Followed by all headers from third-party libraries, using <> notation.
  - Followed by all system headers, using <> notation.

  Separate each header group with an empty line.


5. Unnamed namespaces:

  Contrary to the Chromium style guide, avoid them if you want.

  Rationale: Their main drawback is that it's extremely difficult to set
  breakpoints into functions that are defined into anonymous namespaces with
  GDB during debugging. I.e. you need to manually quote the full type with ("),
  and auto-completion doesn't work. This is really not cool when you're already
  having a hard time trying to undestand why something doesn't work.

  Internal functions declared with 'static' don't have this problem.

  It might be a good idea to put whole internal classes declarations inside
  unnamed namespaces though to avoid exporting all its symbols in the
  corresponding object file, and use better relocations as well, e.g.:

        namespace {

        class MySuperDuperClass : public BaseClass {
            .... // lots of methods here.
        };

        }  // namespace

        BaseClass* createSuperDuperInstance() {
            return new MySuperDuperClass();
        }


6. Platform-specific code:

  We don't provide OS_XXX macros, so currently use the following checks for
  host-platform conditional checks:

        #ifdef _WIN32
        ... Code specific to 32-bit and 64-bit Windows!
        #endif  // _WIN32

        #ifdef __linux__
        ... Code specific to Linux
        #endif  // __linux__

        #ifdef __APPLE__
        ... Code specific to Darwin / OS X
        #endif  // __APPLE__

        #ifndef _WIN32
        ... Code specific to Linux or Darwin.
        #endif  // !_WIN32

  By the way, refer to OS X as 'darwin' instead in your comments and source
  file names if possible.


IV. Automatic code formatting with 'git clang-format':
------------------------------------------------------

A file is provided at external/qemu/android/.clang-format that contains rules
to apply with the 'clang-format' tool. More specifically, one should do the
following to manually reformat entire sources:

  cd external/qemu/android/
  clang-format -style=file -i <list-of-files>

The '-style=file' option is required to tell clang-format to use our
.clang-format file, otherwise, it will default to the Google style which
is quite different!

You can also use the 'git clang-format' command, that will only reformat
the lines that you have currently modified and added to your index, however
you need to configure your git project once to ensure it uses the .clang-format
file properly, with:

  git config clangformat.style file

This ensures that git will pass '-style=file' to clang-format each time you
call 'git clang-format' (which itself calls git-clang-format).


V. C++11 and beyond

  As of now, C++11 is enabled for all platforms, and here's the allowed
  features (list is also based on Chromium style [1], but a little more
  relaxed):

0. First of all, be consistent.

  If you're editing some older file which has a bunch of 'typedef's, don't just
  throw 'using' in the middle of them. Either follow the existing pattern, or
  upgrade around your change. Consistency helps the reader much more than some
  single fancy feature.

1. auto

  Use auto when type is obvious, not important or hard to spell:

  good:
     auto i = 0;
     auto foo = new Foo();
     auto it = map.begin();

  bad:
     auto f = doSomeStuff();
     otherStuff(f->bar());

  Don't forget about "auto&" and "const auto&" to make sure the value is not
  copied or accidentally modified.

2. foreach loop

  Use the foreach loop for iteration over everything you can

   int values[] = {1,2,3};
   for (int i : values) {
       ...
   }

  Use the correct reference form for the variable (& or const &); don't
  just throw &&

3. Uniform initialization and initializer lists

  Prefer uniform initialization syntax {} to disambugate variables from
  functions and suppress implicit type conversions.

    int i = 1.0; // bad, precision loss
    int i = {1.0}; // good, compiler error

    Foo f(); // bad, function f returning foo instead of a variable
    Foo f{}; // good, default-initialized variable f

4. type aliases

  Prefer "using" over "typedef"

   // easier to understand - "=" splits alias and the actual type
   using f = foo::bar::baz;

   // much simpler for functions than typedefed version -
   // typedef char (*func)(blah)[10];
   using func = char (*)(blah)[10];

   // typedef cannot into templates :)
   template <class T>
   using vec<T> = std::vector<T, our_super_duper_allocator<T>>;

5. override and final

  Use these new keywords as much as possible to make sure your derived class
  actually overrides someting from a base class.

6. Defaulted and deleted members

  Prefer "= default" and "= delete" syntax over the empty braces and private
  declaration. It both improves readability and compiler messages/generated
  code.
  Note: you can use this syntax in the implementation file:

  foo.h:
    struct Foo {
        Foo();
    };

  foo.cpp:
    Foo::Foo() = default;

7. Class member initializers

  Use member initializers instead of a standalone constructor if that's the
  only thing it is needed for, or if there are many constructors all requiring
  the same member values

   class Meow {
   public:
       Meow() = default;

       Meow(int i) : i(i) {
       }

   private:
       int i = 0;
       int j = 2;
       std::string meow = "meow";
   };

8. Strongly-typed enums

  Prefer scoped enums, a.k.a. "enum classes", over the old unscoped enums.
  I.e.:

     [YES]
     enum class Mode {
         Read = 1 << 0,
         Write = 1 << 1,
         ReadWrite = (1 << 0) | (1 << 1),
     };

     [NO]
     enum Mode {
         kRead = 1 << 0,
         kWrite = 1 << 1,
         kReadWrite = kRead | kWrite,
     };

  Note: Scoped enums have one drawback: they do not support bitwise operations
        which are typically handy for dealing with bitflags. There is
        fortunately one solution for this, which is to include
        "android/base/EnumFlags.h" in your source file, and add the
        following flag if you're not in the android::base namespace:

           #include "android/base/EnumFlags.h"

           ...

           using ::android::base::EnumFlags


9. static_assert

  Use where possible over the runtime assert() calls

10. Raw string literals

  Use raw string literals for the things which otherwise look horrible

    auto s = R"(text with lots of "bad" characters\xml\etc
even
 many
  newlines)";

11. STL updates

  TEMPORARY: no C++11 STL features work on Mac with its default library
  until we switch to libc++, STL is limited to C++03

  DISABLED: Feel free to use all new features from the STL, but make sure they
  DISABLED: actually compile and work on all platforms: Linux, Mac and Windows.
  DISABLED: Take extra care with the Windows MinGW - it tends to lag for quite a lot
  DISABLED: compare to others, e.g. std::thread is still unavaliable out of the box
  DISABLED: Something may not compile, others could be implemented a little differently.
  DISABLED: Do your due diligence before actually submitting the change.

  DISABLED: Prefer STL implementations over a handwritten code, e.g. std::atomic,
  DISABLED: std smart pointers, regexes, etc

99. lambdas, noexcept, rvalue references, move semantics, perfect forwarding,
    constexpr

  Do not use the features listed here.

  ...unless:
    - You need to return a move-only type, e.g. std::unique_ptr<>. Use
      std::move(var) for this case.

MAX_INT. Other features not mentioned here

  If there's some missing feature you need, just add it to the list and send a
  code review to the team.


V. Contributing code
-----------------------------

CL descriptions should follow the form (copied off of [2]):

submodule: Summary of change preferably < 65 chars, surely < 80

Longer description of change addressing as appropriate: why the change is made,
context if it is part of many changes, description of previous behavior and
newly introduced differences, etc.

Long lines should be wrapped to 80 columns for easier log message viewing in
terminals.

BUG=b.android.com/123456
TEST=Optional description of test steps to be performed by a human to verify
     this patch. This helps cherry-pick changes later.
     For bug fixes, it's a manual regression test (or preferably, just "Run
     (new) unittests" :) ). For new features, some sanity checks.


M. Appendix
-----------------------------

[1] https://www.chromium.org/developers/coding-style
[2] https://www.chromium.org/developers/contributing-code
