summaryrefslogtreecommitdiff
path: root/guides
diff options
Diffstat (limited to 'guides')
-rw-r--r--guides/CMakeLists.txt9
-rw-r--r--guides/cppguide.xml4566
-rw-r--r--guides/styleguide.css147
-rw-r--r--guides/styleguide.xsl890
4 files changed, 5612 insertions, 0 deletions
diff --git a/guides/CMakeLists.txt b/guides/CMakeLists.txt
new file mode 100644
index 000000000..b82730d0b
--- /dev/null
+++ b/guides/CMakeLists.txt
@@ -0,0 +1,9 @@
+PROJECT(guides)
+
+ADD_CUSTOM_COMMAND(
+ OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/cppguide.html
+ COMMAND xsltproc -o ${CMAKE_CURRENT_SOURCE_DIR}/cppguide.html ${CMAKE_CURRENT_SOURCE_DIR}/styleguide.xsl ${CMAKE_CURRENT_SOURCE_DIR}/cppguide.xml
+ DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/styleguide.xsl ${CMAKE_CURRENT_SOURCE_DIR}/cppguide.xml
+ )
+
+ADD_CUSTOM_TARGET(guides ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/cppguide.html)
diff --git a/guides/cppguide.xml b/guides/cppguide.xml
new file mode 100644
index 000000000..a3e45c2d2
--- /dev/null
+++ b/guides/cppguide.xml
@@ -0,0 +1,4566 @@
+<?xml version="1.0"?>
+<?xml-stylesheet type="text/xsl" href="styleguide.xsl"?>
+<GUIDE title="Google C++ Style Guide">
+
+<p align="right">
+
+Revision 3.188
+</p>
+
+
+
+<address>
+Benjy Weinberger<br/>
+Craig Silverstein<br/>
+Gregory Eitzmann<br/>
+Mark Mentovai<br/>
+Tashana Landray
+</address>
+
+<OVERVIEW>
+<CATEGORY title="Important Note">
+ <STYLEPOINT title="Displaying Hidden Details in this Guide">
+ <SUMMARY>
+ This style guide contains many details that are initially
+ hidden from view. They are marked by the triangle icon, which you
+ see here on your left. Click it now.
+ You should see "Hooray" appear below.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Hooray! Now you know you can expand points to get more
+ details. Alternatively, there's an "expand all" at the
+ top of this document.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+<CATEGORY title="Background">
+ <p>
+ C++ is the main development language
+
+ used by many of Google's open-source
+ projects.
+ As every C++ programmer knows, the language has many powerful features,
+ but this power brings with it complexity, which in turn can make code
+ more bug-prone and harder to read and maintain.
+ </p>
+ <p>
+ The goal of this guide is to manage this complexity by describing
+ in detail the dos and don'ts of writing C++
+ code. These rules exist to
+ keep
+
+ the
+ code base manageable while still allowing coders to use C++ language
+ features productively.
+ </p>
+ <p>
+ <em>Style</em>, also known as readability, is what we call the
+ conventions that govern our C++ code. The term Style is a bit of a
+ misnomer, since these conventions cover far more than just source
+ file formatting.
+ </p>
+ <p>
+ One way in which we keep the code base manageable is by enforcing
+ <em>consistency</em>.
+
+ It is very important that any
+
+ programmer
+ be able to look at another's code and quickly understand it.
+ Maintaining a uniform style and following conventions means that we can
+ more easily use "pattern-matching" to infer what various symbols are
+ and what invariants are true about them. Creating common, required
+ idioms and patterns makes code much easier to understand. In some
+ cases there might be good arguments for changing certain style
+ rules, but we nonetheless keep things as they are in order to
+ preserve consistency.
+ </p>
+ <p>
+ Another issue this guide addresses is that of C++ feature bloat.
+ C++ is a huge language with many advanced features. In some cases
+ we constrain, or even ban, use of certain features. We do this to
+ keep code simple and to avoid the various common errors and
+ problems that these features can cause. This guide lists these
+ features and explains why their use is restricted.
+ </p>
+ <p>
+
+ Open-source projects developed by Google
+ conform to the requirements in this guide.
+ </p>
+
+ <p>
+ Note that this guide is not a C++ tutorial: we assume that the
+ reader is familiar with the language.
+
+ </p>
+
+</CATEGORY>
+</OVERVIEW>
+
+<CATEGORY title="Header Files">
+ <p>
+ In general, every <code>.cc</code> file should have an associated
+ <code>.h</code> file. There are some common exceptions, such as
+
+ unittests
+ and small <code>.cc</code> files containing just a <code>main()</code>
+ function.
+ </p>
+ <p>
+ Correct use of header files can make a huge difference to the
+ readability, size and performance of your code.
+ </p>
+ <p>
+ The following rules will guide you through the various pitfalls of
+ using header files.
+ </p>
+
+ <STYLEPOINT title="The #define Guard">
+ <SUMMARY>
+ All header files should have <code>#define</code> guards to
+ prevent multiple inclusion. The format of the symbol name
+ should be
+ <code><i>&lt;PROJECT&gt;</i>_<i>&lt;PATH&gt;</i>_<i>&lt;FILE&gt;</i>_H_</code>.
+ </SUMMARY>
+ <BODY>
+
+ <p>
+ To guarantee uniqueness, they should be based on the full path
+ in a project's source tree. For example, the file
+ <code>foo/src/bar/baz.h</code> in project <code>foo</code> should
+ have the following guard:
+ </p>
+ <CODE_SNIPPET>
+ #ifndef FOO_BAR_BAZ_H_
+ #define FOO_BAR_BAZ_H_
+
+ ...
+
+ #endif // FOO_BAR_BAZ_H_
+ </CODE_SNIPPET>
+
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Header File Dependencies">
+ <SUMMARY>
+ Don't use an <code>#include</code> when a forward declaration
+ would suffice.
+ </SUMMARY>
+ <BODY>
+ <p>
+ When you include a header file you introduce a dependency that
+ will cause your code to be recompiled whenever the header file
+ changes. If your header file includes other header files, any
+ change to those files will cause any code that includes your
+ header to be recompiled. Therefore, we prefer to minimize
+ includes, particularly includes of header files in other
+ header files.
+ </p>
+ <p>
+ You can significantly reduce the number of header files you
+ need to include in your own header files by using forward
+ declarations. For example, if your header file uses the
+ <code>File</code> class in ways that do not require access to
+ the declaration of the <code>File</code> class, your header
+ file can just forward declare <code>class File;</code> instead
+ of having to <code>#include "file/base/file.h"</code>.
+ </p>
+ <p>
+ How can we use a class <code>Foo</code> in a header file
+ without access to its definition?
+ </p>
+ <ul>
+ <li> We can declare data members of type <code>Foo*</code> or
+ <code>Foo&amp;</code>.
+ </li>
+ <li> We can declare (but not define) functions with arguments,
+ and/or return values, of type <code>Foo</code>. (One
+ exception is if an argument <code>Foo</code>
+ or <code>const Foo&amp;</code> has a
+ non-<code>explicit</code>, one-argument constructor,
+
+ in which case we need the full definition to support
+ automatic type conversion.)
+ </li>
+ <li> We can declare static data members of type
+ <code>Foo</code>. This is because static data members
+ are defined outside the class definition.
+ </li>
+ </ul>
+ <p>
+ On the other hand, you must include the header file for
+ <code>Foo</code> if your class subclasses <code>Foo</code> or
+ has a data member of type <code>Foo</code>.
+ </p>
+ <p>
+ Sometimes it makes sense to have pointer (or better,
+ <code>scoped_ptr</code>)
+ members instead of object members. However, this complicates code
+ readability and imposes a performance penalty, so avoid doing
+ this transformation if the only purpose is to minimize includes
+ in header files.
+ </p>
+ <p>
+ Of course, <code>.cc</code> files typically do require the
+ definitions of the classes they use, and usually have to
+ include several header files.
+ </p>
+
+ <SUBSECTION title="Note:">
+ If you use a symbol <code>Foo</code> in your source file, you
+ should bring in a definition for <code>Foo</code> yourself,
+ either via an #include or via a forward declaration. Do not
+ depend on the symbol being brought in transitively via headers
+ not directly included. One exception is if <code>Foo</code>
+ is used in <code>myfile.cc</code>, it's ok to #include (or
+ forward-declare) <code>Foo</code> in <code>myfile.h</code>,
+ instead of <code>myfile.cc</code>.
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Inline Functions">
+ <SUMMARY>
+ Define functions inline only when they are small, say, 10 lines
+ or less.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ You can declare functions in a way that allows the compiler to
+ expand them inline rather than calling them through the usual
+ function call mechanism.
+ </DEFINITION>
+ <PROS>
+ Inlining a function can generate more efficient object code,
+ as long as the inlined function is small. Feel free to inline
+ accessors and mutators, and other short, performance-critical
+ functions.
+ </PROS>
+ <CONS>
+ Overuse of inlining can actually make programs slower.
+ Depending on a function's size, inlining it can cause the code
+ size to increase or decrease. Inlining a very small accessor
+ function will usually decrease code size while inlining a very
+ large function can dramatically increase code size. On modern
+ processors smaller code usually runs faster due to better use
+ of the instruction cache.
+ </CONS>
+ <DECISION>
+ <p>
+ A decent rule of thumb is to not inline a function if it is
+ more than 10 lines long. Beware of destructors, which are
+ often longer than they appear because of implicit member-
+ and base-destructor calls!
+ </p>
+ <p>
+ Another useful rule of thumb: it's typically not cost
+ effective to inline functions with loops or switch
+ statements (unless, in the common case, the loop or switch
+ statement is never executed).
+ </p>
+ <p>
+ It is important to know that functions are not always
+ inlined even if they are declared as such; for example,
+ virtual and recursive functions are not normally inlined.
+ Usually recursive functions should not be inline. The main
+ reason for making a virtual function inline is to place its
+ definition in the class, either for convenience or to
+ document its behavior, e.g., for accessors and mutators.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="The -inl.h Files">
+ <SUMMARY>
+ You may use file names with a <code>-inl.h</code> suffix to define
+ complex inline functions when needed.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The definition of an inline function needs to be in a header
+ file, so that the compiler has the definition available for
+ inlining at the call sites. However, implementation code
+ properly belongs in <code>.cc</code> files, and we do not like
+ to have much actual code in <code>.h</code> files unless there
+ is a readability or performance advantage.
+ </p>
+ <p>
+ If an inline function definition is short, with very little,
+ if any, logic in it, you should put the code in your
+ <code>.h</code> file. For example, accessors and mutators
+ should certainly be inside a class definition. More complex
+ inline functions may also be put in a <code>.h</code> file for
+ the convenience of the implementer and callers, though if this
+ makes the <code>.h</code> file too unwieldy you can instead
+ put that code in a separate <code>-inl.h</code> file.
+ This separates the implementation from the class definition,
+ while still allowing the implementation to be included where
+ necessary.
+ </p>
+ <p>
+ Another use of <code>-inl.h</code> files is for definitions of
+ function templates. This can be used to keep your template
+ definitions easy to read.
+ </p>
+ <p>
+ Do not forget that a <code>-inl.h</code> file requires a
+ <a href="#The__define_Guard"><code>#define</code> guard</a> just
+ like any other header file.
+ </p>
+
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Parameter Ordering">
+ <SUMMARY>
+ When defining a function, parameter order is: inputs,
+ then outputs.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Parameters to C/C++ functions are either input to the
+ function, output from the function, or both. Input parameters
+ are usually values or <code>const</code> references, while output
+ and input/output parameters will be non-<code>const</code>
+ pointers. When ordering function parameters, put all input-only
+ parameters before any output parameters. In particular, do not add
+ new parameters to the end of the function just because they are
+ new; place new input-only parameters before the output
+ parameters.
+ </p>
+ <p>
+ This is not a hard-and-fast rule. Parameters that are both
+ input and output (often classes/structs) muddy the waters,
+ and, as always, consistency with related functions may require
+ you to bend the rule.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Names and Order of Includes">
+ <SUMMARY>
+ Use standard order for readability and to avoid hidden
+ dependencies: C library, C++ library,
+
+ other libraries' <code>.h</code>, your
+ project's
+ <code>.h</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+
+ All of a project's header files should be
+ listed as descendants of the project's source directory
+ without use of UNIX directory shortcuts <code>.</code> (the current
+ directory) or <code>..</code> (the parent directory). For
+ example,
+
+ <code>google-awesome-project/src/base/logging.h</code>
+ should be included as
+ </p>
+ <CODE_SNIPPET>
+ #include "base/logging.h"
+ </CODE_SNIPPET>
+ <p>
+ In <code><var>dir/foo</var>.cc</code> or <code><var>dir/foo_test</var>.cc</code>,
+ whose main purpose is to implement or test the stuff in
+ <code><var>dir2/foo2</var>.h</code>, order your includes as
+ follows:
+ </p>
+ <ol>
+ <li> <code><var>dir2/foo2</var>.h</code> (preferred location
+ &#8212; see details below).</li>
+ <li> C system files.</li>
+ <li> C++ system files.</li>
+ <li> Other libraries' <code>.h</code> files.</li>
+ <li>
+ Your project's
+ <code>.h</code> files.</li>
+ </ol>
+ <p>
+ The preferred ordering reduces hidden dependencies. We want
+ every header file to be compilable on its own. The easiest
+ way to achieve this is to make sure that every one of them is
+ the first <code>.h</code> file <code>#include</code>d in some
+ <code>.cc</code>.
+ </p>
+ <p>
+ <code><var>dir/foo</var>.cc</code> and
+ <code><var>dir2/foo2</var>.h</code> are often in the same
+ directory (e.g. <code>base/basictypes_test.cc</code> and
+ <code>base/basictypes.h</code>), but can be in different
+ directories too.
+ </p>
+
+ <p>
+ Within each section it is nice to order the includes
+ alphabetically.
+ </p>
+ <p>
+ For example, the includes in
+
+ <code>google-awesome-project/src/foo/internal/fooserver.cc</code>
+ might look like this:
+ </p>
+ <CODE_SNIPPET>
+ #include "foo/public/fooserver.h" // Preferred location.
+
+ #include &lt;sys/types.h&gt;
+ #include &lt;unistd.h&gt;
+
+ #include &lt;hash_map&gt;
+ #include &lt;vector&gt;
+
+ #include "base/basictypes.h"
+ #include "base/commandlineflags.h"
+ #include "foo/public/bar.h"
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+
+<CATEGORY title="Scoping">
+ <STYLEPOINT title="Namespaces">
+ <SUMMARY>
+ Unnamed namespaces in <code>.cc</code> files are encouraged. With
+ named namespaces, choose the name based on the
+
+ project, and possibly its path.
+ Do not use a <SYNTAX>using-directive</SYNTAX>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ Namespaces subdivide the global scope into distinct, named
+ scopes, and so are useful for preventing name collisions in
+ the global scope.
+ </DEFINITION>
+ <PROS>
+ <p>
+ Namespaces provide a (hierarchical) axis of naming, in
+ addition to the (also hierarchical) name axis provided by
+ classes.
+ </p>
+ <p>
+ For example, if two different projects have a class
+ <code>Foo</code> in the global scope, these symbols may
+ collide at compile time or at runtime. If each project
+ places their code in a namespace, <code>project1::Foo</code>
+ and <code>project2::Foo</code> are now distinct symbols that
+ do not collide.
+ </p>
+ </PROS>
+ <CONS>
+ <p>
+ Namespaces can be confusing, because they provide an
+ additional (hierarchical) axis of naming, in addition to the
+ (also hierarchical) name axis provided by classes.
+ </p>
+ <p>
+ Use of unnamed spaces in header files can easily cause
+ violations of the C++ One Definition Rule (ODR).
+ </p>
+ </CONS>
+ <DECISION>
+ <p>
+ Use namespaces according to the policy described below.
+ </p>
+
+ <SUBSECTION title="Unnamed Namespaces">
+ <ul>
+ <li> Unnamed namespaces are allowed and even encouraged in
+ <code>.cc</code> files, to avoid runtime naming
+ conflicts:
+ <CODE_SNIPPET>
+ namespace { // This is in a .cc file.
+
+ // The content of a namespace is not indented
+ enum { kUnused, kEOF, kError }; // Commonly used tokens.
+ bool AtEof() { return pos_ == kEOF; } // Uses our namespace's EOF.
+
+ } // namespace
+ </CODE_SNIPPET>
+
+ <p>
+ However, file-scope declarations that are
+ associated with a particular class may be declared
+ in that class as types, static data members or
+ static member functions rather than as members of
+ an unnamed namespace. Terminate the unnamed
+ namespace as shown, with a comment <code>//
+ namespace</code>.
+ </p>
+ </li>
+ <li> Do not use unnamed namespaces in <code>.h</code>
+ files.
+ </li>
+ </ul>
+ </SUBSECTION>
+
+ <SUBSECTION title="Named Namespaces">
+ <p>
+ Named namespaces should be used as follows:
+ </p>
+ <ul>
+ <li> Namespaces wrap the entire source file after includes,
+
+ <a href="http://google-gflags.googlecode.com/">gflags</a>
+ definitions/declarations, and forward declarations of classes
+ from other namespaces:
+ <CODE_SNIPPET>
+ // In the .h file
+ namespace mynamespace {
+
+ // All declarations are within the namespace scope.
+ // Notice the lack of indentation.
+ class MyClass {
+ public:
+ ...
+ void Foo();
+ };
+
+ } // namespace mynamespace
+ </CODE_SNIPPET>
+ <CODE_SNIPPET>
+ // In the .cc file
+ namespace mynamespace {
+
+ // Definition of functions is within scope of the namespace.
+ void MyClass::Foo() {
+ ...
+ }
+
+ } // namespace mynamespace
+ </CODE_SNIPPET>
+ <p>
+ The typical <code>.cc</code> file might have more
+ complex detail, including the need to reference classes
+ in other namespaces.
+ </p>
+ <CODE_SNIPPET>
+ #include "a.h"
+
+ DEFINE_bool(someflag, false, "dummy flag");
+
+ class C; // Forward declaration of class C in the global namespace.
+ namespace a { class A; } // Forward declaration of a::A.
+
+ namespace b {
+
+ ...code for b... // Code goes against the left margin.
+
+ } // namespace b
+ </CODE_SNIPPET>
+ </li>
+
+
+
+ <li> Do not declare anything in namespace
+ <code>std</code>, not even forward declarations of
+ standard library classes. Declaring entities in
+ namespace <code>std</code> is undefined behavior,
+ i.e., not portable. To declare entities from the
+ standard library, include the appropriate header
+ file.
+ </li>
+
+ <li> You may not use a <SYNTAX>using-directive</SYNTAX> to
+ make all names from a namespace available.
+ <BAD_CODE_SNIPPET>
+ // Forbidden -- This pollutes the namespace.
+ using namespace foo;
+ </BAD_CODE_SNIPPET>
+ </li>
+
+ <li> You may use a <SYNTAX>using-declaration</SYNTAX>
+ anywhere in a <code>.cc</code> file, and in functions,
+ methods or classes in <code>.h</code> files.
+ <CODE_SNIPPET>
+ // OK in .cc files.
+ // Must be in a function, method or class in .h files.
+ using ::foo::bar;
+ </CODE_SNIPPET>
+ </li>
+
+ <li> Namespace aliases are allowed anywhere in a
+ <code>.cc</code> file, anywhere inside the named
+ namespace that wraps an entire <code>.h</code> file,
+ and in functions and methods.
+ <CODE_SNIPPET>
+ // Shorten access to some commonly used names in .cc files.
+ namespace fbz = ::foo::bar::baz;
+
+ // Shorten access to some commonly used names (in a .h file).
+ namespace librarian {
+ // The following alias is available to all files including
+ // this header (in namespace librarian):
+ // alias names should therefore be chosen consistently
+ // within a project.
+ namespace pd_s = ::pipeline_diagnostics::sidetable;
+
+ inline void my_inline_function() {
+ // namespace alias local to a function (or method).
+ namespace fbz = ::foo::bar::baz;
+ ...
+ }
+ } // namespace librarian
+ </CODE_SNIPPET>
+ <p>
+ Note that an alias in a .h file is visible to everyone
+ #including that file, so public headers (those available
+ outside a project) and headers transitively #included by them,
+ should avoid defining aliases, as part of the general
+ goal of keeping public APIs as small as possible.
+ </p>
+ </li>
+ </ul>
+ </SUBSECTION>
+
+
+
+
+
+
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Nested Classes">
+ <SUMMARY>
+ Although you may use public nested classes when they are part of
+ an interface, consider a <a HREF="#Namespaces">namespace</a> to
+ keep declarations out of the global scope.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ A class can define another class within it; this is also
+ called a <SYNTAX>member class</SYNTAX>.
+ <CODE_SNIPPET>
+ class Foo {
+
+ private:
+ // Bar is a member class, nested within Foo.
+ class Bar {
+ ...
+ };
+
+ };
+ </CODE_SNIPPET>
+ </DEFINITION>
+ <PROS>
+ This is useful when the nested (or member) class is only used
+ by the enclosing class; making it a member puts it in the
+ enclosing class scope rather than polluting the outer scope
+ with the class name. Nested classes can be forward declared
+ within the enclosing class and then defined in the
+ <code>.cc</code> file to avoid including the nested class
+ definition in the enclosing class declaration, since the
+ nested class definition is usually only relevant to the
+ implementation.
+ </PROS>
+ <CONS>
+ Nested classes can be forward-declared only within the
+ definition of the enclosing class. Thus, any header file
+ manipulating a <code>Foo::Bar*</code> pointer will have to
+ include the full class declaration for <code>Foo</code>.
+ </CONS>
+ <DECISION>
+ Do not make nested classes public unless they are actually
+ part of the interface, e.g., a class that holds a set of
+ options for some method.
+
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Nonmember, Static Member, and Global Functions">
+ <SUMMARY>
+ Prefer nonmember functions within a namespace or static member
+ functions to global functions; use completely global functions
+ rarely.
+ </SUMMARY>
+ <BODY>
+ <PROS>
+ Nonmember and static member functions can be useful in some
+ situations. Putting nonmember functions in a namespace avoids
+ polluting the global namespace.
+ </PROS>
+ <CONS>
+ Nonmember and static member functions may make more sense as
+ members of a new class, especially if they access external
+ resources or have significant dependencies.
+ </CONS>
+ <DECISION>
+ <p>
+ Sometimes it is useful, or even necessary, to define a
+ function not bound to a class instance. Such a function can
+ be either a static member or a nonmember function.
+ Nonmember functions should not depend on external variables,
+ and should nearly always exist in a namespace. Rather than
+ creating classes only to group static member functions which
+ do not share static data, use
+ <a href="#Namespaces">namespaces</a> instead.
+ </p>
+ <p>
+ Functions defined in the same compilation unit as production
+ classes may introduce unnecessary coupling and link-time
+ dependencies when directly called from other compilation
+ units; static member functions are particularly susceptible
+ to this. Consider extracting a new class, or placing the
+ functions in a namespace possibly in a separate library.
+ </p>
+ <p>
+ If you must define a nonmember function and it is only
+ needed in its <code>.cc</code> file, use an unnamed
+ <a HREF="#Namespaces">namespace</a> or <code>static</code>
+ linkage (eg <code>static int Foo() {...}</code>) to limit
+ its scope.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Local Variables">
+ <SUMMARY>
+ Place a function's variables in the narrowest scope possible,
+ and initialize variables in the declaration.
+ </SUMMARY>
+ <BODY>
+ <p>
+ C++ allows you to declare variables anywhere in a function.
+ We encourage you to declare them in as local a scope as
+ possible, and as close to the first use as possible. This
+ makes it easier for the reader to find the declaration and see
+ what type the variable is and what it was initialized to. In
+ particular, initialization should be used instead of
+ declaration and assignment, e.g.
+ </p>
+ <BAD_CODE_SNIPPET>
+ int i;
+ i = f(); // Bad -- initialization separate from declaration.
+ </BAD_CODE_SNIPPET>
+ <CODE_SNIPPET>
+ int j = g(); // Good -- declaration has initialization.
+ </CODE_SNIPPET>
+ <p>
+ Note that gcc implements <code>for (int i = 0; i
+ &lt; 10; ++i)</code> correctly (the scope of <code>i</code> is
+ only the scope of the <code>for</code> loop), so you can then
+ reuse <code>i</code> in another <code>for</code> loop in the
+ same scope. It also correctly scopes declarations in
+ <code>if</code> and <code>while</code> statements, e.g.
+ </p>
+ <CODE_SNIPPET>
+ while (const char* p = strchr(str, '/')) str = p + 1;
+ </CODE_SNIPPET>
+ <p>
+ There is one caveat: if the variable is an object, its
+ constructor is invoked every time it enters scope and is
+ created, and its destructor is invoked every time it goes
+ out of scope.
+ </p>
+ <BAD_CODE_SNIPPET>
+ // Inefficient implementation:
+ for (int i = 0; i &lt; 1000000; ++i) {
+ Foo f; // My ctor and dtor get called 1000000 times each.
+ f.DoSomething(i);
+ }
+ </BAD_CODE_SNIPPET>
+ <p>
+ It may be more efficient to declare such a variable used in a
+ loop outside that loop:
+ </p>
+ <CODE_SNIPPET>
+ Foo f; // My ctor and dtor get called once each.
+ for (int i = 0; i &lt; 1000000; ++i) {
+ f.DoSomething(i);
+ }
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Static and Global Variables">
+ <SUMMARY>
+ Static or global variables of class type are forbidden: they cause
+ hard-to-find bugs due to indeterminate order of construction and
+ destruction.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Objects with static storage duration, including global variables,
+ static variables, static class member variables, and function static
+ variables, must be Plain Old Data (POD): only ints, chars, floats, or
+ pointers, or arrays/structs of POD.
+ </p>
+ <p>
+ The order in which class constructors and initializers for
+ static variables are called is only partially specified in C++ and can
+ even change from build to build, which can cause bugs that are difficult
+ to find. Therefore in addition to banning globals of class type, we do
+ not allow static POD variables to be initialized with the result of a
+ function, unless that function (such as getenv(), or getpid()) does not
+ itself depend on any other globals.
+ </p>
+ <p>
+ Likewise, the order in which destructors are called is defined to be the
+ reverse of the order in which the constructors were called. Since
+ constructor order is indeterminate, so is destructor order.
+ For example, at program-end time a static variable might have
+ been destroyed, but code still running -- perhaps in another thread --
+ tries to access it and fails. Or the destructor for a static 'string'
+ variable might be run prior to the destructor for another variable that
+ contains a reference to that string.
+ </p>
+ <p>
+ As a result we only allow static variables to contain POD data. This
+ rule completely disallows <code>vector</code> (use C arrays instead), or
+ <code>string</code> (use <code>const char []</code>).
+ </p>
+
+ <p>
+ If you need a static or global variable of a class type, consider
+ initializing a pointer (which will never be freed), from either your
+ main() function or from pthread_once(). Note that this must be a raw
+ pointer, not a "smart" pointer, since the smart pointer's destructor
+ will have the order-of-destructor issue that we are trying to avoid.
+ </p>
+
+
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+
+<CATEGORY title="Classes">
+ Classes are the fundamental unit of code in C++. Naturally, we use
+ them extensively. This section lists the main dos and don'ts you
+ should follow when writing a class.
+
+ <STYLEPOINT title="Doing Work in Constructors">
+ <SUMMARY>
+ In general, constructors should merely set member variables to their
+ initial values. Any complex initialization should go in an explicit
+ <code>Init()</code> method.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ It is possible to perform initialization in the body of the
+ constructor.
+ </DEFINITION>
+ <PROS>
+ Convenience in typing. No need to worry about whether the
+ class has been initialized or not.
+ </PROS>
+ <CONS>
+ The problems with doing work in constructors are:
+ <ul>
+ <li> There is no easy way for constructors to signal errors,
+ short of using exceptions (which are
+ <a HREF="#Exceptions">forbidden</a>).
+ </li>
+ <li> If the work fails, we now have an object whose
+ initialization code failed, so it may be an
+ indeterminate state.
+ </li>
+ <li> If the work calls virtual functions, these calls will
+ not get dispatched to the subclass implementations.
+ Future modification to your class can quietly introduce
+ this problem even if your class is not currently
+ subclassed, causing much confusion.
+ </li>
+ <li> If someone creates a global variable of this type
+ (which is against the rules, but still), the
+ constructor code will be called before
+ <code>main()</code>, possibly breaking some implicit
+ assumptions in the constructor code. For instance,
+
+ <a href="http://google-gflags.googlecode.com/">gflags</a>
+ will not yet have been initialized.
+ </li>
+ </ul>
+ </CONS>
+ <DECISION>
+ If your object requires non-trivial initialization, consider
+ having an explicit <code>Init()</code> method. In particular,
+ constructors should not call virtual functions, attempt to raise
+ errors, access potentially uninitialized global variables, etc.
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Default Constructors">
+ <SUMMARY>
+ You must define a default constructor if your class defines
+ member variables and has no other constructors. Otherwise the
+ compiler will do it for you, badly.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ The default constructor is called when we <code>new</code> a
+ class object with no arguments. It is always called when
+ calling <code>new[]</code> (for arrays).
+ </DEFINITION>
+ <PROS>
+ Initializing structures by default, to hold "impossible"
+ values, makes debugging much easier.
+ </PROS>
+ <CONS>
+ Extra work for you, the code writer.
+ </CONS>
+ <DECISION>
+ <p>
+ If your class defines member variables and has no other
+ constructors you must define a default constructor (one that
+ takes no arguments). It should preferably initialize the
+ object in such a way that its internal state is consistent
+ and valid.
+ </p>
+ <p>
+ The reason for this is that if you have no other
+ constructors and do not define a default constructor, the
+ compiler will generate one for you. This compiler
+ generated constructor may not initialize your object
+ sensibly.
+ </p>
+ <p>
+ If your class inherits from an existing class but you add no
+ new member variables, you are not required to have a default
+ constructor.
+
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Explicit Constructors">
+ <SUMMARY>
+ Use the C++ keyword <code>explicit</code> for constructors with
+ one argument.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ Normally, if a constructor takes one argument, it can be used
+ as a conversion. For instance, if you define
+ <code>Foo::Foo(string name)</code> and then pass a string to a
+ function that expects a <code>Foo</code>, the constructor will
+ be called to convert the string into a <code>Foo</code> and
+ will pass the <code>Foo</code> to your function for you. This
+ can be convenient but is also a source of trouble when things
+ get converted and new objects created without you meaning them
+ to. Declaring a constructor <code>explicit</code> prevents it
+ from being invoked implicitly as a conversion.
+ </DEFINITION>
+ <PROS>
+ Avoids undesirable conversions.
+ </PROS>
+ <CONS>
+ None.
+ </CONS>
+ <DECISION>
+ <p>
+ We require all single argument constructors to be
+ explicit. Always put <code>explicit</code> in front of
+ one-argument constructors in the class definition:
+ <code>explicit Foo(string name);</code>
+ </p>
+ <p>
+ The exception is copy constructors, which, in the rare
+ cases when we allow them, should probably not be
+ <code>explicit</code>.
+
+ Classes that are intended to be
+ transparent wrappers around other classes are also
+ exceptions.
+ Such exceptions should be clearly marked with comments.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Copy Constructors">
+ <SUMMARY>
+ Provide a copy constructor and assignment operator only when necessary.
+ Otherwise, disable them with <code>DISALLOW_COPY_AND_ASSIGN</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ The copy constructor and assignment operator are used to create copies
+ of objects. The copy constructor is implicitly invoked by the
+ compiler in some situations, e.g. passing objects by value.
+ </DEFINITION>
+ <PROS>
+ Copy constructors make it easy to copy objects. STL
+ containers require that all contents be copyable and
+ assignable. Copy constructors can be more efficient than
+ <code>CopyFrom()</code>-style workarounds because they combine
+ construction with copying, the compiler can elide them in some
+ contexts, and they make it easier to avoid heap allocation.
+ </PROS>
+ <CONS>
+ Implicit copying of objects in C++ is a rich source of bugs
+ and of performance problems. It also reduces readability, as
+ it becomes hard to track which objects are being passed around
+ by value as opposed to by reference, and therefore where
+ changes to an object are reflected.
+ </CONS>
+ <DECISION>
+ <p>
+ Few classes need to be copyable. Most should have neither a
+ copy constructor nor an assignment operator. In many situations,
+ a pointer or reference will work just as well as a copied value,
+ with better performance. For example, you can pass function
+ parameters by reference or pointer instead of by value, and you can
+ store pointers rather than objects in an STL container.
+ </p>
+ <p>
+ If your class needs to be copyable, prefer providing a copy method,
+ such as <code>CopyFrom()</code> or <code>Clone()</code>, rather than
+ a copy constructor, because such methods cannot be invoked
+ implicitly. If a copy method is insufficient in your situation
+ (e.g. for performance reasons, or because your class needs to be
+ stored by value in an STL container), provide both a copy
+ constructor and assignment operator.
+ </p>
+ <p>
+ If your class does not need a copy constructor or assignment
+ operator, you must explicitly disable them.
+
+
+ To do so, add dummy declarations for the copy constructor and
+ assignment operator in the <code>private:</code> section of your
+ class, but do not provide any corresponding definition (so that
+ any attempt to use them results in a link error).
+ </p>
+ <p>
+ For convenience, a <code>DISALLOW_COPY_AND_ASSIGN</code> macro
+ can be used:
+ </p>
+ <CODE_SNIPPET>
+ // A macro to disallow the copy constructor and operator= functions
+ // This should be used in the private: declarations for a class
+ #define DISALLOW_COPY_AND_ASSIGN(TypeName) \
+ TypeName(const TypeName&amp;); \
+ void operator=(const TypeName&amp;)
+ </CODE_SNIPPET>
+ <p>
+ Then, in <code>class Foo</code>:
+ </p>
+ <CODE_SNIPPET>
+ class Foo {
+ public:
+ Foo(int f);
+ ~Foo();
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(Foo);
+ };
+ </CODE_SNIPPET>
+ <p>
+ </p>
+
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Structs vs. Classes">
+ <SUMMARY>
+ Use a <code>struct</code> only for passive objects that carry data;
+ everything else is a <code>class</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The <code>struct</code> and <code>class</code> keywords behave
+ almost identically in C++. We add our own semantic meanings
+ to each keyword, so you should use the appropriate keyword for
+ the data-type you're defining.
+ </p>
+ <p>
+ <code>structs</code> should be used for passive objects that carry
+ data, and may have associated constants, but lack any functionality
+ other than access/setting the data members. The
+ accessing/setting of fields is done by directly accessing the
+ fields rather than through method invocations. Methods should
+ not provide behavior but should only be used to set up the
+ data members, e.g., constructor, destructor,
+ <code>Initialize()</code>, <code>Reset()</code>,
+ <code>Validate()</code>.
+ </p>
+ <p>
+ If more functionality is required, a <code>class</code> is more
+ appropriate. If in doubt, make it a <code>class</code>.
+ </p>
+ <p>
+ For consistency with STL, you can use <code>struct</code>
+ instead of <code>class</code> for functors and traits.
+ </p>
+ <p>
+ Note that member variables in structs and classes have
+ <a HREF="#Variable_Names">different naming rules</a>.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Inheritance">
+ <SUMMARY>
+ Composition is often more appropriate than inheritance. When
+ using inheritance, make it <code>public</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ When a sub-class inherits from a base class, it includes the
+ definitions of all the data and operations that the parent
+ base class defines. In practice, inheritance is used in two
+ major ways in C++: implementation inheritance, in which
+ actual code is inherited by the child, and <A HREF="#Interfaces">interface inheritance</A>, in which only
+ method names are inherited.
+ </DEFINITION>
+ <PROS>
+ Implementation inheritance reduces code size by re-using the
+ base class code as it specializes an existing type. Because
+ inheritance is a compile-time declaration, you and the
+ compiler can understand the operation and detect errors.
+ Interface inheritance can be used to programmatically enforce
+ that a class expose a particular API. Again, the compiler
+ can detect errors, in this case, when a class does not define
+ a necessary method of the API.
+ </PROS>
+ <CONS>
+ For implementation inheritance, because the code implementing
+ a sub-class is spread between the base and the sub-class, it
+ can be more difficult to understand an implementation. The
+ sub-class cannot override functions that are not virtual, so
+ the sub-class cannot change implementation. The base class
+ may also define some data members, so that specifies physical
+ layout of the base class.
+ </CONS>
+ <DECISION>
+ <p>
+ All inheritance should be <code>public</code>. If you want to
+ do private inheritance, you should be including an instance of
+ the base class as a member instead.
+ </p>
+ <p>
+ Do not overuse implementation inheritance. Composition is
+ often more appropriate. Try to restrict use of inheritance
+ to the "is-a" case: <code>Bar</code> subclasses
+ <code>Foo</code> if it can reasonably be said that
+ <code>Bar</code> "is a kind of" <code>Foo</code>.
+ </p>
+ <p>
+ Make your destructor <code>virtual</code> if necessary. If
+ your class has virtual methods, its destructor
+
+ should be virtual.
+ </p>
+ <p>
+ Limit the use of <code>protected</code> to those member
+ functions that might need to be accessed from subclasses.
+ Note that <a href="#Access_Control">data members should
+ be private</a>.
+ </p>
+ <p>
+ When redefining an inherited virtual function, explicitly
+ declare it <code>virtual</code> in the declaration of the
+ derived class. Rationale: If <code>virtual</code> is
+ omitted, the reader has to check all ancestors of the
+ class in question to determine if the function is virtual
+ or not.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Multiple Inheritance">
+ <SUMMARY>
+ Only very rarely is multiple implementation inheritance actually
+ useful. We allow multiple inheritance only when at most one of
+ the base classes has an implementation; all other base classes
+ must be <A HREF="#Interfaces">pure interface</A> classes tagged
+ with the <code>Interface</code> suffix.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ Multiple inheritance allows a sub-class to have more than one
+ base class. We distinguish between base classes that are
+ <em>pure interfaces</em> and those that have an
+ <em>implementation</em>.
+ </DEFINITION>
+ <PROS>
+ Multiple implementation inheritance may let you re-use even more code
+ than single inheritance (see <a HREF="#Inheritance">Inheritance</a>).
+ </PROS>
+ <CONS>
+ Only very rarely is multiple <em>implementation</em>
+ inheritance actually useful. When multiple implementation
+ inheritance seems like the solution, you can usually find a
+ different, more explicit, and cleaner solution.
+ </CONS>
+ <DECISION>
+ Multiple inheritance is allowed only when all superclasses, with the
+ possible exception of the first one, are <A HREF="#Interfaces">pure
+ interfaces</A>. In order to ensure that they remain pure interfaces,
+ they must end with the <code>Interface</code> suffix.
+ <SUBSECTION title="Note:">
+ There is an <a HREF="#Windows_Code">exception</a> to this
+ rule on Windows.
+ </SUBSECTION>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Interfaces">
+ <SUMMARY>
+ Classes that satisfy certain conditions are allowed, but not required, to
+ end with an <code>Interface</code> suffix.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ <p>
+ A class is a pure interface if it meets the following requirements:
+ </p>
+ <ul>
+ <li> It has only public pure virtual ("<code>= 0</code>") methods
+ and static methods (but see below for destructor).
+ </li>
+ <li> It may not have non-static data members.
+ </li>
+ <li> It need not have any constructors defined. If a constructor is
+ provided, it must take no arguments and it must be protected.
+ </li>
+ <li> If it is a subclass, it may only be derived from classes
+ that satisfy these conditions and are tagged with the
+ <code>Interface</code> suffix.
+ </li>
+ </ul>
+ <p>
+ An interface class can never be directly instantiated
+ because of the pure virtual method(s) it declares. To make
+ sure all implementations of the interface can be destroyed
+ correctly, they must also declare a virtual destructor (in
+ an exception to the first rule, this should not be pure). See
+ Stroustrup, <cite>The C++ Programming Language</cite>, 3rd
+ edition, section 12.4 for details.
+ </p>
+ </DEFINITION>
+ <PROS>
+ Tagging a class with the <code>Interface</code> suffix lets
+ others know that they must not add implemented methods or non
+ static data members. This is particularly important in the case of
+ <A HREF="#Multiple_Inheritance">multiple inheritance</A>.
+ Additionally, the interface concept is already well-understood by
+ Java programmers.
+ </PROS>
+ <CONS>
+ The <code>Interface</code> suffix lengthens the class name, which
+ can make it harder to read and understand. Also, the interface
+ property may be considered an implementation detail that shouldn't
+ be exposed to clients.
+ </CONS>
+ <DECISION>
+ A class may end with <code>Interface</code> only if it meets the
+ above requirements. We do not require the converse, however:
+ classes that meet the above requirements are not required to end
+ with <code>Interface</code>.
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Operator Overloading">
+ <SUMMARY>
+ Do not overload operators except in rare, special circumstances.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ A class can define that operators such as <code>+</code> and
+ <code>/</code> operate on the class as if it were a built-in
+ type.
+ </DEFINITION>
+ <PROS>
+ Can make code appear more intuitive because a class will
+ behave in the same way as built-in types (such as
+ <code>int</code>). Overloaded operators are more playful
+ names for functions that are less-colorfully named, such as
+ <code>Equals()</code> or <code>Add()</code>. For some
+ template functions to work correctly, you may need to define
+ operators.
+ </PROS>
+ <CONS>
+ While operator overloading can make code more intuitive, it
+ has several drawbacks:
+ <ul>
+ <li> It can fool our intuition into thinking that expensive
+ operations are cheap, built-in operations.
+ </li>
+ <li> It is much harder to find the call sites for overloaded
+ operators. Searching for <code>Equals()</code> is much
+ easier than searching for relevant invocations of
+ <code>==</code>.
+ </li>
+ <li> Some operators work on pointers too, making it easy to
+ introduce bugs. <code>Foo + 4</code> may do one thing,
+ while <code>&amp;Foo + 4</code> does something totally
+ different. The compiler does not complain for either of
+ these, making this very hard to debug.
+ </li>
+ </ul>
+ Overloading also has surprising ramifications. For instance,
+ if a class overloads unary <code>operator&amp;</code>, it
+ cannot safely be forward-declared.
+ </CONS>
+ <DECISION>
+ <p>
+ In general, do not overload operators. The assignment operator
+ (<code>operator=</code>), in particular, is insidious and
+ should be avoided. You can define functions like
+ <code>Equals()</code> and <code>CopyFrom()</code> if you
+ need them. Likewise, avoid the dangerous
+ unary <code>operator&amp;</code> at all costs, if there's
+ any possibility the class might be forward-declared.
+ </p>
+ <p>
+ However, there may be rare cases where you need to overload
+ an operator to interoperate with templates or "standard" C++
+ classes (such as <code>operator&lt;&lt;(ostream&amp;, const
+ T&amp;)</code> for logging). These are acceptable if fully
+ justified, but you should try to avoid these whenever
+ possible. In particular, do not overload <code>operator==</code>
+ or <code>operator&lt;</code> just so that your class can be
+ used as a key in an STL container; instead, you should
+ create equality and comparison functor types when declaring
+ the container.
+ </p>
+ <p>
+ Some of the STL algorithms do require you to overload
+ <code>operator==</code>, and you may do so in these cases,
+ provided you document why.
+ </p>
+ <p>
+ See also <a HREF="#Copy_Constructors">Copy Constructors</a>
+ and <a HREF="#Function_Overloading">Function
+ Overloading</a>.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Access Control">
+ <SUMMARY>
+ Make data members <code>private</code>, and provide
+ access to them through accessor functions as needed (for
+ technical reasons, we allow data members of a test fixture class
+ to be <code>protected</code> when using
+
+ <A HREF="http://code.google.com/p/googletest/">
+ Google Test</A>). Typically a variable would be
+ called <code>foo_</code> and the accessor function
+ <code>foo()</code>. You may also want a mutator function
+ <code>set_foo()</code>.
+ Exception: <code>static const</code> data members (typically
+ called <code>kFoo</code>) need not be <code>private</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The definitions of accessors are usually inlined in the header
+ file.
+ </p>
+ <p>
+ See also <a HREF="#Inheritance">Inheritance</a> and <a HREF="#Function_Names">Function Names</a>.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Declaration Order">
+ <SUMMARY>
+ Use the specified order of declarations within a class:
+ <code>public:</code> before <code>private:</code>, methods
+ before data members (variables), etc.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Your class definition should start with its <code>public:</code>
+ section, followed by its <code>protected:</code> section and
+ then its <code>private:</code> section. If any of these sections
+ are empty, omit them.
+ </p>
+ <p>
+ Within each section, the declarations generally should be in
+ the following order:
+ </p>
+ <ul>
+ <li> Typedefs and Enums</li>
+ <li> Constants (<code>static const</code> data members)</li>
+ <li> Constructors</li>
+ <li> Destructor</li>
+ <li> Methods, including static methods</li>
+ <li> Data Members (except <code>static const</code> data members)</li>
+ </ul>
+ <p>
+ Friend declarations should always be in the private section, and
+ the <code>DISALLOW_COPY_AND_ASSIGN</code> macro invocation
+ should be at the end of the <code>private:</code> section. It
+ should be the last thing in the class. See <a HREF="#Copy_Constructors">Copy Constructors</a>.
+ </p>
+ <p>
+ Method definitions in the corresponding <code>.cc</code> file
+ should be the same as the declaration order, as much as possible.
+ </p>
+ <p>
+ Do not put large method definitions inline in the class
+ definition. Usually, only trivial or performance-critical,
+ and very short, methods may be defined inline. See <a HREF="#Inline_Functions">Inline Functions</a> for more
+ details.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Write Short Functions">
+ <SUMMARY>
+ Prefer small and focused functions.
+ </SUMMARY>
+ <BODY>
+ <p>
+ We recognize that long functions are sometimes appropriate, so
+ no hard limit is placed on functions length. If a function
+ exceeds about 40 lines, think about whether it can be broken
+ up without harming the structure of the program.
+ </p>
+ <p>
+ Even if your long function works perfectly now, someone
+ modifying it in a few months may add new behavior. This could
+ result in bugs that are hard to find. Keeping your functions
+ short and simple makes it easier for other people to read and
+ modify your code.
+ </p>
+ <p>
+ You could find long and complicated functions when working
+ with
+
+ some
+ code. Do not be intimidated by modifying existing
+ code: if working with such a function proves to be difficult,
+ you find that errors are hard to debug, or you want to use a
+ piece of it in several different contexts, consider breaking
+ up the function into smaller and more manageable pieces.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+
+<CATEGORY title="Google-Specific Magic">
+
+ <p>
+ There are various tricks and utilities that we use to make C++
+ code more robust, and various ways we use C++ that may differ from
+ what you see elsewhere.
+ </p>
+
+
+
+ <STYLEPOINT title="Smart Pointers">
+
+ <SUMMARY>
+ If you actually need pointer semantics, <code>scoped_ptr</code>
+ is great. You should only use <code>std::tr1::shared_ptr</code>
+ with a non-const referent when it is truly necessary to share ownership
+ of an object (e.g. inside an STL container). You should never use
+ <code>auto_ptr</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ "Smart" pointers are objects that act like pointers, but automate
+ management of the underlying memory.
+ </DEFINITION>
+ <PROS>
+ Smart pointers are extremely useful for preventing memory leaks, and
+ are essential for writing exception-safe code. They also formalize
+ and document the ownership of dynamically allocated memory.
+ </PROS>
+ <CONS>
+ We prefer designs in which objects have single, fixed owners. Smart
+ pointers which enable sharing or transfer of ownership can act as a
+ tempting alternative to a careful design of ownership semantics,
+ leading to confusing code and even bugs in which memory is never
+ deleted. The semantics of smart pointers (especially
+ <code>auto_ptr</code>) can be nonobvious and confusing. The
+ exception-safety benefits of smart pointers are not decisive, since
+ we do not allow exceptions.
+ </CONS>
+ <DECISION>
+ <dl>
+ <dt><code>scoped_ptr</code></dt>
+ <dd>Straightforward and risk-free. Use wherever appropriate.</dd>
+ <dt><code>auto_ptr</code></dt>
+ <dd>Confusing and bug-prone ownership-transfer semantics. Do not use.
+ </dd>
+ <dt><code>shared_ptr</code></dt>
+ <dd>
+ Safe with const referents (i.e. <code>shared_ptr&lt;const
+ T&gt;</code>). Reference-counted pointers with non-const referents
+ can occasionally be the best design, but try to rewrite with single
+ owners where possible.
+ </dd>
+ </dl>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="cpplint">
+ <SUMMARY>
+ Use
+ <code>cpplint.py</code>
+ to detect style errors.
+ </SUMMARY>
+ <BODY>
+ <p>
+ <code>cpplint.py</code>
+ is a tool that reads a source file and
+ identifies many style errors. It is not perfect, and has both false
+ positives and false negatives, but it is still a valuable tool. False
+ positives can be ignored by putting <code>// NOLINT</code> at
+ the end of the line.
+ </p>
+
+ <p>
+ Some projects have instructions on how to run <code>cpplint.py</code>
+ from their project tools. If the project you are contributing to does
+ not, you can download <A HREF="http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py"><code>cpplint.py</code></A> separately.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+
+</CATEGORY>
+
+<CATEGORY title="Other C++ Features">
+ <STYLEPOINT title="Reference Arguments">
+ <SUMMARY>
+ All parameters passed by reference must be labeled
+ <code>const</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ In C, if a function needs to modify a variable, the
+ parameter must use a pointer, eg <code>int foo(int
+ *pval)</code>. In C++, the function can alternatively
+ declare a reference parameter: <code>int foo(int
+ &amp;val)</code>.
+ </DEFINITION>
+ <PROS>
+ Defining a parameter as reference avoids ugly code like
+ <code>(*pval)++</code>. Necessary for some applications like
+ copy constructors. Makes it clear, unlike with pointers, that
+ <code>NULL</code> is not a possible value.
+ </PROS>
+ <CONS>
+ References can be confusing, as they have value syntax but
+ pointer semantics.
+ </CONS>
+ <DECISION>
+ <p>
+ Within function parameter lists all references must be
+ <code>const</code>:
+ </p>
+ <CODE_SNIPPET>
+ void Foo(const string &amp;in, string *out);
+ </CODE_SNIPPET>
+ <p>
+ In fact it is a very strong convention in Google code that input
+ arguments are values or <code>const</code> references while
+ output arguments are pointers. Input parameters may be
+ <code>const</code> pointers, but we never allow
+ non-<code>const</code> reference parameters.
+ </p>
+ <p>
+ One case when you might want an input parameter to be a
+ <code>const</code> pointer is if you want to emphasize that the
+ argument is not copied, so it must exist for the lifetime of the
+ object; it is usually best to document this in comments as
+ well. STL adapters such as <code>bind2nd</code> and
+ <code>mem_fun</code> do not permit reference parameters, so
+ you must declare functions with pointer parameters in these
+ cases, too.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Overloading">
+ <SUMMARY>
+ Use overloaded functions (including constructors) only if a
+ reader looking at a call site can get a good idea of what is
+ happening without having to first figure out exactly which
+ overload is being called.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ <p>
+ You may write a function that takes a
+ <code>const string&amp;</code> and overload it with another that
+ takes <code>const char*</code>.
+ </p>
+ <CODE_SNIPPET>
+ class MyClass {
+ public:
+ void Analyze(const string &amp;text);
+ void Analyze(const char *text, size_t textlen);
+ };
+ </CODE_SNIPPET>
+ </DEFINITION>
+ <PROS>
+ Overloading can make code more intuitive by allowing an
+ identically-named function to take different arguments. It
+ may be necessary for templatized code, and it can be
+ convenient for Visitors.
+ </PROS>
+ <CONS>
+ If a function is overloaded by the argument types alone, a
+ reader may have to understand C++'s complex matching rules in
+ order to tell what's going on. Also many people are confused
+ by the semantics of inheritance if a derived class overrides
+ only some of the variants of a function.
+ </CONS>
+ <DECISION>
+ If you want to overload a function, consider qualifying the
+ name with some information about the arguments, e.g.,
+ <code>AppendString()</code>, <code>AppendInt()</code> rather
+ than just <code>Append()</code>.
+
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Default Arguments">
+ <SUMMARY>
+ We do not allow default function parameters, except in
+ a few uncommon situations explained below.
+ </SUMMARY>
+ <BODY>
+ <PROS>
+ Often you have a function that uses lots of default values,
+ but occasionally you want to override the defaults. Default
+ parameters allow an easy way to do this without having to
+ define many functions for the rare exceptions.
+ </PROS>
+ <CONS>
+ People often figure out how to use an
+ API by looking at existing code that uses it.
+ Default parameters are more difficult to maintain because
+ copy-and-paste from previous code may not reveal all the
+ parameters. Copy-and-pasting of code segments can cause major
+ problems when the default arguments are not appropriate for
+ the new code.
+ </CONS>
+ <DECISION>
+ <p>
+ Except as described below, we require all arguments to be
+ explicitly specified, to force programmers to consider the API
+ and the values they are passing for each argument rather than
+ silently accepting defaults they may not be aware of.
+ </p>
+ <p>
+ One specific exception is when default arguments are used to
+ simulate variable-length argument lists.
+ </p>
+ <CODE_SNIPPET>
+ // Support up to 4 params by using a default empty AlphaNum.
+ string StrCat(const AlphaNum &amp;a,
+ const AlphaNum &amp;b = gEmptyAlphaNum,
+ const AlphaNum &amp;c = gEmptyAlphaNum,
+ const AlphaNum &amp;d = gEmptyAlphaNum);
+ </CODE_SNIPPET>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Variable-Length Arrays and alloca()">
+ <SUMMARY>
+ We do not allow variable-length arrays or <code>alloca()</code>.
+ </SUMMARY>
+ <BODY>
+ <PROS>
+ Variable-length arrays have natural-looking syntax. Both
+ variable-length arrays and <code>alloca()</code> are very
+ efficient.
+ </PROS>
+ <CONS>
+ Variable-length arrays and alloca are not part of Standard
+ C++. More importantly, they allocate a data-dependent amount
+ of stack space that can trigger difficult-to-find memory
+ overwriting bugs: "It ran fine on my machine, but dies
+ mysteriously in production".
+ </CONS>
+
+ <DECISION>
+ Use a safe allocator instead, such as
+ <code>scoped_ptr</code>/<code>scoped_array</code>.
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Friends">
+ <SUMMARY>
+ We allow use of <code>friend</code> classes and functions,
+ within reason.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Friends should usually be defined in the same file so that the
+ reader does not have to look in another file to find uses of
+ the private members of a class. A common use of
+ <code>friend</code> is to have a <code>FooBuilder</code> class
+ be a friend of <code>Foo</code> so that it can construct the
+ inner state of <code>Foo</code> correctly, without exposing
+ this state to the world. In some cases it may be useful to
+ make a unittest class a friend of the class it tests.
+ </p>
+ <p>
+ Friends extend, but do not break, the encapsulation
+ boundary of a class. In some cases this is better than making
+ a member public when you want to give only one other class
+ access to it. However, most classes should interact with
+ other classes solely through their public members.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Exceptions">
+ <SUMMARY>
+ We do not use C++ exceptions.
+ </SUMMARY>
+ <BODY>
+ <PROS>
+ <ul>
+ <li>Exceptions allow higher levels of an application to
+ decide how to handle "can't happen" failures in deeply
+ nested functions, without the obscuring and error-prone
+ bookkeeping of error codes.</li>
+
+
+
+ <li>Exceptions are used by most other modern
+ languages. Using them in C++ would make it more consistent with
+ Python, Java, and the C++ that others are familiar with.</li>
+
+ <li>Some third-party C++ libraries use exceptions, and turning
+ them off internally makes it harder to integrate with those
+ libraries.</li>
+
+ <li>Exceptions are the only way for a constructor to fail.
+ We can simulate this with a factory function or an
+ <code>Init()</code> method, but these require heap
+ allocation or a new "invalid" state, respectively.</li>
+
+ <li>Exceptions are really handy in testing frameworks.</li>
+ </ul>
+ </PROS>
+ <CONS>
+ <ul>
+ <li>When you add a <code>throw</code> statement to an existing
+ function, you must examine all of its transitive callers. Either
+ they must make at least the basic exception safety guarantee, or
+ they must never catch the exception and be happy with the
+ program terminating as a result. For instance, if
+ <code>f()</code> calls <code>g()</code> calls
+ <code>h()</code>, and <code>h</code> throws an exception
+ that <code>f</code> catches, <code>g</code> has to be
+ careful or it may not clean up properly.</li>
+
+ <li>More generally, exceptions make the control flow of
+ programs difficult to evaluate by looking at code: functions
+ may return in places you don't expect. This causes
+ maintainability and debugging difficulties. You can minimize
+ this cost via some rules on how and where exceptions can be
+ used, but at the cost of more that a developer needs to know
+ and understand.</li>
+
+ <li>Exception safety requires both RAII and different coding
+ practices. Lots of supporting machinery is needed to make
+ writing correct exception-safe code easy. Further, to avoid
+ requiring readers to understand the entire call graph,
+ exception-safe code must isolate logic that writes to
+ persistent state into a "commit" phase. This will have both
+ benefits and costs (perhaps where you're forced to obfuscate
+ code to isolate the commit). Allowing exceptions would force
+ us to always pay those costs even when they're not worth
+ it.</li>
+
+ <li>Turning on exceptions adds data to each binary produced,
+ increasing compile time (probably slightly) and possibly
+ increasing address space pressure.
+ </li>
+
+ <li>The availability of exceptions may encourage developers
+ to throw them when they are not appropriate or recover from
+ them when it's not safe to do so. For example, invalid user
+ input should not cause exceptions to be thrown. We would
+ need to make the style guide even longer to document these
+ restrictions!</li>
+ </ul>
+ </CONS>
+ <DECISION>
+ <p>
+ On their face, the benefits of using exceptions outweigh the
+ costs, especially in new projects. However, for existing code,
+ the introduction of exceptions has implications on all dependent
+ code. If exceptions can be propagated beyond a new project, it
+ also becomes problematic to integrate the new project into
+ existing exception-free code. Because most existing C++ code at
+ Google is not prepared to deal with exceptions, it is
+ comparatively difficult to adopt new code that generates
+ exceptions.
+ </p>
+ <p>
+ Given that Google's existing code is not exception-tolerant, the
+ costs of using exceptions are somewhat greater than the costs in
+ a new project. The conversion process would be slow and
+ error-prone. We don't believe that the available alternatives to
+ exceptions, such as error codes and assertions, introduce a
+ significant burden.
+
+ </p>
+ <p>
+ Our advice against using exceptions is not predicated on
+ philosophical or moral grounds, but practical ones.
+
+ Because we'd like to use our open-source
+ projects at Google and it's difficult to do so if those projects
+ use exceptions, we need to advise against exceptions in Google
+ open-source projects as well.
+ Things would probably be different if we had to do it all over
+ again from scratch.
+ </p>
+ <p>
+ There is an <a HREF="#Windows_Code">exception</a> to this
+ rule (no pun intended) for Windows code.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Run-Time Type Information (RTTI)">
+ <SUMMARY>
+ We do not use Run Time Type Information (RTTI).
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ RTTI allows a programmer to query the C++ class of an
+ object at run time.
+ </DEFINITION>
+ <PROS>
+ <p>
+ It is useful in some unittests. For example, it is useful in
+ tests of factory classes where the test has to verify that a
+ newly created object has the expected dynamic type.
+ </p>
+ <p>
+ In rare circumstances, it is useful even outside of
+ tests.
+ </p>
+ </PROS>
+ <CONS>
+ A query of type during run-time typically means a
+ design problem. If you need to know the type of an
+ object at runtime, that is often an indication that
+ you should reconsider the design of your class.
+ </CONS>
+ <DECISION>
+ <p>
+ Do not use RTTI, except in unittests. If you find yourself
+ in need of writing code that behaves differently based on
+ the class of an object, consider one of the alternatives to
+ querying the type.
+ </p>
+ <p>
+ Virtual methods are the preferred way of executing different
+ code paths depending on a specific subclass type. This puts
+ the work within the object itself.
+ </p>
+ <p>
+ If the work belongs outside the object and instead in some
+ processing code, consider a double-dispatch solution, such
+ as the Visitor design pattern. This allows a facility
+ outside the object itself to determine the type of class
+ using the built-in type system.
+ </p>
+ <p>
+ If you think you truly cannot use those ideas,
+
+ you may use RTTI. But think twice
+ about it. :-) Then think twice again.
+ Do not hand-implement an RTTI-like workaround. The arguments
+ against RTTI apply just as much to workarounds like class
+ hierarchies with type tags.
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Casting">
+ <SUMMARY>
+ Use C++ casts like <code>static_cast&lt;&gt;()</code>. Do not use
+ other cast formats like <code>int y = (int)x;</code> or
+ <code>int y = int(x);</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ C++ introduced a different cast system from C that
+ distinguishes the types of cast operations.
+ </DEFINITION>
+ <PROS>
+ The problem with C casts is the ambiguity of the operation;
+ sometimes you are doing a <em>conversion</em> (e.g.,
+ <code>(int)3.5</code>) and sometimes you are doing a
+ <em>cast</em> (e.g., <code>(int)"hello"</code>); C++ casts
+ avoid this. Additionally C++ casts are more visible when
+ searching for them.
+ </PROS>
+ <CONS>
+ The syntax is nasty.
+ </CONS>
+ <DECISION>
+ <p>
+ Do not use C-style casts. Instead, use these C++-style
+ casts.
+
+ </p>
+ <ul>
+
+ <li> Use <code>static_cast</code> as the equivalent of a
+ C-style cast that does value conversion, or when you need to explicitly up-cast
+ a pointer from a class to its superclass.
+ </li>
+ <li> Use <code>const_cast</code> to remove the <code>const</code>
+ qualifier (see <a HREF="#Use_of_const">const</a>).
+ </li>
+
+
+ <li> Use <code>reinterpret_cast</code> to do unsafe
+ conversions of pointer types to and from integer and
+ other pointer types. Use this only if you know what you are
+ doing and you understand the aliasing issues.
+
+ </li>
+ <li> Do not use <code>dynamic_cast</code> except in test code.
+ If you need to know type information at runtime in this way
+ outside of a unittest, you probably have a <A HREF="#Run-Time_Type_Information__RTTI_">design
+ flaw</A>.
+ </li>
+ </ul>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Streams">
+ <SUMMARY>
+ Use streams only for logging.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ Streams are a replacement for <code>printf()</code> and
+ <code>scanf()</code>.
+ </DEFINITION>
+ <PROS>
+ With streams, you do not need to know the type of the object
+ you are printing. You do not have problems with format
+ strings not matching the argument list. (Though with gcc, you
+ do not have that problem with <code>printf</code> either.) Streams
+ have automatic constructors and destructors that open and close the
+ relevant files.
+ </PROS>
+ <CONS>
+ Streams make it difficult to do functionality like
+ <code>pread()</code>. Some formatting (particularly the common
+ format string idiom <code>%.*s</code>) is difficult if not
+ impossible to do efficiently using streams without using
+ <code>printf</code>-like hacks. Streams do not support operator
+ reordering (the <code>%1s</code> directive), which is helpful for
+ internationalization.
+ </CONS>
+ <DECISION>
+
+ <p>
+ Do not use streams, except where required by a logging interface.
+ Use <code>printf</code>-like routines instead.
+ </p>
+ <p>
+ There are various pros and cons to using streams, but in
+ this case, as in many other cases, consistency trumps the
+ debate. Do not use streams in your code.
+ </p>
+
+ <SUBSECTION title="Extended Discussion">
+ <p>
+ There has been debate on this issue, so this explains the
+ reasoning in greater depth. Recall the Only One Way
+ guiding principle: we want to make sure that whenever we
+ do a certain type of I/O, the code looks the same in all
+ those places. Because of this, we do not want to allow
+ users to decide between using streams or using
+ <code>printf</code> plus Read/Write/etc. Instead, we should
+ settle on one or the other. We made an exception for logging
+ because it is a pretty specialized application, and for
+ historical reasons.
+ </p>
+ <p>
+ Proponents of streams have argued that streams are the obvious
+ choice of the two, but the issue is not actually so clear. For
+ every advantage of streams they point out, there is an
+ equivalent disadvantage. The biggest advantage is that
+ you do not need to know the type of the object to be
+ printing. This is a fair point. But, there is a
+ downside: you can easily use the wrong type, and the
+ compiler will not warn you. It is easy to make this
+ kind of mistake without knowing when using streams.
+ </p>
+ <CODE_SNIPPET>
+ cout &lt;&lt; this; // Prints the address
+ cout &lt;&lt; *this; // Prints the contents
+ </CODE_SNIPPET>
+ <p>
+ The compiler does not generate an error because
+ <code>&lt;&lt;</code> has been overloaded. We discourage
+ overloading for just this reason.
+ </p>
+ <p>
+ Some say <code>printf</code> formatting is ugly and hard to
+ read, but streams are often no better. Consider the following
+ two fragments, both with the same typo. Which is easier to
+ discover?
+ </p>
+ <CODE_SNIPPET>
+ cerr &lt;&lt; "Error connecting to '" &lt;&lt; foo-&gt;bar()-&gt;hostname.first
+ &lt;&lt; ":" &lt;&lt; foo-&gt;bar()-&gt;hostname.second &lt;&lt; ": " &lt;&lt; strerror(errno);
+
+ fprintf(stderr, "Error connecting to '%s:%u: %s",
+ foo-&gt;bar()-&gt;hostname.first, foo-&gt;bar()-&gt;hostname.second,
+ strerror(errno));
+ </CODE_SNIPPET>
+ <p>
+ And so on and so forth for any issue you might bring up.
+ (You could argue, "Things would be better with the right
+ wrappers," but if it is true for one scheme, is it not
+ also true for the other? Also, remember the goal is to
+ make the language smaller, not add yet more machinery that
+ someone has to learn.)
+ </p>
+ <p>
+ Either path would yield different advantages and
+ disadvantages, and there is not a clearly superior
+ solution. The simplicity doctrine mandates we settle on
+ one of them though, and the majority decision was on
+ <code>printf</code> + <code>read</code>/<code>write</code>.
+ </p>
+ </SUBSECTION>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Preincrement and Predecrement">
+ <SUMMARY>
+ Use prefix form (<code>++i</code>) of the increment and
+ decrement operators with iterators and other template objects.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ When a variable is incremented (<code>++i</code> or
+ <code>i++</code>) or decremented (<code>--i</code> or
+ <code>i--</code>) and the value of the expression is not used,
+ one must decide whether to preincrement (decrement) or
+ postincrement (decrement).
+ </DEFINITION>
+ <PROS>
+ When the return value is ignored, the "pre" form
+ (<code>++i</code>) is never less efficient than the "post"
+ form (<code>i++</code>), and is often more efficient. This is
+ because post-increment (or decrement) requires a copy of
+ <code>i</code> to be made, which is the value of the
+ expression. If <code>i</code> is an iterator or other
+ non-scalar type, copying <code>i</code> could be expensive.
+ Since the two types of increment behave the same when the
+ value is ignored, why not just always pre-increment?
+ </PROS>
+ <CONS>
+ The tradition developed, in C, of using post-increment when
+ the expression value is not used, especially in <code>for</code>
+ loops. Some find post-increment easier to read, since the
+ "subject" (<code>i</code>) precedes the "verb" (<code>++</code>),
+ just like in English.
+ </CONS>
+ <DECISION>
+ For simple scalar (non-object) values there is no reason to
+ prefer one form and we allow either. For iterators and other
+ template types, use pre-increment.
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Use of const">
+ <SUMMARY>
+ We strongly recommend that you use <code>const</code> whenever
+ it makes sense to do so.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ Declared variables and parameters can be preceded by the
+ keyword <code>const</code> to indicate the variables are not
+ changed (e.g., <code>const int foo</code>). Class functions
+ can have the <code>const</code> qualifier to indicate the
+ function does not change the state of the class member
+ variables (e.g., <code>class Foo { int Bar(char c) const;
+ };</code>).
+ </DEFINITION>
+ <PROS>
+ Easier for people to understand how variables are being used.
+ Allows the compiler to do better type checking, and,
+ conceivably, generate better code. Helps people convince
+ themselves of program correctness because they know the
+ functions they call are limited in how they can modify your
+ variables. Helps people know what functions are safe to use
+ without locks in multi-threaded programs.
+ </PROS>
+ <CONS>
+ <code>const</code> is viral: if you pass a <code>const</code>
+ variable to a function, that function must have <code>const</code>
+ in its prototype (or the variable will need a
+ <code>const_cast</code>). This can be a particular problem
+ when calling library functions.
+ </CONS>
+ <DECISION>
+ <p>
+ <code>const</code> variables, data members, methods and
+ arguments add a level of compile-time type checking; it
+ is better to detect errors as soon as possible.
+ Therefore we strongly recommend that you use
+ <code>const</code> whenever it makes sense to do so:
+ </p>
+ <ul>
+ <li> If a function does not modify an argument passed by
+ reference or by pointer, that argument should be
+ <code>const</code>.
+ </li>
+ <li> Declare methods to be <code>const</code> whenever
+ possible. Accessors should almost always be
+ <code>const</code>. Other methods should be const if they do
+ not modify any data members, do not call any
+ non-<code>const</code> methods, and do not return a
+ non-<code>const</code> pointer or non-<code>const</code>
+ reference to a data member.
+ </li>
+ <li> Consider making data members <code>const</code>
+ whenever they do not need to be modified after
+ construction.
+ </li>
+ </ul>
+ <p>
+ However, do not go crazy with <code>const</code>. Something like
+ <code>const int * const * const x;</code> is likely
+ overkill, even if it accurately describes how const x is.
+ Focus on what's really useful to know: in this case,
+ <code>const int** x</code> is probably sufficient.
+ </p>
+ <p>
+ The <code>mutable</code> keyword is allowed but is unsafe
+ when used with threads, so thread safety should be carefully
+ considered first.
+ </p>
+ </DECISION>
+ <SUBSECTION title="Where to put the const">
+ <p>
+ Some people favor the form <code>int const *foo</code> to
+ <code>const int* foo</code>. They argue that this is more
+ readable because it's more consistent: it keeps the rule
+ that <code>const</code> always follows the object it's
+ describing. However, this consistency argument doesn't
+ apply in this case, because the "don't go crazy" dictum
+ eliminates most of the uses you'd have to be consistent with.
+
+ Putting the <code>const</code> first is arguably more readable,
+ since it follows English in putting the "adjective"
+ (<code>const</code>) before the "noun" (<code>int</code>).
+ </p>
+ <p>
+ That said, while we encourage putting <code>const</code> first,
+ we do not require it. But be consistent with the code around
+ you!
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Integer Types">
+ <SUMMARY>
+ Of the built-in C++ integer types, the only one used
+
+ is <code>int</code>. If a program needs a variable of a different
+ size, use
+
+ a precise-width integer type from
+ <code>&lt;stdint.h&gt;</code>, such as <code>int16_t</code>.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ C++ does not specify the sizes of its integer types. Typically
+ people assume that <code>short</code> is 16 bits,
+ <code>int</code> is 32 bits, <code>long</code> is 32 bits and
+ <code>long long</code> is 64 bits.
+ </DEFINITION>
+ <PROS>
+ Uniformity of declaration.
+ </PROS>
+ <CONS>
+ The sizes of integral types in C++ can vary based on compiler
+ and architecture.
+ </CONS>
+ <DECISION>
+ <p>
+
+ <code>&lt;stdint.h&gt;</code> defines
+ types like <code>int16_t</code>, <code>uint32_t</code>,
+ <code>int64_t</code>, etc.
+ You should always use those in preference to
+ <code>short</code>, <code>unsigned long long</code> and the
+ like, when you need a guarantee on the size of an integer.
+ Of the C integer types, only <code>int</code> should be
+ used. When appropriate, you are welcome to use standard
+ types like <code>size_t</code> and <code>ptrdiff_t</code>.
+ </p>
+ <p>
+ We use <code>int</code> very often, for integers we know are not
+ going to be too big, e.g., loop counters. Use plain old
+ <code>int</code> for such things. You should assume that an
+ <code>int</code> is
+
+ at least 32 bits,
+ but don't assume that it has more than 32 bits.
+ If you need a 64-bit integer type, use
+ <code>int64_t</code> or
+ <code>uint64_t</code>.
+ </p>
+ <p>
+ For integers we know can be "big",
+ use
+ <code>int64_t</code>.
+
+ </p>
+ <p>
+ You should not use the unsigned integer types such as
+ <code>uint32_t</code>,
+ unless the quantity you are representing is really a bit pattern
+ rather than a number, or unless you need defined
+ twos-complement overflow. In particular, do not use unsigned
+ types to say a number will never be negative. Instead, use
+
+ assertions for this.
+ </p>
+
+ </DECISION>
+
+ <SUBSECTION title="On Unsigned Integers">
+ <p>
+ Some people, including some textbook authors, recommend
+ using unsigned types to represent numbers that are never
+ negative. This is intended as a form of self-documentation.
+ However, in C, the advantages of such documentation are
+ outweighed by the real bugs it can introduce. Consider:
+ </p>
+ <CODE_SNIPPET>
+ for (unsigned int i = foo.Length()-1; i &gt;= 0; --i) ...
+ </CODE_SNIPPET>
+ <p>
+ This code will never terminate! Sometimes gcc will notice
+ this bug and warn you, but often it will not. Equally bad
+ bugs can occur when comparing signed and unsigned
+ variables. Basically, C's type-promotion scheme causes
+ unsigned types to behave differently than one might expect.
+ </p>
+ <p>
+ So, document that a variable is non-negative using
+ assertions.
+ Don't use an unsigned type.
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="64-bit Portability">
+ <SUMMARY>
+ Code should be 64-bit and 32-bit friendly. Bear in mind problems of
+ printing, comparisons, and structure alignment.
+ </SUMMARY>
+ <BODY>
+ <ul>
+ <li>
+ <p>
+ <code>printf()</code> specifiers for some types are
+ not cleanly portable between 32-bit and 64-bit
+ systems. C99 defines some portable format
+ specifiers. Unfortunately, MSVC 7.1 does not
+ understand some of these specifiers and the
+ standard is missing a few, so we have to define our
+ own ugly versions in some cases (in the style of the
+ standard include file <code>inttypes.h</code>):
+ </p>
+ <CODE_SNIPPET>
+ // printf macros for size_t, in the style of inttypes.h
+ #ifdef _LP64
+ #define __PRIS_PREFIX "z"
+ #else
+ #define __PRIS_PREFIX
+ #endif
+
+ // Use these macros after a % in a printf format string
+ // to get correct 32/64 bit behavior, like this:
+ // size_t size = records.size();
+ // printf("%"PRIuS"\n", size);
+
+ #define PRIdS __PRIS_PREFIX "d"
+ #define PRIxS __PRIS_PREFIX "x"
+ #define PRIuS __PRIS_PREFIX "u"
+ #define PRIXS __PRIS_PREFIX "X"
+ #define PRIoS __PRIS_PREFIX "o"
+ </CODE_SNIPPET>
+ <table border="1" summary="portable printf specifiers">
+ <TBODY>
+ <tr align="center">
+ <th>Type</th>
+ <th>DO NOT use</th>
+ <th>DO use</th>
+ <th>Notes</th>
+ </tr>
+ <tr align="center">
+ <td><code>void *</code> (or any pointer)</td>
+ <td><code>%lx</code></td>
+ <td><code>%p</code></td>
+ <td> </td>
+ </tr>
+
+ <tr align="center">
+ <td><code>int64_t</code></td>
+ <td><code>%qd</code>,
+ <code>%lld</code></td>
+ <td><code>%"PRId64"</code></td>
+ <td/>
+ </tr>
+
+ <tr align="center">
+ <td><code>uint64_t</code></td>
+ <td><code>%qu</code>,
+ <code>%llu</code>,
+ <code>%llx</code></td>
+ <td><code>%"PRIu64"</code>,
+ <code>%"PRIx64"</code></td>
+ <td/>
+ </tr>
+
+ <tr align="center">
+ <td><code>size_t</code></td>
+ <td><code>%u</code></td>
+ <td><code>%"PRIuS"</code>,
+ <code>%"PRIxS"</code></td>
+ <td>C99 specifies <code>%zu</code></td>
+ </tr>
+ <tr align="center">
+ <td><code>ptrdiff_t</code></td>
+ <td><code>%d</code></td>
+ <td><code>%"PRIdS"</code></td>
+ <td>C99 specifies <code>%zd</code></td>
+ </tr>
+
+ </TBODY>
+ </table>
+ <p>
+ Note that the <code>PRI*</code> macros expand to independent
+ strings which are concatenated by the compiler. Hence
+ if you are using a non-constant format string, you
+ need to insert the value of the macro into the format,
+ rather than the name. It is still possible, as usual,
+ to include length specifiers, etc., after the
+ <code>%</code> when using the <code>PRI*</code>
+ macros. So, e.g. <code>printf("x = %30"PRIuS"\n",
+ x)</code> would expand on 32-bit Linux to
+ <code>printf("x = %30" "u" "\n", x)</code>, which the
+ compiler will treat as <code>printf("x = %30u\n",
+ x)</code>.
+ </p>
+
+ </li>
+
+ <li> Remember that <code>sizeof(void *)</code> !=
+ <code>sizeof(int)</code>. Use <code>intptr_t</code> if
+ you want a pointer-sized integer.
+ </li>
+
+ <li> You may need to be careful with structure alignments,
+ particularly for structures being stored on disk. Any
+ class/structure with a
+
+ <code>int64_t</code>/<code>uint64_t</code>
+ member will by default end up being 8-byte aligned on a 64-bit
+ system. If you have such structures being shared on disk
+ between 32-bit and 64-bit code, you will need to ensure
+ that they are packed the same on both architectures.
+
+ Most compilers offer a way to alter
+ structure alignment. For gcc, you can use
+ <code>__attribute__((packed))</code>. MSVC offers
+ <code>#pragma pack()</code> and
+ <code>__declspec(align())</code>.
+ </li>
+
+ <li>
+
+ Use the <code>LL</code> or <code>ULL</code> suffixes as
+ needed to create 64-bit constants. For example:
+
+ <CODE_SNIPPET>
+ int64_t my_value = 0x123456789LL;
+ uint64_t my_mask = 3ULL &lt;&lt; 48;
+ </CODE_SNIPPET>
+ </li>
+
+ <li> If you really need different code on 32-bit and 64-bit
+ systems, use <code>#ifdef _LP64</code> to choose between
+ the code variants. (But please avoid this if
+ possible, and keep any such changes localized.)
+ </li>
+ </ul>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Preprocessor Macros">
+ <SUMMARY>
+ Be very cautious with macros. Prefer inline functions, enums,
+ and <code>const</code> variables to macros.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Macros mean that the code you see is not the same as the code
+ the compiler sees. This can introduce unexpected behavior,
+ especially since macros have global scope.
+ </p>
+ <p>
+ Luckily, macros are not nearly as necessary in C++ as they are
+ in C. Instead of using a macro to inline performance-critical
+ code, use an inline function. Instead of using a macro to
+ store a constant, use a <code>const</code> variable. Instead of
+ using a macro to "abbreviate" a long variable name, use a
+ reference. Instead of using a macro to conditionally compile code
+ ... well, don't do that at all (except, of course, for the
+ <code>#define</code> guards to prevent double inclusion of
+ header files). It makes testing much more difficult.
+ </p>
+ <p>
+ Macros can do things these other techniques cannot, and you do
+ see them in the codebase, especially in the lower-level
+ libraries. And some of their special features (like
+ stringifying, concatenation, and so forth) are not available
+ through the language proper. But before using a macro,
+ consider carefully whether there's a non-macro way to achieve
+ the same result.
+ </p>
+ <p>
+ The following usage pattern will avoid many problems with
+ macros; if you use macros, follow it whenever possible:
+ </p>
+ <ul>
+ <li> Don't define macros in a <code>.h</code> file.
+ </li>
+ <li> <code>#define</code> macros right before you use them,
+ and <code>#undef</code> them right after.
+ </li>
+ <li> Do not just <code>#undef</code> an existing macro before
+ replacing it with your own; instead, pick a name that's
+ likely to be unique.
+ </li>
+ <li> Try not to use macros that expand to unbalanced C++
+ constructs, or at least document that behavior well.
+ </li>
+ <li> Prefer not using <code>##</code> to generate function/class/variable
+ names.
+ </li>
+ </ul>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="0 and NULL">
+ <SUMMARY>
+ Use <code>0</code> for integers, <code>0.0</code> for reals,
+ <code>NULL</code> for pointers, and <code>'\0'</code> for chars.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Use <code>0</code> for integers and <code>0.0</code> for reals.
+ This is not controversial.
+ </p>
+ <p>
+ For pointers (address values), there is a choice between <code>0</code>
+ and <code>NULL</code>. Bjarne Stroustrup prefers an unadorned
+ <code>0</code>. We prefer <code>NULL</code> because it looks like a
+ pointer. In fact, some C++ compilers, such as gcc 4.1.0, provide special
+ definitions of <code>NULL</code> which enable them to give useful
+ warnings, particularly in situations where <code>sizeof(NULL)</code>
+ is not equal to <code>sizeof(0)</code>.
+ </p>
+ <p>
+ Use <code>'\0'</code> for chars.
+ This is the correct type and also makes code more readable.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="sizeof">
+ <SUMMARY>
+ Use <code>sizeof(<var>varname</var>)</code> instead of
+ <code>sizeof(<var>type</var>)</code> whenever possible.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Use <code>sizeof(<var>varname</var>)</code> because it will update
+ appropriately if the type of the variable changes.
+ <code>sizeof(<var>type</var>)</code> may make sense in some cases,
+ but should generally be avoided because it can fall out of sync if
+ the variable's type changes.
+ </p>
+ <p>
+ <CODE_SNIPPET>
+ Struct data;
+ memset(&amp;data, 0, sizeof(data));
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ memset(&amp;data, 0, sizeof(Struct));
+ </BAD_CODE_SNIPPET>
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Boost">
+ <SUMMARY>
+ Use only approved libraries from the Boost library collection.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ The <a href="http://www.boost.org/">Boost library collection</a> is
+ a popular collection of peer-reviewed, free, open-source C++ libraries.
+ </DEFINITION>
+ <PROS>
+ Boost code is generally very high-quality, is widely portable, and fills
+ many important gaps in the C++ standard library, such as type traits,
+ better binders, and better smart pointers. It also provides an
+ implementation of the TR1 extension to the standard library.
+ </PROS>
+ <CONS>
+ Some Boost libraries encourage coding practices which can hamper
+ readability, such as metaprogramming and other advanced template
+ techniques, and an excessively "functional" style of programming.
+
+ </CONS>
+ <DECISION>
+
+ <div>
+
+ In order to maintain a high level of readability for all contributors
+ who might read and maintain code, we only allow an approved subset of
+ Boost features. Currently, the following libraries are permitted:
+ <ul>
+ <li> <a href="http://www.boost.org/libs/utility/call_traits.htm">
+ Call Traits</a> from <code>boost/call_traits.hpp</code>
+ </li>
+ <li> <a href="http://www.boost.org/libs/utility/compressed_pair.htm">
+ Compressed Pair</a> from <code>boost/compressed_pair.hpp</code>
+ </li>
+ <li> <a href="http://www.boost.org/libs/ptr_container/">
+ Pointer Container</a> from <code>boost/ptr_container</code> except
+ serialization and wrappers for containers not in the C++03
+ standard (<code>ptr_circular_buffer.hpp</code> and
+ <code>ptr_unordered*</code>)
+ </li>
+ <li> <a href="http://www.boost.org/libs/array/">
+ Array</a> from <code>boost/array.hpp</code>
+ </li>
+ <li> <a href="http://www.boost.org/libs/graph/">
+ The Boost Graph Library (BGL)</a> from <code>boost/graph</code>,
+ except serialization (<code>adj_list_serialize.hpp</code>) and
+ parallel/distributed algorithms and data structures
+ (<code>boost/graph/parallel/*</code> and
+ <code>boost/graph/distributed/*</code>).
+ </li>
+ <li> <a href="http://www.boost.org/libs/property_map/">
+ Property Map</a> from <code>boost/property_map</code>, except
+ parallel/distributed property maps
+ (<code>boost/property_map/parallel/*</code>).
+ </li>
+ <li> The part of
+ <a href="http://www.boost.org/libs/iterator/">
+ Iterator</a> that deals with defining iterators:
+ <code>boost/iterator/iterator_adaptor.hpp</code>,
+ <code>boost/iterator/iterator_facade.hpp</code>, and
+ <code>boost/function_output_iterator.hpp</code></li>
+ </ul>
+ We are actively considering adding other Boost features to the list, so
+ this rule may be relaxed in the future.
+ </div>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="C++0x">
+ <SUMMARY>
+ Use only approved libraries and language extensions from C++0x.
+ Currently, none are approved.
+ </SUMMARY>
+ <BODY>
+ <DEFINITION>
+ C++0x is the next ISO C++ standard, currently in
+ <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2010/n3092.pdf">final
+ committee draft</a> form. It contains
+ <a href="http://en.wikipedia.org/wiki/C%2B%2B0x">significant
+ changes</a> both to the language and libraries.
+ </DEFINITION>
+ <PROS>
+ We expect that C++0x will become the next standard, and eventually will
+ be supported by most C++ compilers. It standardizes some common C++
+ extensions that we use already, allows shorthands for some operations,
+ and has some safety improvements.
+ </PROS>
+ <CONS>
+ <p>
+ The C++0x standard is substantialy more complex than its predecessor
+ (1,300 pages versus 800 pages), and is
+ unfamilar to many developers. The long-term effects of some
+ features on code readability and maintenance are unknown. We cannot
+ predict when its various features will be implemented uniformly by
+ tools that may be of interest (gcc, icc, clang, Eclipse, etc.).
+ </p>
+ <p>
+ As with <a href="#Boost">Boost</a>, some C++0x extensions encourage
+ coding practices that hamper readability&#8212;for example by removing
+ checked redundancy (such as type names) that may be helpful to readers,
+ or by encouraging template metaprogramming. Other extensions
+ duplicate functionality available through existing
+ mechanisms, which may lead to
+ confusion and conversion costs.
+ </p>
+ </CONS>
+ <DECISION>
+ Use only C++0x libraries and language features that have been approved
+ for use. Currently, no such features are approved.
+ Features will be approved individually as appropriate.
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+</CATEGORY>
+
+<CATEGORY title="Naming">
+ <p>
+ The most important consistency rules are those that govern
+ naming. The style of a name immediately informs us what sort of
+ thing the named entity is: a type, a variable, a function, a
+ constant, a macro, etc., without requiring us to search for the
+ declaration of that entity. The pattern-matching engine in our
+ brains relies a great deal on these naming rules.
+
+ </p>
+ <p>
+ Naming rules are pretty arbitrary, but
+
+ we feel that consistency is more important than individual preferences
+ in this area, so regardless of whether you find them sensible or not,
+ the rules are the rules.
+ </p>
+
+ <STYLEPOINT title="General Naming Rules">
+ <SUMMARY>
+ Function names, variable names, and filenames should be
+ descriptive; eschew abbreviation. Types and variables should be
+ nouns, while functions should be "command" verbs.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="How to Name">
+ <p>
+ Give as descriptive a name as possible, within reason. Do
+ not worry about saving horizontal space as it is far more
+ important to make your code immediately understandable by a
+ new reader. Examples of well-chosen names:
+ </p>
+ <CODE_SNIPPET>
+ int num_errors; // Good.
+ int num_completed_connections; // Good.
+ </CODE_SNIPPET>
+ <p>
+ Poorly-chosen names use ambiguous abbreviations or arbitrary
+ characters that do not convey meaning:
+ </p>
+ <BAD_CODE_SNIPPET>
+ int n; // Bad - meaningless.
+ int nerr; // Bad - ambiguous abbreviation.
+ int n_comp_conns; // Bad - ambiguous abbreviation.
+ </BAD_CODE_SNIPPET>
+ <p>
+ Type and variable names should typically be nouns: e.g.,
+ <code>FileOpener</code>,
+
+ <code>num_errors</code>.
+ </p>
+ <p>
+ Function names should typically be imperative (that is they
+ should be commands): e.g., <code>OpenFile()</code>,
+ <code>set_num_errors()</code>. There is an exception for
+ accessors, which, described more completely in <a HREF="#Function_Names">Function Names</a>, should be named
+ the same as the variable they access.
+ </p>
+ </SUBSECTION>
+
+ <SUBSECTION title="Abbreviations">
+ <p>
+ Do not use abbreviations unless they are extremely well
+ known outside your project. For example:
+ </p>
+ <CODE_SNIPPET>
+ // Good
+ // These show proper names with no abbreviations.
+ int num_dns_connections; // Most people know what "DNS" stands for.
+ int price_count_reader; // OK, price count. Makes sense.
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ // Bad!
+ // Abbreviations can be confusing or ambiguous outside a small group.
+ int wgc_connections; // Only your group knows what this stands for.
+ int pc_reader; // Lots of things can be abbreviated "pc".
+ </BAD_CODE_SNIPPET>
+ <p>
+ Never abbreviate by leaving out letters:
+ </p>
+ <CODE_SNIPPET>
+ int error_count; // Good.
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ int error_cnt; // Bad.
+ </BAD_CODE_SNIPPET>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="File Names">
+ <SUMMARY>
+ Filenames should be all lowercase and can include underscores
+ (<code>_</code>) or dashes (<code>-</code>). Follow the
+ convention that your
+
+ project
+ uses. If there is no consistent local pattern to follow, prefer "_".
+ </SUMMARY>
+ <BODY>
+ <p>
+ Examples of acceptable file names:
+ </p>
+ <p>
+ <code>
+ my_useful_class.cc<br/>
+ my-useful-class.cc<br/>
+ myusefulclass.cc<br/>
+ myusefulclass_test.cc // _unittest and _regtest are deprecated.<br/>
+ </code>
+ </p>
+ <p>
+ C++ files should end in <code>.cc</code> and header files
+ should end in <code>.h</code>.
+ </p>
+ <p>
+ Do not use filenames that already exist
+ in <code>/usr/include</code>, such as <code>db.h</code>.
+ </p>
+ <p>
+ In general, make your filenames very specific. For example,
+ use <code>http_server_logs.h</code> rather
+ than <code>logs.h</code>. A very common case is to have a
+ pair of files called, e.g., <code>foo_bar.h</code>
+ and <code>foo_bar.cc</code>, defining a class
+ called <code>FooBar</code>.
+ </p>
+ <p>
+ Inline functions must be in a <code>.h</code> file. If your
+ inline functions are very short, they should go directly into your
+ <code>.h</code> file. However, if your inline functions
+ include a lot of code, they may go into a third file that
+ ends in <code>-inl.h</code>. In a class with a lot of inline
+ code, your class could have three files:
+ </p>
+ <CODE_SNIPPET>
+ url_table.h // The class declaration.
+ url_table.cc // The class definition.
+ url_table-inl.h // Inline functions that include lots of code.
+ </CODE_SNIPPET>
+ <p>
+ See also the section <a href="#The_-inl.h_Files">-inl.h Files</a>
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Type Names">
+ <SUMMARY>
+ Type names start with a capital letter and have a capital
+ letter for each new word, with no underscores:
+ <code>MyExcitingClass</code>, <code>MyExcitingEnum</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The names of all types &#8212; classes, structs, typedefs, and enums
+ &#8212; have the same naming convention. Type names should start
+ with a capital letter and have a capital letter for each new
+ word. No underscores. For example:
+ </p>
+ <CODE_SNIPPET>
+ // classes and structs
+ class UrlTable { ...
+ class UrlTableTester { ...
+ struct UrlTableProperties { ...
+
+ // typedefs
+ typedef hash_map&lt;UrlTableProperties *, string&gt; PropertiesMap;
+
+ // enums
+ enum UrlTableErrors { ...
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Variable Names">
+ <SUMMARY>
+ Variable names are all lowercase, with underscores between
+ words. Class member variables have trailing underscores. For
+ instance: <code>my_exciting_local_variable</code>,
+ <code>my_exciting_member_variable_</code>.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Common Variable names">
+ <p>
+ For example:
+ </p>
+ <CODE_SNIPPET>
+ string table_name; // OK - uses underscore.
+ string tablename; // OK - all lowercase.
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ string tableName; // Bad - mixed case.
+ </BAD_CODE_SNIPPET>
+ </SUBSECTION>
+
+ <SUBSECTION title="Class Data Members">
+ <p>
+ Data members (also called instance variables or member
+ variables) are lowercase with optional underscores like
+ regular variable names, but always end with a trailing
+ underscore.
+ </p>
+ <CODE_SNIPPET>
+ string table_name_; // OK - underscore at end.
+ string tablename_; // OK.
+ </CODE_SNIPPET>
+ </SUBSECTION>
+
+ <SUBSECTION title="Struct Variables">
+ <p>
+ Data members in structs should be named like regular
+ variables without the trailing underscores that data members
+ in classes have.
+ </p>
+ <CODE_SNIPPET>
+ struct UrlTableProperties {
+ string name;
+ int num_entries;
+ }
+ </CODE_SNIPPET>
+ <p>
+ See <a HREF="#Structs_vs._Classes">Structs vs. Classes</a> for a
+ discussion of when to use a struct versus a class.
+ </p>
+ </SUBSECTION>
+
+ <SUBSECTION title="Global Variables">
+ <p>
+ There are no special requirements for global variables,
+ which should be rare in any case, but if you use one,
+ consider prefixing it with <code>g_</code> or some other
+ marker to easily distinguish it from local variables.
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Constant Names">
+ <SUMMARY>
+ Use a <code>k</code> followed by mixed case:
+ <code>kDaysInAWeek</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ All compile-time constants, whether they are declared locally,
+ globally, or as part of a class, follow a slightly different
+ naming convention from other variables. Use a <code>k</code>
+ followed by words with uppercase first letters:
+ </p>
+ <CODE_SNIPPET>
+ const int kDaysInAWeek = 7;
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Names">
+ <SUMMARY>
+ Regular functions have mixed case; accessors and mutators match
+ the name of the variable: <code>MyExcitingFunction()</code>,
+ <code>MyExcitingMethod()</code>,
+ <code>my_exciting_member_variable()</code>,
+ <code>set_my_exciting_member_variable()</code>.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Regular Functions">
+ <p>
+ Functions should start with a capital letter and have a
+ capital letter for each new word. No underscores.
+ </p>
+ <p>
+ If your function crashes upon an error, you should append OrDie to
+ the function name. This only applies to functions which could be
+ used by production code and to errors that are reasonably
+ likely to occur during normal operation.
+ </p>
+ <CODE_SNIPPET>
+ AddTableEntry()
+ DeleteUrl()
+ OpenFileOrDie()
+ </CODE_SNIPPET>
+ </SUBSECTION>
+
+ <SUBSECTION title="Accessors and Mutators">
+ <p>
+ Accessors and mutators (get and set functions) should match
+ the name of the variable they are getting and setting. This
+ shows an excerpt of a class whose instance variable is
+ <code>num_entries_</code>.
+ </p>
+ <CODE_SNIPPET>
+ class MyClass {
+ public:
+ ...
+ int num_entries() const { return num_entries_; }
+ void set_num_entries(int num_entries) { num_entries_ = num_entries; }
+
+ private:
+ int num_entries_;
+ };
+ </CODE_SNIPPET>
+ <p>
+ You may also use lowercase letters for other very short
+ inlined functions. For example if a function were so cheap
+ you would not cache the value if you were calling it in a
+ loop, then lowercase naming would be acceptable.
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Namespace Names">
+
+ <SUMMARY>
+ Namespace names are all lower-case, and based on project names and
+ possibly their directory structure:
+ <code>google_awesome_project</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ See <a HREF="#Namespaces">Namespaces</a> for a discussion of
+ namespaces and how to name them.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Enumerator Names">
+ <SUMMARY>
+ Enumerators should be named <i>either</i> like
+ <A HREF="#Constant_Names">constants</A> or like
+ <A HREF="#Macro_Names">macros</A>: either <code>kEnumName</code>
+ or <code>ENUM_NAME</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Preferably, the individual enumerators should be named like
+ <A HREF="#Constant_Names">constants</A>. However, it is also
+ acceptable to name them like <A HREF="#Macro_Names">macros</A>. The enumeration name,
+ <code>UrlTableErrors</code> (and
+ <code>AlternateUrlTableErrors</code>), is a type, and
+ therefore mixed case.
+ </p>
+ <CODE_SNIPPET>
+ enum UrlTableErrors {
+ kOK = 0,
+ kErrorOutOfMemory,
+ kErrorMalformedInput,
+ };
+ enum AlternateUrlTableErrors {
+ OK = 0,
+ OUT_OF_MEMORY = 1,
+ MALFORMED_INPUT = 2,
+ };
+ </CODE_SNIPPET>
+ <p>
+ Until January 2009, the style was to name enum values like
+ <A HREF="#Macro_Names">macros</A>. This caused problems with
+ name collisions between enum values and macros. Hence, the
+ change to prefer constant-style naming was put in place. New
+ code should prefer constant-style naming if possible.
+ However, there is no reason to change old code to use
+ constant-style names, unless the old names are actually
+ causing a compile-time problem.
+ </p>
+
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Macro Names">
+ <SUMMARY>
+ You're not really going to <A HREF="#Preprocessor_Macros">define
+ a macro</A>, are you? If you do, they're like this:
+ <code>MY_MACRO_THAT_SCARES_SMALL_CHILDREN</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Please see the <a href="#Preprocessor_Macros">description of
+ macros</a>; in general macros should <em>not</em> be used.
+ However, if they are absolutely needed, then they should be
+ named with all capitals and underscores.
+ </p>
+ <CODE_SNIPPET>
+ #define ROUND(x) ...
+ #define PI_ROUNDED 3.0
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Exceptions to Naming Rules">
+ <SUMMARY>
+ If you are naming something that is analogous to an existing C
+ or C++ entity then you can follow the existing naming convention
+ scheme.
+ </SUMMARY>
+ <BODY>
+ <p>
+ <dl>
+ <dt> <code>bigopen()</code> </dt>
+ <dd> function name, follows form of <code>open()</code> </dd>
+ <dt> <code>uint</code> </dt>
+ <dd> <code>typedef</code> </dd>
+ <dt> <code>bigpos</code> </dt>
+ <dd> <code>struct</code> or <code>class</code>, follows form of
+ <code>pos</code> </dd>
+ <dt> <code>sparse_hash_map</code> </dt>
+ <dd> STL-like entity; follows STL naming conventions </dd>
+ <dt> <code>LONGLONG_MAX</code> </dt>
+ <dd> a constant, as in <code>INT_MAX</code> </dd>
+ </dl>
+ </p>
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+
+<CATEGORY title="Comments">
+ <p>
+ Though a pain to write, comments are absolutely vital to keeping our
+ code readable. The following rules describe what you should
+ comment and where. But remember: while comments are very
+ important, the best code is self-documenting. Giving sensible
+ names to types and variables is much better than using obscure
+ names that you must then explain through comments.
+ </p>
+ <p>
+ When writing your comments, write for your audience: the next
+
+ contributor
+ who will need to understand your code. Be generous &#8212; the next
+ one may be you!
+ </p>
+
+
+
+ <STYLEPOINT title="Comment Style">
+ <SUMMARY>
+ Use either the <code>//</code> or <code>/* */</code> syntax, as long
+ as you are consistent.
+ </SUMMARY>
+ <BODY>
+ <p>
+ You can use either the <code>//</code> or the <code>/* */</code>
+ syntax; however, <code>//</code> is <em>much</em> more common.
+ Be consistent with how you comment and what style you use where.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="File Comments">
+ <SUMMARY>
+ Start each file with a copyright notice, followed by a
+ description of the contents of the file.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Legal Notice and Author Line">
+
+
+ <p>
+ Every file should contain the following items, in order:
+ <ul>
+ <li>a copyright statement (for example,
+ <code>Copyright 2008 Google Inc.</code>)</li>
+ <li>a license boilerplate. Choose the appropriate boilerplate
+ for the license used by the project (for example,
+ Apache 2.0, BSD, LGPL, GPL)</li>
+ <li>an author line to identify the original author of the
+ file</li>
+ </ul>
+ </p>
+ <p>
+ If you make significant changes to a file that someone else
+ originally wrote, add yourself to the author line. This can
+ be very helpful when another
+
+ contributor
+ has questions about the file and needs to know whom to contact
+ about it.
+ </p>
+ </SUBSECTION>
+
+ <SUBSECTION title="File Contents">
+ <p>
+ Every file should have a comment at the top, below the copyright
+ notice and author line, that describes the contents of the file.
+ </p>
+ <p>
+ Generally a <code>.h</code> file will describe the classes
+ that are declared in the file with an overview of what they
+ are for and how they are used. A <code>.cc</code> file
+ should contain more information about implementation details
+ or discussions of tricky algorithms. If you feel the
+ implementation details or a discussion of the algorithms
+ would be useful for someone reading the <code>.h</code>,
+ feel free to put it there instead, but mention in the
+ <code>.cc</code> that the documentation is in the
+ <code>.h</code> file.
+ </p>
+ <p>
+ Do not duplicate comments in both the <code>.h</code> and
+ the <code>.cc</code>. Duplicated comments diverge.
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Class Comments">
+ <SUMMARY>
+ Every class definition should have an accompanying comment that
+ describes what it is for and how it should be used.
+ </SUMMARY>
+ <BODY>
+ <CODE_SNIPPET>
+ // Iterates over the contents of a GargantuanTable. Sample usage:
+ // GargantuanTableIterator* iter = table-&gt;NewIterator();
+ // for (iter-&gt;Seek("foo"); !iter-&gt;done(); iter-&gt;Next()) {
+ // process(iter-&gt;key(), iter-&gt;value());
+ // }
+ // delete iter;
+ class GargantuanTableIterator {
+ ...
+ };
+ </CODE_SNIPPET>
+ <p>
+ If you have already described a class in detail in the
+ comments at the top of your file feel free to simply state
+ "See comment at top of file for a complete description", but
+ be sure to have some sort of comment.
+ </p>
+ <p>
+ Document the synchronization assumptions the class makes, if
+ any. If an instance of the class can be accessed by multiple
+ threads, take extra care to document the rules and invariants
+ surrounding multithreaded use.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Comments">
+ <SUMMARY>
+ Declaration comments describe use of the function; comments at
+ the definition of a function describe operation.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Function Declarations">
+ <p>
+ Every function declaration should have comments immediately
+ preceding it that describe what the function does and how to
+ use it. These comments should be descriptive ("Opens the
+ file") rather than imperative ("Open the file"); the comment
+ describes the function, it does not tell the function what
+ to do. In general, these comments do not describe how the
+ function performs its task. Instead, that should be left to
+ comments in the function definition.
+ </p>
+ <p>
+ Types of things to mention in comments at the function
+ declaration:
+ </p>
+ <ul>
+ <li> What the inputs and outputs are.
+ </li>
+ <li> For class member functions: whether the object
+ remembers reference arguments beyond the
+ duration of the method call, and whether it will
+ free them or not.
+ </li>
+ <li> If the function allocates memory that the caller
+ must free.
+ </li>
+ <li> Whether any of the arguments can be <code>NULL</code>.
+ </li>
+ <li> If there are any performance implications of how a
+ function is used.
+ </li>
+ <li> If the function is re-entrant. What are its
+ synchronization assumptions?
+ </li>
+ </ul>
+ <p>
+ Here is an example:
+ </p>
+ <CODE_SNIPPET>
+ // Returns an iterator for this table. It is the client's
+ // responsibility to delete the iterator when it is done with it,
+ // and it must not use the iterator once the GargantuanTable object
+ // on which the iterator was created has been deleted.
+ //
+ // The iterator is initially positioned at the beginning of the table.
+ //
+ // This method is equivalent to:
+ // Iterator* iter = table-&gt;NewIterator();
+ // iter-&gt;Seek("");
+ // return iter;
+ // If you are going to immediately seek to another place in the
+ // returned iterator, it will be faster to use NewIterator()
+ // and avoid the extra seek.
+ Iterator* GetIterator() const;
+ </CODE_SNIPPET>
+ <p>
+ However, do not be unnecessarily verbose or state the
+ completely obvious. Notice below that it is not necessary
+ to say "returns false otherwise" because this is implied.
+ </p>
+ <CODE_SNIPPET>
+ // Returns true if the table cannot hold any more entries.
+ bool IsTableFull();
+ </CODE_SNIPPET>
+ <p>
+ When commenting constructors and destructors, remember that
+ the person reading your code knows what constructors and
+ destructors are for, so comments that just say something like
+ "destroys this object" are not useful. Document what
+ constructors do with their arguments (for example, if they
+ take ownership of pointers), and what cleanup the destructor
+ does. If this is trivial, just skip the comment. It is
+ quite common for destructors not to have a header comment.
+ </p>
+ </SUBSECTION>
+
+ <SUBSECTION title="Function Definitions">
+ <p>
+ Each function definition should have a comment describing
+ what the function does if there's anything tricky about how it does
+ its job. For example, in the definition comment you might
+ describe any coding tricks you use, give an overview of the
+ steps you go through, or explain why you chose to implement
+ the function in the way you did rather than using a viable
+ alternative. For instance, you might mention why it must
+ acquire a lock for the first half of the function but why it
+ is not needed for the second half.
+ </p>
+ <p>
+ Note you should <em>not</em> just repeat the comments given
+ with the function declaration, in the <code>.h</code> file or
+ wherever. It's okay to recapitulate briefly what the function
+ does, but the focus of the comments should be on how it does it.
+ </p>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Variable Comments">
+ <SUMMARY>
+ In general the actual name of the variable should be descriptive
+ enough to give a good idea of what the variable is used for. In
+ certain cases, more comments are required.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Class Data Members">
+ <p>
+ Each class data member (also called an instance variable or
+ member variable) should have a comment describing what it is
+ used for. If the variable can take sentinel values with
+ special meanings, such as <code>NULL</code> or -1, document this.
+ For example:
+ </p>
+ <CODE_SNIPPET>
+ private:
+ // Keeps track of the total number of entries in the table.
+ // Used to ensure we do not go over the limit. -1 means
+ // that we don't yet know how many entries the table has.
+ int num_total_entries_;
+ </CODE_SNIPPET>
+ </SUBSECTION>
+
+ <SUBSECTION title="Global Variables">
+ <p>
+ As with data members, all global variables should have a
+ comment describing what they are and what they are used for.
+ For example:
+ </p>
+ <CODE_SNIPPET>
+ // The total number of tests cases that we run through in this regression test.
+ const int kNumTestCases = 6;
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Implementation Comments">
+ <SUMMARY>
+ In your implementation you should have comments in tricky,
+ non-obvious, interesting, or important parts of your code.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="Class Data Members">
+ <p>
+ Tricky or complicated code blocks should have comments
+ before them. Example:
+ </p>
+ <CODE_SNIPPET>
+ // Divide result by two, taking into account that x
+ // contains the carry from the add.
+ for (int i = 0; i &lt; result-&gt;size(); i++) {
+ x = (x &lt;&lt; 8) + (*result)[i];
+ (*result)[i] = x &gt;&gt; 1;
+ x &amp;= 1;
+ }
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ <SUBSECTION title="Line Comments">
+ <p>
+ Also, lines that are non-obvious should get a comment at the
+ end of the line. These end-of-line comments should be
+ separated from the code by 2 spaces. Example:
+ </p>
+ <CODE_SNIPPET>
+ // If we have enough memory, mmap the data portion too.
+ mmap_budget = max&lt;int64&gt;(0, mmap_budget - index_-&gt;length());
+ if (mmap_budget &gt;= data_size_ &amp;&amp; !MmapData(mmap_chunk_bytes, mlock))
+ return; // Error already logged.
+ </CODE_SNIPPET>
+ <p>
+ Note that there are both comments that describe what the
+ code is doing, and comments that mention that an error has
+ already been logged when the function returns.
+ </p>
+ <p>
+ If you have several comments on subsequent lines, it can
+ often be more readable to line them up:
+ </p>
+ <CODE_SNIPPET>
+ DoSomething(); // Comment here so the comments line up.
+ DoSomethingElseThatIsLonger(); // Comment here so there are two spaces between
+ // the code and the comment.
+ { // One space before comment when opening a new scope is allowed,
+ // thus the comment lines up with the following comments and code.
+ DoSomethingElse(); // Two spaces before line comments normally.
+ }
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ <SUBSECTION title="NULL, true/false, 1, 2, 3...">
+ <p>
+ When you pass in <code>NULL</code>, boolean, or literal integer
+ values to functions, you should consider adding a comment about
+ what they are, or make your code self-documenting by using
+ constants. For example, compare:
+ </p>
+ <BAD_CODE_SNIPPET>
+ bool success = CalculateSomething(interesting_value,
+ 10,
+ false,
+ NULL); // What are these arguments??
+ </BAD_CODE_SNIPPET>
+ <p>
+ versus:
+ </p>
+ <CODE_SNIPPET>
+ bool success = CalculateSomething(interesting_value,
+ 10, // Default base value.
+ false, // Not the first time we're calling this.
+ NULL); // No callback.
+ </CODE_SNIPPET>
+ <p>
+ Or alternatively, constants or self-describing variables:
+ </p>
+ <CODE_SNIPPET>
+ const int kDefaultBaseValue = 10;
+ const bool kFirstTimeCalling = false;
+ Callback *null_callback = NULL;
+ bool success = CalculateSomething(interesting_value,
+ kDefaultBaseValue,
+ kFirstTimeCalling,
+ null_callback);
+ </CODE_SNIPPET>
+ </SUBSECTION>
+
+ <SUBSECTION title="Don'ts">
+ <p>
+ Note that you should <em>never</em> describe the code
+ itself. Assume that the person reading the code knows C++
+ better than you do, even though he or she does not know what
+ you are trying to do:
+ </p>
+ <BAD_CODE_SNIPPET>
+ // Now go through the b array and make sure that if i occurs,
+ // the next element is i+1.
+ ... // Geez. What a useless comment.
+ </BAD_CODE_SNIPPET>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Punctuation, Spelling and Grammar">
+ <SUMMARY>
+ Pay attention to punctuation, spelling, and grammar; it is
+ easier to read well-written comments than badly written ones.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Comments should usually be written as complete
+ sentences with proper capitalization and periods at the end.
+ Shorter comments, such as comments at the end of a line of
+ code, can sometimes be less formal, but you should be
+ consistent with your style. Complete sentences are more
+ readable, and they provide some assurance that the comment is
+ complete and not an unfinished thought.
+ </p>
+ <p>
+ Although it can be frustrating to have a code reviewer point
+ out that you are using a comma when you should be using a
+ semicolon, it is very important that source code maintain a
+ high level of clarity and readability. Proper punctuation,
+ spelling, and grammar help with that goal.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="TODO Comments">
+ <SUMMARY>
+ Use <code>TODO</code> comments for code that is temporary, a
+ short-term solution, or good-enough but not perfect.
+ </SUMMARY>
+ <BODY>
+ <p>
+ <code>TODO</code>s should include the string <code>TODO</code> in
+ all caps, followed by the
+
+ name, e-mail address, or other
+ identifier
+ of the person who can best provide context about the problem
+ referenced by the <code>TODO</code>. A colon is optional. The main
+ purpose is to have a consistent <code>TODO</code> format that can be
+ searched to find the person who can provide more details upon request.
+ A <code>TODO</code> is not a commitment that the person referenced
+ will fix the problem. Thus when you create a <code>TODO</code>, it is
+ almost always your
+
+ name
+ that is given.
+ </p>
+
+ <CODE_SNIPPET>
+ // TODO(kl@gmail.com): Use a "*" here for concatenation operator.
+ // TODO(Zeke) change this to use relations.
+ </CODE_SNIPPET>
+ <p>
+ If your <code>TODO</code> is of the form "At a future date do
+ something" make sure that you either include a very specific
+ date ("Fix by November 2005") or a very specific event
+ ("Remove this code when all clients can handle XML responses.").
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Deprecation Comments">
+ <SUMMARY>
+ Mark deprecated interface points with <code>DEPRECATED</code> comments.
+ </SUMMARY>
+ <BODY>
+ <p>
+ You can mark an interface as deprecated by writing a comment containing
+ the word <code>DEPRECATED</code> in all caps. The comment goes either
+ before the declaration of the interface or on the same line as the
+ declaration.
+ </p>
+
+ <p>
+ After the word <code>DEPRECATED</code>, write your name, e-mail address,
+ or other identifier in parentheses.
+ </p>
+ <p>
+ A deprecation comment must include simple, clear directions for people to
+ fix their callsites. In C++, you can implement a deprecated function as
+ an inline function that calls the new interface point.
+ </p>
+ <p>
+ Marking an interface point <code>DEPRECATED</code> will not magically
+ cause any callsites to change. If you want people to actually stop using
+ the deprecated facility, you will have to fix the callsites yourself or
+ recruit a crew to help you.
+ </p>
+ <p>
+ New code should not contain calls to deprecated interface points. Use
+ the new interface point instead. If you cannot understand the
+ directions, find the person who created the deprecation and ask them for
+ help using the new interface point.
+ </p>
+
+ </BODY>
+ </STYLEPOINT>
+
+</CATEGORY>
+
+<CATEGORY title="Formatting">
+ <p>
+ Coding style and formatting are pretty arbitrary, but a
+
+ project
+ is much easier to follow if everyone uses the same style. Individuals
+ may not agree with every aspect of the formatting rules, and some of
+ the rules may take some getting used to, but it is important that all
+
+ project contributors
+ follow the style rules so that
+
+ they
+ can all read and understand everyone's code easily.
+ </p>
+
+ <p>
+ To help you format code correctly, we've created a <A HREF="http://google-styleguide.googlecode.com/svn/trunk/google-c-style.el">settings
+ file for emacs</A>.
+ </p>
+
+ <STYLEPOINT title="Line Length">
+ <SUMMARY>
+ Each line of text in your code should be at most 80 characters
+ long.
+ </SUMMARY>
+ <BODY>
+
+ <p>
+ We recognize that this rule is controversial, but so much existing
+ code already adheres to it, and we feel that consistency is
+ important.
+ </p>
+ <PROS>
+ Those who favor
+
+ this rule argue
+ that it is rude to force them to resize their windows and there
+ is no need for anything longer. Some folks are used to having
+ several code windows side-by-side, and thus don't have room to
+ widen their windows in any case. People set up their work
+ environment assuming a particular maximum window width, and 80
+ columns has been the traditional standard. Why change it?
+ </PROS>
+ <CONS>
+ Proponents of change argue that a wider line can make code
+ more readable. The 80-column limit is an hidebound
+ throwback to 1960s mainframes;
+
+ modern equipment has
+ wide screens that can easily show longer lines.
+ </CONS>
+ <DECISION>
+ <p>
+
+ 80 characters is the maximum.
+ </p>
+ <p>
+ Exception: if a comment line contains an example command or
+ a literal URL longer than 80 characters, that line may be
+ longer than 80 characters for ease of cut and paste.
+ </p>
+ <p>
+ Exception: an <code>#include</code> statement with a long
+ path may exceed 80 columns. Try to avoid situations where this
+ becomes necessary.
+ </p>
+ <p>
+ Exception: you needn't be concerned about
+ <a href="#The__define_Guard">header guards</a>
+ that exceed the maximum length.
+
+ </p>
+ </DECISION>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Non-ASCII Characters">
+ <SUMMARY>
+ Non-ASCII characters should be rare, and must use UTF-8 formatting.
+ </SUMMARY>
+ <BODY>
+ <p>
+ You shouldn't hard-code user-facing text in source, even English,
+ so use of non-ASCII characters should be rare. However, in certain
+ cases it is appropriate to include such words in your code. For
+ example, if your code parses data files from foreign sources,
+ it may be appropriate to hard-code the non-ASCII string(s) used in
+ those data files as delimiters. More commonly, unittest code
+ (which does not
+
+ need to be localized) might contain non-ASCII strings. In such
+ cases, you should use UTF-8, since that is
+
+ an encoding understood by most tools able
+ to handle more than just ASCII.
+ Hex encoding is also OK, and encouraged where it enhances
+ readability &#8212; for example, <code>"\xEF\xBB\xBF"</code> is the
+ Unicode zero-width no-break space character, which would be
+ invisible if included in the source as straight UTF-8.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Spaces vs. Tabs">
+ <SUMMARY>
+ Use only spaces, and indent 2 spaces at a time.
+ </SUMMARY>
+ <BODY>
+ <p>
+ We use spaces for indentation. Do not use tabs in your code.
+ You should set your editor to emit spaces when you hit the tab
+ key.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Declarations and Definitions">
+ <SUMMARY>
+ Return type on the same line as function name, parameters on the
+ same line if they fit.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Functions look like this:
+ </p>
+ <CODE_SNIPPET>
+ ReturnType ClassName::FunctionName(Type par_name1, Type par_name2) {
+ DoSomething();
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ If you have too much text to fit on one line:
+ </p>
+ <CODE_SNIPPET>
+ ReturnType ClassName::ReallyLongFunctionName(Type par_name1, Type par_name2,
+ Type par_name3) {
+ DoSomething();
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ or if you cannot fit even the first parameter:
+ </p>
+ <CODE_SNIPPET>
+ ReturnType LongClassName::ReallyReallyReallyLongFunctionName(
+ Type par_name1, // 4 space indent
+ Type par_name2,
+ Type par_name3) {
+ DoSomething(); // 2 space indent
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ Some points to note:
+ </p>
+ <ul>
+ <li> The return type is always on the same line as the
+ function name.
+ </li>
+ <li> The open parenthesis is always on the same line as the
+ function name.
+ </li>
+ <li> There is never a space between the function name and the
+ open parenthesis.
+ </li>
+ <li> There is never a space between the parentheses and the
+ parameters.
+ </li>
+ <li> The open curly brace is always at the end of the same
+ line as the last parameter.
+ </li>
+ <li> The close curly brace is either on the last line by itself
+ or (if other style rules permit) on the same line as the
+ open curly brace.
+ </li>
+ <li> There should be a space between the close parenthesis and
+ the open curly brace.
+ </li>
+ <li> All parameters should be named, with identical names in the
+ declaration and implementation.
+ </li>
+ <li> All parameters should be aligned if possible.
+ </li>
+ <li> Default indentation is 2 spaces.
+ </li>
+ <li> Wrapped parameters have a 4 space indent.
+ </li>
+ </ul>
+ <p>
+ If your function is <code>const</code>, the <code>const</code>
+ keyword should be on the same line as the last parameter:
+ </p>
+ <CODE_SNIPPET>
+ // Everything in this function signature fits on a single line
+ ReturnType FunctionName(Type par) const {
+ ...
+ }
+
+ // This function signature requires multiple lines, but
+ // the const keyword is on the line with the last parameter.
+ ReturnType ReallyLongFunctionName(Type par1,
+ Type par2) const {
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ If some parameters are unused, comment out the variable name in the
+ function definition:
+ </p>
+ <CODE_SNIPPET>
+ // Always have named parameters in interfaces.
+ class Shape {
+ public:
+ virtual void Rotate(double radians) = 0;
+ }
+
+ // Always have named parameters in the declaration.
+ class Circle : public Shape {
+ public:
+ virtual void Rotate(double radians);
+ }
+
+ // Comment out unused named parameters in definitions.
+ void Circle::Rotate(double /*radians*/) {}
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ // Bad - if someone wants to implement later, it's not clear what the
+ // variable means.
+ void Circle::Rotate(double) {}
+ </BAD_CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Function Calls">
+ <SUMMARY>
+ On one line if it fits; otherwise, wrap arguments at the
+ parenthesis.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Function calls have the following format:
+ </p>
+ <CODE_SNIPPET>
+ bool retval = DoSomething(argument1, argument2, argument3);
+ </CODE_SNIPPET>
+ <p>
+ If the arguments do not all fit on one line, they should be
+ broken up onto multiple lines, with each subsequent line
+ aligned with the first argument. Do not add spaces after the
+ open paren or before the close paren:
+ </p>
+ <CODE_SNIPPET>
+ bool retval = DoSomething(averyveryveryverylongargument1,
+ argument2, argument3);
+ </CODE_SNIPPET>
+ <p>
+ If the function has many arguments, consider having one per
+ line if this makes the code more readable:
+ </p>
+ <CODE_SNIPPET>
+ bool retval = DoSomething(argument1,
+ argument2,
+ argument3,
+ argument4);
+ </CODE_SNIPPET>
+ <p>
+ If the function signature is so long that it cannot fit within
+ the maximum <a href="#Line_Length">line length</a>, you may
+ place all arguments on subsequent lines:
+ </p>
+ <CODE_SNIPPET>
+ if (...) {
+ ...
+ ...
+ if (...) {
+ DoSomethingThatRequiresALongFunctionName(
+ very_long_argument1, // 4 space indent
+ argument2,
+ argument3,
+ argument4);
+ }
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Conditionals">
+ <SUMMARY>
+ Prefer no spaces inside parentheses. The <code>else</code>
+ keyword belongs on a new line.
+ </SUMMARY>
+ <BODY>
+ <p>
+ There are two acceptable formats for a basic conditional
+ statement. One includes spaces between the parentheses and the
+ condition, and one does not.
+ </p>
+ <p>
+ The most common form is without spaces. Either is fine, but
+ <em>be consistent</em>. If you are modifying a file, use the
+ format that is already present. If you are writing new code,
+ use the format that the other files in that directory or
+ project use. If in doubt and you have no personal preference,
+ do not add the spaces.
+ </p>
+ <CODE_SNIPPET>
+ if (condition) { // no spaces inside parentheses
+ ... // 2 space indent.
+ } else { // The else goes on the same line as the closing brace.
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ If you prefer you may add spaces inside the
+ parentheses:
+ </p>
+ <CODE_SNIPPET>
+ if ( condition ) { // spaces inside parentheses - rare
+ ... // 2 space indent.
+ } else { // The else goes on the same line as the closing brace.
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ Note that in all cases you must have a space between the
+ <code>if</code> and the open parenthesis. You must also have
+ a space between the close parenthesis and the curly brace, if
+ you're using one.
+ </p>
+ <BAD_CODE_SNIPPET>
+ if(condition) // Bad - space missing after IF.
+ if (condition){ // Bad - space missing before {.
+ if(condition){ // Doubly bad.
+ </BAD_CODE_SNIPPET>
+ <CODE_SNIPPET>
+ if (condition) { // Good - proper space after IF and before {.
+ </CODE_SNIPPET>
+ <p>
+ Short conditional statements may be written on one line if
+ this enhances readability. You may use this only when the
+ line is brief and the statement does not use the
+ <code>else</code> clause.
+ </p>
+ <CODE_SNIPPET>
+ if (x == kFoo) return new Foo();
+ if (x == kBar) return new Bar();
+ </CODE_SNIPPET>
+ <p>
+ This is not allowed when the if statement has an
+ <code>else</code>:
+ </p>
+ <BAD_CODE_SNIPPET>
+ // Not allowed - IF statement on one line when there is an ELSE clause
+ if (x) DoThis();
+ else DoThat();
+ </BAD_CODE_SNIPPET>
+ <p>
+ In general, curly braces are not required for single-line
+ statements, but they are allowed if you like them;
+ conditional or loop statements with complex conditions or
+ statements may be more readable with curly braces. Some
+
+ projects
+ require that an <CODE>if</CODE> must always always have an
+ accompanying brace.
+ </p>
+ <CODE_SNIPPET>
+ if (condition)
+ DoSomething(); // 2 space indent.
+
+ if (condition) {
+ DoSomething(); // 2 space indent.
+ }
+ </CODE_SNIPPET>
+ <p>
+ However, if one part of an <code>if</code>-<code>else</code>
+ statement uses curly braces, the other part must too:
+ </p>
+ <BAD_CODE_SNIPPET>
+ // Not allowed - curly on IF but not ELSE
+ if (condition) {
+ foo;
+ } else
+ bar;
+
+ // Not allowed - curly on ELSE but not IF
+ if (condition)
+ foo;
+ else {
+ bar;
+ }
+ </BAD_CODE_SNIPPET>
+ <CODE_SNIPPET>
+ // Curly braces around both IF and ELSE required because
+ // one of the clauses used braces.
+ if (condition) {
+ foo;
+ } else {
+ bar;
+ }
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Loops and Switch Statements">
+ <SUMMARY>
+ Switch statements may use braces for blocks. Empty loop bodies should use
+ <code>{}</code> or <code>continue</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ <code>case</code> blocks in <code>switch</code> statements can have
+ curly braces or not, depending on your preference. If you do
+ include curly braces they should be placed as shown below.
+ </p>
+ <p>
+ If not conditional on an enumerated value, switch statements
+ should always have a <code>default</code> case (in the case of
+ an enumerated value, the compiler will warn you if any values
+ are not handled). If the default case should never execute,
+ simply
+ <code>assert</code>:
+ </p>
+
+ <CODE_SNIPPET>
+ switch (var) {
+ case 0: { // 2 space indent
+ ... // 4 space indent
+ break;
+ }
+ case 1: {
+ ...
+ break;
+ }
+ default: {
+ assert(false);
+ }
+ }
+ </CODE_SNIPPET>
+ <p>
+ Empty loop bodies should use <code>{}</code> or
+ <code>continue</code>, but not a single semicolon.
+ </p>
+ <CODE_SNIPPET>
+ while (condition) {
+ // Repeat test until it returns false.
+ }
+ for (int i = 0; i &lt; kSomeNumber; ++i) {} // Good - empty body.
+ while (condition) continue; // Good - continue indicates no logic.
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ while (condition); // Bad - looks like part of do/while loop.
+ </BAD_CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Pointer and Reference Expressions">
+ <SUMMARY>
+ No spaces around period or arrow. Pointer operators do not have
+ trailing spaces.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The following are examples of correctly-formatted pointer and
+ reference expressions:
+ </p>
+ <CODE_SNIPPET>
+ x = *p;
+ p = &amp;x;
+ x = r.y;
+ x = r-&gt;y;
+ </CODE_SNIPPET>
+ <p>
+ Note that:
+ </p>
+ <ul>
+ <li> There are no spaces around the period or arrow when
+ accessing a member.
+ </li>
+ <li> Pointer operators have no space after the <code>*</code> or
+ <code>&amp;</code>.
+ </li>
+ </ul>
+ <p>
+ When declaring a pointer variable or argument, you may place
+ the asterisk adjacent to either the type or to the variable
+ name:
+ </p>
+ <CODE_SNIPPET>
+ // These are fine, space preceding.
+ char *c;
+ const string &amp;str;
+
+ // These are fine, space following.
+ char* c; // but remember to do "char* c, *d, *e, ...;"!
+ const string&amp; str;
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ char * c; // Bad - spaces on both sides of *
+ const string &amp; str; // Bad - spaces on both sides of &amp;
+ </BAD_CODE_SNIPPET>
+ <p>
+ You should do this consistently within a single
+ file,
+ so, when modifying an existing file, use the style in that
+ file.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Boolean Expressions">
+ <SUMMARY>
+ When you have a boolean expression that is longer than the <a href="#Line_Length">standard line length</a>, be consistent in
+ how you break up the lines.
+ </SUMMARY>
+ <BODY>
+ <p>
+ In this example, the logical AND operator is always at the end
+ of the lines:
+ </p>
+ <CODE_SNIPPET>
+ if (this_one_thing &gt; this_other_thing &amp;&amp;
+ a_third_thing == a_fourth_thing &amp;&amp;
+ yet_another &amp;&amp; last_one) {
+ ...
+ }
+ </CODE_SNIPPET>
+ <p>
+ Note that when the code wraps in this example, both of
+ the <code>&amp;&amp;</code> logical AND operators are at the
+ end of the line. This is more common in Google code, though
+ wrapping all operators at the beginning of the line is also
+ allowed. Feel free to insert extra parentheses judiciously,
+ because they can be very helpful in increasing readability
+ when used appropriately. Also note that you should always use the
+ punctuation operators, such as <code>&amp;&amp;</code> and
+ <code>~</code>, rather than the word operators, such as <code>and</code>
+ and <code>compl</code>.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Return Values">
+ <SUMMARY>
+ Do not needlessly surround the <code>return</code> expression with
+ parentheses.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Use parentheses in <code>return expr;</code> only where you would use
+ them in <code>x = expr;</code>.
+ </p>
+ <CODE_SNIPPET>
+ return result; // No parentheses in the simple case.
+ return (some_long_condition &amp;&amp; // Parentheses ok to make a complex
+ another_condition); // expression more readable.
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ return (value); // You wouldn't write var = (value);
+ return(result); // return is not a function!
+ </BAD_CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+
+
+ <STYLEPOINT title="Variable and Array Initialization">
+ <SUMMARY>
+ Your choice of <code>=</code> or <code>()</code>.
+ </SUMMARY>
+ <BODY>
+ <p>
+ You may choose between <code>=</code> and <code>()</code>; the
+ following are all correct:
+ </p>
+ <CODE_SNIPPET>
+ int x = 3;
+ int x(3);
+ string name("Some Name");
+ string name = "Some Name";
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Preprocessor Directives">
+ <SUMMARY>
+ The hash mark that starts a preprocessor directive should
+ always be at the beginning of the line.
+ </SUMMARY>
+ <BODY>
+ <p>
+ Even when preprocessor directives are within the body of
+ indented code, the directives should start at the beginning of
+ the line.
+ </p>
+ <CODE_SNIPPET>
+ // Good - directives at beginning of line
+ if (lopsided_score) {
+ #if DISASTER_PENDING // Correct -- Starts at beginning of line
+ DropEverything();
+ # if NOTIFY // OK but not required -- Spaces after #
+ NotifyClient();
+ # endif
+ #endif
+ BackToNormal();
+ }
+ </CODE_SNIPPET>
+ <BAD_CODE_SNIPPET>
+ // Bad - indented directives
+ if (lopsided_score) {
+ #if DISASTER_PENDING // Wrong! The "#if" should be at beginning of line
+ DropEverything();
+ #endif // Wrong! Do not indent "#endif"
+ BackToNormal();
+ }
+ </BAD_CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Class Format">
+ <SUMMARY>
+ Sections in <code>public</code>, <code>protected</code> and
+ <code>private</code> order, each indented one space.
+ </SUMMARY>
+ <BODY>
+ <p>
+ The basic format for a class declaration (lacking the
+ comments, see <a HREF="#Class_Comments">Class Comments</a> for
+ a discussion of what comments are needed) is:
+ </p>
+ <CODE_SNIPPET>
+ class MyClass : public OtherClass {
+ public: // Note the 1 space indent!
+ MyClass(); // Regular 2 space indent.
+ explicit MyClass(int var);
+ ~MyClass() {}
+
+ void SomeFunction();
+ void SomeFunctionThatDoesNothing() {
+ }
+
+ void set_some_var(int var) { some_var_ = var; }
+ int some_var() const { return some_var_; }
+
+ private:
+ bool SomeInternalFunction();
+
+ int some_var_;
+ int some_other_var_;
+ DISALLOW_COPY_AND_ASSIGN(MyClass);
+ };
+ </CODE_SNIPPET>
+ <p>
+ Things to note:
+ </p>
+ <ul>
+ <li> Any base class name should be on the same line as the
+ subclass name, subject to the 80-column limit.
+ </li>
+ <li> The <code>public:</code>, <code>protected:</code>, and
+ <code>private:</code> keywords should be indented one
+ space.
+ </li>
+ <li> Except for the first instance, these keywords should be preceded
+ by a blank line. This rule is optional in small classes.
+ </li>
+ <li> Do not leave a blank line after these keywords.
+ </li>
+ <li> The <code>public</code> section should be first, followed by
+ the <code>protected</code> and finally the
+ <code>private</code> section.
+ </li>
+ <li> See <a HREF="#Declaration_Order">Declaration Order</a> for
+ rules on ordering declarations within each of these sections.
+ </li>
+ </ul>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Constructor Initializer Lists">
+ <SUMMARY>
+ Constructor initializer lists can be all on one line or with
+ subsequent lines indented four spaces.
+ </SUMMARY>
+ <BODY>
+ <p>
+ There are two acceptable formats for initializer lists:
+ </p>
+ <CODE_SNIPPET>
+ // When it all fits on one line:
+ MyClass::MyClass(int var) : some_var_(var), some_other_var_(var + 1) {}
+ </CODE_SNIPPET>
+ <p>
+ or
+ </p>
+ <CODE_SNIPPET>
+ // When it requires multiple lines, indent 4 spaces, putting the colon on
+ // the first initializer line:
+ MyClass::MyClass(int var)
+ : some_var_(var), // 4 space indent
+ some_other_var_(var + 1) { // lined up
+ ...
+ DoSomething();
+ ...
+ }
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Namespace Formatting">
+ <SUMMARY>
+ The contents of namespaces are not indented.
+ </SUMMARY>
+ <BODY>
+ <p>
+ <a href="#Namespaces">Namespaces</a> do not add an extra level of
+ indentation. For example, use:
+ </p>
+ <CODE_SNIPPET>
+ namespace {
+
+ void foo() { // Correct. No extra indentation within namespace.
+ ...
+ }
+
+ } // namespace
+ </CODE_SNIPPET>
+ <p>
+ Do not indent within a namespace:
+ </p>
+ <BAD_CODE_SNIPPET>
+ namespace {
+
+ // Wrong. Indented when it should not be.
+ void foo() {
+ ...
+ }
+
+ } // namespace
+ </BAD_CODE_SNIPPET>
+ <p>
+ When declaring nested namespaces, put each namespace on its own line.
+ </p>
+ <CODE_SNIPPET>
+ namespace foo {
+ namespace bar {
+ </CODE_SNIPPET>
+ </BODY>
+ </STYLEPOINT>
+
+ <STYLEPOINT title="Horizontal Whitespace">
+ <SUMMARY>
+ Use of horizontal whitespace depends on location. Never put trailing
+ whitespace at the end of a line.
+ </SUMMARY>
+ <BODY>
+ <SUBSECTION title="General">
+ <CODE_SNIPPET>
+ void f(bool b) { // Open braces should always have a space before them.
+ ...
+ int i = 0; // Semicolons usually have no space before them.
+ int x[] = { 0 }; // Spaces inside braces for array initialization are
+ int x[] = {0}; // optional. If you use them, put them on both sides!
+ // Spaces around the colon in inheritance and initializer lists.
+ class Foo : public Bar {
+ public:
+ // For inline function implementations, put spaces between the braces
+ // and the implementation itself.
+ Foo(int b) : Bar(), baz_(b) {} // No spaces inside empty braces.
+ void Reset() { baz_ = 0; } // Spaces separating braces from implementation.
+ ...
+ </CODE_SNIPPET>
+ <p>
+ Adding trailing whitespace can cause extra work for others editing
+ the same file, when they merge, as can removing existing trailing
+ whitespace. So: Don't introduce trailing whitespace. Remove it
+ if you're already changing that line, or do it in a separate
+ clean-up
+
+ operation (preferably when no-one else
+ is working on the file).
+ </p>
+ </SUBSECTION>
+ <SUBSECTION title="Loops and Conditionals">
+ <CODE_SNIPPET>
+ if (b) { // Space after the keyword in conditions and loops.
+ } else { // Spaces around else.
+ }
+ while (test) {} // There is usually no space inside parentheses.
+ switch (i) {
+ for (int i = 0; i &lt; 5; ++i) {
+ switch ( i ) { // Loops and conditions may have spaces inside
+ if ( test ) { // parentheses, but this is rare. Be consistent.
+ for ( int i = 0; i &lt; 5; ++i ) {
+ for ( ; i &lt; 5 ; ++i) { // For loops always have a space after the
+ ... // semicolon, and may have a space before the
+ // semicolon.
+ switch (i) {
+ case 1: // No space before colon in a switch case.
+ ...
+ case 2: break; // Use a space after a colon if there's code after it.
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ <SUBSECTION title="Operators">
+ <CODE_SNIPPET>
+ x = 0; // Assignment operators always have spaces around
+ // them.
+ x = -5; // No spaces separating unary operators and their
+ ++x; // arguments.
+ if (x &amp;&amp; !y)
+ ...
+ v = w * x + y / z; // Binary operators usually have spaces around them,
+ v = w*x + y/z; // but it's okay to remove spaces around factors.
+ v = w * (x + z); // Parentheses should have no spaces inside them.
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ <SUBSECTION title="Templates and Casts">
+ <CODE_SNIPPET>
+ vector&lt;string&gt; x; // No spaces inside the angle
+ y = static_cast&lt;char*&gt;(x); // brackets (&lt; and &gt;), before
+ // &lt;, or between &gt;( in a cast.
+ vector&lt;char *&gt; x; // Spaces between type and pointer are
+ // okay, but be consistent.
+ set&lt;list&lt;string&gt; &gt; x; // C++ requires a space in &gt; &gt;.
+ set&lt; list&lt;string&gt; &gt; x; // You may optionally use
+ // symmetric spacing in &lt; &lt;.
+ </CODE_SNIPPET>
+ </SUBSECTION>
+ </BODY>
+ </STYLEPOINT>
+
+
+ <STYLEPOINT title="Vertical Whitespace">
+ <SUMMARY>
+ Minimize use of vertical whitespace.
+ </SUMMARY>
+ <BODY>
+ <p>
+ This is more a principle than a rule: don't use blank lines
+ when you don't have to. In particular, don't put more than
+ one or two blank lines between functions, resist starting
+ functions with a blank line, don't end functions with a blank
+ line, and be discriminating with your use of blank lines
+ inside functions.
+ </p>
+ <p>
+ The basic principle is: The more code that fits on one screen,
+ the easier it is to follow and understand the control flow of
+ the program. Of course, readability can suffer from code
+ being too dense as well as too spread out, so use your
+ judgement. But in general, minimize use of vertical
+ whitespace.
+ </p>
+ <p>
+ Some rules of thumb to help when blank lines may be useful:
+ </p>
+ <ul>
+ <li> Blank lines at the beginning or end of a function very
+ rarely help readability.
+ </li>
+ <li> Blank lines inside a chain of if-else blocks may well
+ help readability.
+ </li>
+ </ul>
+ </BODY>
+ </STYLEPOINT>
+</CATEGORY>
+
+<CATEGORY title="Exceptions to the Rules">
+ <p>
+ The coding conventions described above are mandatory. However,
+ like all good rules, these sometimes have exceptions, which we
+ discuss here.
+ </p>
+
+
+
+ <STYLEPOINT title="Existing Non-conformant Code">
+ <SUMMARY>
+ You may diverge from the rules when dealing with code that does not
+ conform to this style guide.
+ </SUMMARY>
+ <BODY>
+ <p>
+ If you find yourself modifying code that was written to
+ specifications other than those presented by this guide, you may
+ have to diverge from these rules in order to stay consistent with
+ the local conventions in that code. If you are in doubt about
+ how to do this, ask the original author or the person currently
+ responsible for the code. Remember that <em>consistency</em>
+ includes local consistency, too.
+ </p>
+ </BODY>
+ </STYLEPOINT>
+
+
+
+ <STYLEPOINT title="Windows Code">
+ <SUMMARY>
+
+ Windows programmers have developed their own set of coding
+ conventions, mainly derived from the conventions in Windows headers
+ and other Microsoft code. We want to make it easy for anyone to
+ understand your code, so we have a single set of guidelines for
+ everyone writing C++ on any platform.
+ </SUMMARY>
+ <BODY>
+ <p>
+ It is worth reiterating a few of the guidelines that you might
+ forget if you are used to the prevalent Windows style:
+ </p>
+ <ul>
+ <li> Do not use Hungarian notation (for example, naming an
+ integer <code>iNum</code>). Use the Google naming conventions,
+ including the <code>.cc</code> extension for source files.
+ </li>
+ <li> Windows defines many of its own synonyms for primitive
+ types, such as <code>DWORD</code>, <code>HANDLE</code>, etc.
+ It is perfectly acceptable, and encouraged, that you use these
+ types when calling Windows API functions. Even so, keep as
+ close as you can to the underlying C++ types. For example, use
+ <code>const TCHAR *</code> instead of <code>LPCTSTR</code>.
+ </li>
+ <li> When compiling with Microsoft Visual C++, set the
+ compiler to warning level 3 or higher, and treat all
+ warnings as errors.
+ </li>
+ <li> Do not use <code>#pragma once</code>; instead use the
+ standard Google include guards. The path in the include
+ guards should be relative to the top of your project
+ tree.
+ </li>
+ <li> In fact, do not use any nonstandard extensions, like
+ <code>#pragma</code> and <code>__declspec</code>, unless you
+ absolutely must. Using <code>__declspec(dllimport)</code> and
+ <code>__declspec(dllexport)</code> is allowed; however, you
+ must use them through macros such as <code>DLLIMPORT</code>
+ and <code>DLLEXPORT</code>, so that someone can easily disable
+ the extensions if they share the code.
+ </li>
+ </ul>
+ <p>
+ However, there are just a few rules that we occasionally need
+ to break on Windows:
+ </p>
+ <ul>
+ <li> Normally we <a HREF="#Multiple_Inheritance">forbid
+ the use of multiple implementation inheritance</a>; however,
+ it is required when using COM and some ATL/WTL
+ classes. You may use multiple implementation inheritance
+ to implement COM or ATL/WTL classes and interfaces.
+ </li>
+ <li> Although you should not use exceptions in your own code,
+ they are used extensively in the ATL and some STLs,
+ including the one that comes with Visual C++. When using
+ the ATL, you should define <code>_ATL_NO_EXCEPTIONS</code> to
+ disable exceptions. You should investigate whether you can
+ also disable exceptions in your STL, but if not, it is OK to
+ turn on exceptions in the compiler. (Note that this is
+ only to get the STL to compile. You should still not
+ write exception handling code yourself.)
+ </li>
+ <li> The usual way of working with precompiled headers is to
+ include a header file at the top of each source file,
+ typically with a name like <code>StdAfx.h</code> or
+ <code>precompile.h</code>. To make your code easier to share
+ with other projects, avoid including this file explicitly
+ (except in <code>precompile.cc</code>), and use the
+ <code>/FI</code> compiler option to include the file
+ automatically.
+ </li>
+ <li> Resource headers, which are usually named
+ <code>resource.h</code> and contain only macros, do not need
+ to conform to these style guidelines.
+ </li>
+ </ul>
+ </BODY>
+ </STYLEPOINT>
+
+
+</CATEGORY>
+
+<PARTING_WORDS>
+ <p>
+ Use common sense and <em>BE CONSISTENT</em>.
+ </p>
+ <p>
+ If you are editing code, take a few minutes to look at the
+ code around you and determine its style. If they use spaces
+ around their <code>if</code> clauses, you should, too. If
+ their comments have little boxes of stars around them, make
+ your comments have little boxes of stars around them too.
+ </p>
+ <p>
+ The point of having style guidelines is to have a common
+ vocabulary of coding so people can concentrate on what you are
+ saying, rather than on how you are saying it. We present
+ global style rules here so people know the vocabulary. But
+ local style is also important. If code you add to a file
+ looks drastically different from the existing code around it,
+ the discontinuity throws readers out of their rhythm when they
+ go to read it. Try to avoid this.
+ </p>
+
+ <p>
+ OK, enough writing about writing code; the code itself is much
+ more interesting. Have fun!
+ </p>
+</PARTING_WORDS>
+
+<HR/>
+
+<p align="right">
+Revision 3.188
+</p>
+
+
+
+<address>
+Benjy Weinberger<br/>
+Craig Silverstein<br/>
+Gregory Eitzmann<br/>
+Mark Mentovai<br/>
+Tashana Landray
+</address>
+
+</GUIDE>
diff --git a/guides/styleguide.css b/guides/styleguide.css
new file mode 100644
index 000000000..adba8f3cc
--- /dev/null
+++ b/guides/styleguide.css
@@ -0,0 +1,147 @@
+body {
+ background-color: #fff;
+ color: #333;
+ font-family: sans-serif;
+ font-size: 10pt;
+ margin-right: 100px;
+ margin-left: 100px;
+}
+
+h1, h2, h3, h4, h5, h6, .toc_title {
+ color: #06c;
+ margin-top: 2em;
+ margin-bottom: 1em;
+}
+
+h1 {
+ text-align: center;
+ font-size: 18pt;
+}
+
+h2, .toc_title {
+ font-weight: bold;
+ font-size: 12pt;
+ margin-left: -40px;
+}
+
+h3, h4, h5, h6 {
+ font-size: 10pt;
+ margin-left: -20px;
+}
+
+.toc_category, .toc_stylepoint {
+ font-size: 10pt;
+ padding-top: .3em;
+ padding-bottom: .3em;
+}
+
+table {
+ border-collapse: collapse;
+}
+
+td, th {
+ border: 1px solid #ccc;
+ padding: 2px 12px;
+ font-size: 10pt;
+}
+
+.toc td, .toc th {
+ border-width: 1px 5px;
+}
+
+code, samp, var {
+ color: #060;
+}
+
+pre {
+ font-size: 10pt;
+ display: block;
+ color: #060;
+ background-color: #f8fff8;
+ border-color: #f0fff0;
+ border-style: solid;
+ border-top-width: 1px;
+ border-bottom-width: 1px;
+ border-right-width: 1px;
+ border-left-width: 5px;
+ padding-left: 12px;
+ padding-right: 12px;
+ padding-top: 4px;
+ padding-bottom: 4px;
+}
+
+pre.badcode {
+ color: #c00;
+ background-color: #fff8f8;
+ border-color: #fff0f0;
+}
+
+.showhide_button {
+ float: left;
+ cursor: pointer;
+ border-width: 1px;
+ border-style: solid;
+ border-color: #ddd #aaa #aaa #ddd;
+ padding: 0 3px 1px;
+ margin: 0 4px 8px 0;
+ border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+}
+
+.link_button {
+ float: left;
+ display: none;
+ background-color: #f8f8ff;
+ border-color: #f0f0ff;
+ border-style: solid;
+ border-width: 1px;
+ font-size: 75%;
+ margin-top: 0;
+ margin-left: -50px;
+ padding: 4px;
+ border-radius: 3px;
+ -webkit-border-radius: 3px;
+ -moz-border-radius: 3px;
+}
+
+address {
+ text-align: right;
+}
+
+hr {
+ margin-top: 3.5em;
+ border-width: 1px;
+ color: #fff;
+}
+
+.stylepoint_section {
+ display: block;
+ margin-bottom: 1em;
+ color: #5588ff;
+ font-family: sans-serif;
+ font-size: 90%;
+ font-weight: bold;
+ margin-left: -2%;
+}
+
+.stylepoint_subsection {
+ color: #667799;
+ font-family: sans-serif;
+ font-size: 90%;
+ font-weight: bold;
+ margin-left: -1%;
+}
+
+.stylepoint_subsubsection {
+ color: #667799;
+ font-family: sans-serif;
+ font-size: 80%;
+ font-weight: bold;
+ margin-left: 0;
+}
+
+.revision {
+ text-align: right;
+}
+
diff --git a/guides/styleguide.xsl b/guides/styleguide.xsl
new file mode 100644
index 000000000..38345d51d
--- /dev/null
+++ b/guides/styleguide.xsl
@@ -0,0 +1,890 @@
+<xsl:stylesheet version="1.0"
+xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+xmlns:dc="http://purl.org/dc/elements/1.1/"
+xmlns:dcq="http://purl.org/dc/qualifiers/1.0/"
+xmlns:fo="http://www.w3.org/1999/XSL/Format"
+xmlns:fn="http://www.w3.org/2005/xpath-functions">
+ <xsl:output method="html"/>
+ <!-- Set to 1 to show explanations by default. Set to 0 to hide them -->
+ <xsl:variable name="show_explanation_default" select="0" />
+ <!-- The characters within the Webdings font that show the triangles -->
+ <xsl:variable name="show_button_text" select="'&#x25B6;'" />
+ <xsl:variable name="hide_button_text" select="'&#x25BD;'" />
+ <!-- The suffix for names -->
+ <xsl:variable name="button_suffix" select="'__button'"/>
+ <xsl:variable name="body_suffix" select="'__body'"/>
+ <!-- For easy reference, the name of the button -->
+ <xsl:variable name="show_hide_all_button" select="'show_hide_all_button'"/>
+
+ <!-- The top-level element -->
+ <xsl:template match="GUIDE">
+ <HTML>
+ <HEAD>
+ <TITLE><xsl:value-of select="@title"/></TITLE>
+ <META http-equiv="Content-Type" content="text/html; charset=utf-8"/>
+ <LINK HREF="http://www.google.com/favicon.ico" type="image/x-icon"
+ rel="shortcut icon"/>
+ <LINK HREF="styleguide.css"
+ type="text/css" rel="stylesheet"/>
+
+ <SCRIPT language="javascript" type="text/javascript">
+
+ function ShowHideByName(bodyName, buttonName) {
+ var bodyElements;
+ var linkElement;
+ if (document.getElementsByName) {
+ bodyElements = document.getElementsByName(bodyName);
+ linkElement = document.getElementsByName('link-' + buttonName)[0];
+ } else {
+ bodyElements = [document.getElementById(bodyName)];
+ linkElement = document.getElementById('link-' + buttonName);
+ }
+ if (bodyElements.length != 1) {
+ alert("ShowHideByName() got the wrong number of bodyElements: " + bodyElements.length);
+ } else {
+ var bodyElement = bodyElements[0];
+ var buttonElement;
+ if (document.getElementsByName) {
+ var buttonElements = document.getElementsByName(buttonName);
+ buttonElement = buttonElements[0];
+ } else {
+ buttonElement = document.getElementById(buttonName);
+ }
+ if (bodyElement.style.display == "none" || bodyElement.style.display == "") {
+ bodyElement.style.display = "inline";
+ linkElement.style.display = "block";
+ buttonElement.innerHTML = '<xsl:value-of select="$hide_button_text"/>';
+ } else {
+ bodyElement.style.display = "none";
+ linkElement.style.display = "none";
+ buttonElement.innerHTML = '<xsl:value-of select="$show_button_text"/>';
+ }
+ }
+ }
+
+ function ShowHideAll() {
+ var allButton;
+ if (document.getElementsByName) {
+ var allButtons = document.getElementsByName("show_hide_all_button");
+ allButton = allButtons[0];
+ } else {
+ allButton = document.getElementById("show_hide_all_button");
+ }
+ if (allButton.innerHTML == '<xsl:value-of select="$hide_button_text"/>') {
+ allButton.innerHTML = '<xsl:value-of select="$show_button_text"/>';
+ SetHiddenState(document.getElementsByTagName("body")[0].childNodes, "none", '<xsl:value-of select="$show_button_text"/>');
+ } else {
+ allButton.innerHTML = '<xsl:value-of select="$hide_button_text"/>';
+ SetHiddenState(document.getElementsByTagName("body")[0].childNodes, "inline", '<xsl:value-of select="$hide_button_text"/>');
+ }
+ }
+
+ // Recursively sets state of all children
+ // of a particular node.
+ function SetHiddenState(root, newState, newButton) {
+ for (var i = 0; i != root.length; i++) {
+ SetHiddenState(root[i].childNodes, newState, newButton);
+ if (root[i].className == 'showhide_button') {
+ root[i].innerHTML = newButton;
+ }
+ if (root[i].className == 'stylepoint_body' ||
+ root[i].className == 'link_button') {
+ root[i].style.display = newState;
+ }
+ }
+ }
+
+
+ window.onload = function() {
+ // if the URL contains "?showall=y", expand the details of all children
+ {
+ var showHideAllRegex = new RegExp("[\\?&amp;](showall)=([^&amp;#]*)");
+ var showHideAllValue = showHideAllRegex.exec(window.location.href);
+ if (showHideAllValue != null) {
+ if (showHideAllValue[2] == "y") {
+ SetHiddenState(document.getElementsByTagName("body")[0].childNodes, "inline", '<xsl:value-of select="$hide_button_text"/>');
+ } else {
+ SetHiddenState(document.getElementsByTagName("body")[0].childNodes, "none", '<xsl:value-of select="$show_button_text"/>');
+ }
+ }
+ var showOneRegex = new RegExp("[\\?&amp;](showone)=([^&amp;#]*)");
+ var showOneValue = showOneRegex.exec(window.location.href);
+ if (showOneValue != null) {
+ var body_name = showOneValue[2] + '<xsl:value-of select="$body_suffix"/>';
+ var button_name = showOneValue[2] + '<xsl:value-of select="$button_suffix"/>';
+ ShowHideByName(body_name, button_name);
+ }
+
+ }
+ }
+ </SCRIPT>
+ </HEAD>
+ <BODY>
+ <H1><xsl:value-of select="@title"/></H1>
+ <xsl:apply-templates/>
+ </BODY>
+ </HTML>
+ </xsl:template>
+
+ <xsl:template match="OVERVIEW">
+ <xsl:variable name="button_text">
+ <xsl:choose>
+ <xsl:when test="$show_explanation_default">
+ <xsl:value-of select="$hide_button_text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$show_button_text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <DIV style="margin-left: 50%; font-size: 75%;">
+ <P>
+ Each style point has a summary for which additional information is available
+ by toggling the accompanying arrow button that looks this way:
+ <SPAN class="showhide_button" style="margin-left: 0; float: none">
+ <xsl:value-of select="$show_button_text"/></SPAN>.
+ You may toggle all summaries with the big arrow button:
+ </P>
+ <DIV style=" font-size: larger; margin-left: +2em;">
+ <SPAN class="showhide_button" style="font-size: 180%; float: none">
+ <xsl:attribute name="onclick"><xsl:value-of select="'javascript:ShowHideAll()'"/></xsl:attribute>
+ <xsl:attribute name="name"><xsl:value-of select="$show_hide_all_button"/></xsl:attribute>
+ <xsl:attribute name="id"><xsl:value-of select="$show_hide_all_button"/></xsl:attribute>
+ <xsl:value-of select="$button_text"/>
+ </SPAN>
+ Toggle all summaries
+ </DIV>
+ </DIV>
+ <xsl:call-template name="TOC">
+ <xsl:with-param name="root" select=".."/>
+ </xsl:call-template>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="PARTING_WORDS">
+ <H2>Parting Words</H2>
+ <xsl:apply-templates/>
+ </xsl:template>
+
+ <xsl:template match="CATEGORY">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <H2>
+ <xsl:variable name="category_name">
+ <xsl:call-template name="anchorname">
+ <xsl:with-param name="sectionname" select="@title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:attribute name="name"><xsl:value-of select="$category_name"/></xsl:attribute>
+ <xsl:attribute name="id"><xsl:value-of select="$category_name"/></xsl:attribute>
+ <xsl:value-of select="@title"/>
+ </H2>
+ <xsl:apply-templates/>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="STYLEPOINT">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <xsl:variable name="stylepoint_name">
+ <xsl:call-template name="anchorname">
+ <xsl:with-param name="sectionname" select="@title"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="button_text">
+ <xsl:choose>
+ <xsl:when test="$show_explanation_default">
+ <xsl:value-of select="$hide_button_text"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$show_button_text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <H3>
+ <A>
+ <xsl:attribute name="name"><xsl:value-of select="$stylepoint_name"/></xsl:attribute>
+ <xsl:attribute name="id"><xsl:value-of select="$stylepoint_name"/></xsl:attribute>
+ <xsl:value-of select="@title"/>
+ </A>
+ </H3>
+ <xsl:variable name="buttonName">
+ <xsl:value-of select="$stylepoint_name"/><xsl:value-of select="$button_suffix"/>
+ </xsl:variable>
+ <xsl:variable name="onclick_definition">
+ <xsl:text>javascript:ShowHideByName('</xsl:text>
+ <xsl:value-of select="$stylepoint_name"/><xsl:value-of select="$body_suffix"/>
+ <xsl:text>','</xsl:text>
+ <xsl:value-of select="$buttonName"/>
+ <xsl:text>')</xsl:text>
+ </xsl:variable>
+ <SPAN class="link_button" id="link-{$buttonName}" name="link-{$buttonName}">
+ <A>
+ <xsl:attribute name="href">?showone=<xsl:value-of select="$stylepoint_name"/>#<xsl:value-of select="$stylepoint_name"/></xsl:attribute>
+ link
+ </A>
+ </SPAN>
+ <SPAN class="showhide_button">
+ <xsl:attribute name="onclick"><xsl:value-of select="$onclick_definition"/></xsl:attribute>
+ <xsl:attribute name="name"><xsl:value-of select="$buttonName"/></xsl:attribute>
+ <xsl:attribute name="id"><xsl:value-of select="$buttonName"/></xsl:attribute>
+ <xsl:value-of select="$button_text"/>
+ </SPAN>
+ <xsl:apply-templates>
+ <xsl:with-param name="anchor_prefix" select="$stylepoint_name" />
+ </xsl:apply-templates>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="SUMMARY">
+ <xsl:param name="anchor_prefix" />
+ <DIV style="display:inline;">
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <xsl:apply-templates/>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="BODY">
+ <xsl:param name="anchor_prefix" />
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <DIV class="stylepoint_body">
+ <xsl:attribute name="name"><xsl:value-of select="$anchor_prefix"/><xsl:value-of select="$body_suffix"/></xsl:attribute>
+ <xsl:attribute name="id"><xsl:value-of select="$anchor_prefix"/><xsl:value-of select="$body_suffix"/></xsl:attribute>
+ <xsl:attribute name="style">
+ <xsl:choose>
+ <xsl:when test="$show_explanation_default">display: inline</xsl:when>
+ <xsl:otherwise>display: none</xsl:otherwise>
+ </xsl:choose>
+ </xsl:attribute>
+ <xsl:apply-templates/>
+ </DIV>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="DEFINITION">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_section">Definition: </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="PROS">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_section">Pros: </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="CONS">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_section">Cons: </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="DECISION">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_section">Decision: </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="TODO">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <DIV style="font-size: 150%;">TODO:
+ <xsl:apply-templates/>
+ </DIV>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="SUBSECTION">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_subsection"><xsl:value-of select="@title"/> </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="SUBSUBSECTION">
+ <P>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <SPAN class="stylepoint_subsubsection"><xsl:value-of select="@title"/> </SPAN>
+ <xsl:apply-templates/>
+ </P>
+ </xsl:template>
+
+ <xsl:template match="CODE_SNIPPET">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <PRE><xsl:call-template name="print_without_leading_chars">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="strip" select="1"/>
+ <xsl:with-param name="is_firstline" select="1"/>
+ <xsl:with-param name="trim_count">
+ <xsl:call-template name="num_leading_spaces">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="max_so_far" select="1000"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template></PRE>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="BAD_CODE_SNIPPET">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <PRE class="badcode"><xsl:call-template name="print_without_leading_chars">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="strip" select="1"/>
+ <xsl:with-param name="is_firstline" select="1"/>
+ <xsl:with-param name="trim_count">
+ <xsl:call-template name="num_leading_spaces">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="max_so_far" select="1000"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template></PRE>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="PY_CODE_SNIPPET">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <PRE><xsl:call-template name="print_python_code">
+ <xsl:with-param name="text" select="."/>
+ </xsl:call-template></PRE>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="BAD_PY_CODE_SNIPPET">
+ <DIV>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <PRE class="badcode"><xsl:call-template name="print_python_code">
+ <xsl:with-param name="text" select="."/>
+ </xsl:call-template></PRE>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template match="FUNCTION">
+ <xsl:call-template name="print_function_name">
+ <xsl:with-param name="text" select="."/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <xsl:template match="SYNTAX">
+ <I>
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <xsl:apply-templates/>
+ </I>
+ </xsl:template>
+
+
+ <!-- This passes through any HTML elements that the
+ XML doc uses for minor formatting -->
+ <xsl:template match="a|address|blockquote|br|center|cite|code|dd|div|dl|dt|em|hr|i|img|li|ol|p|pre|span|table|td|th|tr|ul|var|A|ADDRESS|BLOCKQUOTE|BR|CENTER|CITE|CODE|DD|DIV|DL|DT|EM|HR|I|LI|OL|P|PRE|SPAN|TABLE|TD|TH|TR|UL|VAR">
+ <xsl:element name="{local-name()}">
+ <xsl:copy-of select="@*"/>
+ <xsl:apply-templates/>
+ </xsl:element>
+ </xsl:template>
+
+ <!-- Builds the table of contents -->
+ <xsl:template name="TOC">
+ <xsl:param name="root"/>
+ <DIV class="toc">
+ <DIV class="toc_title">Table of Contents</DIV>
+ <TABLE>
+ <xsl:for-each select="$root/CATEGORY">
+ <TR valign="top">
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <TD>
+ <DIV class="toc_category">
+ <A>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="anchorname">
+ <xsl:with-param name="sectionname" select="@title"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="@title"/>
+ </A>
+ </DIV>
+ </TD><TD>
+ <DIV class="toc_stylepoint">
+ <xsl:for-each select="./STYLEPOINT">
+ <SPAN style="padding-right: 1em; white-space:nowrap;">
+ <xsl:attribute name="class"><xsl:value-of select="@class"/></xsl:attribute>
+ <A>
+ <xsl:attribute name="href">
+ <xsl:text>#</xsl:text>
+ <xsl:call-template name="anchorname">
+ <xsl:with-param name="sectionname" select="@title"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <xsl:value-of select="@title"/>
+ </A>
+ </SPAN>
+ <xsl:text> </xsl:text>
+ </xsl:for-each>
+ </DIV>
+ </TD>
+ </TR>
+ </xsl:for-each>
+ </TABLE>
+ </DIV>
+ </xsl:template>
+
+ <xsl:template name="TOC_one_stylepoint">
+ <xsl:param name="stylepoint"/>
+ </xsl:template>
+
+ <!-- Creates a standard anchor given any text.
+ Substitutes underscore for characters unsuitable for URLs -->
+ <xsl:template name="anchorname">
+ <xsl:param name="sectionname"/>
+ <!-- strange quoting necessary to strip apostrophes -->
+ <xsl:variable name="bad_characters" select="&quot; ()#'&quot;"/>
+ <xsl:value-of select="translate($sectionname,$bad_characters,'_____')"/>
+ </xsl:template>
+
+ <!-- Given text, evaluates to the number of leading spaces. -->
+ <!-- TODO(csilvers): deal well with leading tabs (treat as 8 spaces?) -->
+ <xsl:template name="num_leading_spaces_one_line">
+ <xsl:param name="text"/>
+ <xsl:param name="current_count"/>
+ <xsl:choose>
+ <xsl:when test="starts-with($text, ' ')">
+ <xsl:call-template name="num_leading_spaces_one_line">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ <xsl:with-param name="current_count" select="$current_count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$current_count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Given a block of text, each line terminated by \n, evaluates to
+ the indentation-level of that text; that is, the largest number
+ n such that every non-blank line starts with at least n spaces. -->
+ <xsl:template name="num_leading_spaces">
+ <xsl:param name="text"/>
+ <xsl:param name="max_so_far"/>
+ <!-- TODO(csilvers): deal with case text doesn't end in a newline -->
+ <xsl:variable name="line" select="substring-before($text, '&#xA;')"/>
+ <xsl:variable name="rest" select="substring-after($text, '&#xA;')"/>
+ <xsl:variable name="num_spaces_this_line">
+ <xsl:choose>
+ <xsl:when test="$line=''">
+ <xsl:value-of select="$max_so_far"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="num_leading_spaces_one_line">
+ <xsl:with-param name="text" select="$line"/>
+ <xsl:with-param name="current_count" select="0"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <xsl:variable name="new_max_so_far">
+ <xsl:choose>
+ <xsl:when test="$num_spaces_this_line &lt; $max_so_far">
+ <xsl:value-of select="$num_spaces_this_line"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$max_so_far"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+ <!-- now check if we're on the last line, and if not, recurse -->
+ <xsl:if test="$rest=''">
+ <xsl:value-of select="$new_max_so_far"/>
+ </xsl:if>
+ <xsl:if test="not($rest='')">
+ <xsl:call-template name="num_leading_spaces">
+ <xsl:with-param name="text" select="$rest"/>
+ <xsl:with-param name="max_so_far" select="$new_max_so_far"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Given text, determine the starting position of code.
+ This similar to num_leading_spaces_one_line but treats "Yes:" and "No:"
+ as spaces. Also, if there is no code on the first line, it searches
+ subsequent lines until a non-empty line is found.
+ Used to find the start of code in snippets like:
+ Yes: if(foo):
+ No : if(foo):
+ As well as:
+ Yes:
+ if (foo):
+ -->
+ <xsl:template name="code_start_index">
+ <xsl:param name="text"/>
+ <xsl:param name="current_count"/>
+ <xsl:choose>
+ <xsl:when test="starts-with($text, ' ')">
+ <xsl:call-template name="code_start_index">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ <xsl:with-param name="current_count" select="$current_count + 1"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, 'Yes:')">
+ <xsl:call-template name="code_start_index">
+ <xsl:with-param name="text" select="substring($text, 5)"/>
+ <xsl:with-param name="current_count" select="$current_count + 4"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($text, 'No:')">
+ <xsl:call-template name="code_start_index">
+ <xsl:with-param name="text" select="substring($text, 4)"/>
+ <xsl:with-param name="current_count" select="$current_count + 3"/>
+ </xsl:call-template>
+ </xsl:when>
+ <!-- This is only reached if the first line is entirely whitespace or
+ contains nothing but "Yes:" or "No:"-->
+ <xsl:when test="starts-with($text, '&#xA;')">
+ <xsl:call-template name="code_start_index">
+ <xsl:with-param name="text" select="substring($text, 2)"/>
+ <xsl:with-param name="current_count" select="0"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$current_count"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Helper for ends_with_colon. Determine whether the given line is nothing
+ but spaces and python-style comments. -->
+ <xsl:template name="is_blank_or_comment">
+ <xsl:param name="line"/>
+ <xsl:choose>
+ <xsl:when test="$line = ''">
+ <xsl:value-of select="1"/>
+ </xsl:when>
+ <xsl:when test="starts-with($line, '&#xA;')">
+ <xsl:value-of select="1"/>
+ </xsl:when>
+ <xsl:when test="starts-with($line, '#')">
+ <xsl:value-of select="1"/>
+ </xsl:when>
+ <xsl:when test="starts-with($line, ' ')">
+ <xsl:call-template name="is_blank_or_comment">
+ <xsl:with-param name="line" select="substring($line, 2)"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="0"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Determine whether the given line ends with a colon. Note that Python
+ style comments are ignored so the following lines return True:
+ - def foo():
+ - def foo(): # Bar
+ - if(foo):
+
+ But some code may confuse this function. For example the following are
+ also consider to "end_with_colon" even though they don't for Python
+ - foo(": #")
+ - foo() # No need for :
+ -->
+ <xsl:template name="ends_with_colon">
+ <xsl:param name="line"/>
+ <xsl:param name="found_colon"/>
+ <xsl:choose>
+ <xsl:when test="$line = ''">
+ <xsl:value-of select="$found_colon"/>
+ </xsl:when>
+ <xsl:when test="starts-with($line, '&#xA;')">
+ <xsl:value-of select="$found_colon"/>
+ </xsl:when>
+ <xsl:when test="starts-with($line, ' ')">
+ <xsl:call-template name="ends_with_colon">
+ <xsl:with-param name="line" select="substring($line, 2)"/>
+ <xsl:with-param name="found_colon" select="$found_colon"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="starts-with($line, ':')">
+ <xsl:variable name="rest_is_comment">
+ <xsl:call-template name="is_blank_or_comment">
+ <xsl:with-param name="line" select="substring($line, 2)"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="$rest_is_comment = '1'">
+ <xsl:value-of select="1"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="ends_with_colon">
+ <xsl:with-param name="line" select="substring($line, 2)"/>
+ <xsl:with-param name="found_colon" select="0"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:call-template name="ends_with_colon">
+ <xsl:with-param name="line" select="substring($line, 2)"/>
+ <xsl:with-param name="found_colon" select="0"/>
+ </xsl:call-template>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Prints one line of python code with proper indent and calls itself
+ recursively for the rest of the text.
+ This template uses "a", "b", "c" and "d" to refer to four key column
+ numbers. They are:
+ - a: the indentation common to all lines in a code snippet. This is
+ stripped out to allow for cleaner code in the xml.
+ - b: the indentation of the most out-dented line of code. This is
+ different from "a" when code is labelled with "Yes:" or "No:"
+ - c: the indentation of the current python block, in other words, the
+ indentation of the first line of this block, which is the
+ indentation of the last line we saw that ended with a colon.
+ - d: the "total" indentation of the line, ignorng possible "Yes:" or
+ "No:" text on the line.
+
+ For example, for the last line of the following code snippet, the
+ positions of a, b, c and d are indicated below:
+ Yes: def Foo():
+ if bar():
+ a += 1
+ baz()
+ a b c d
+
+ The algorithm is:
+ 1) Split the text into first line and the rest. Note that the
+ substring-before function is supposed to handle the case where the
+ character is not present in the string but does not so we
+ automatically ignore the last line of the snippet which is always
+ empty (the closing snippet tag). This is consistent with the
+ behavior or print_without_leading_chars.
+ 2) If the current is empty (only whitespace), print newline and call
+ itself recursively on the rest of the text with the rest of the
+ parameters unchanged.
+ 3) Otherwise, measure "d"
+ 4) Measure "c" by taking:
+ - the value of "d" if the previous line ended with a colon or the
+ current line is outdented compare to the previous line
+ - the indent of the previous line otherwise
+ 5) Print line[a:c] (Note that we ignore line[0:a])
+ 6) Print line[b:c] in an external span (in order to double the block
+ indent in external code).
+ 7) Print line[c:<end>] with function names processed to produce both
+ internal and external names.
+ 8) If there are more lines, recurse.
+ -->
+ <xsl:template name="print_python_line_recursively">
+ <xsl:param name="text"/>
+ <xsl:param name="a"/>
+ <xsl:param name="b"/>
+ <xsl:param name="previous_indent"/>
+ <xsl:param name="previous_ends_with_colon"/>
+ <xsl:param name="is_first_line"/>
+ <xsl:variable name="line" select="substring-before($text, '&#xA;')"/>
+ <xsl:variable name="rest" select="substring-after($text, '&#xA;')"/>
+ <xsl:choose>
+ <xsl:when test="substring($line, $b) = '' and not($rest = '')">
+ <xsl:if test="not($is_first_line = '1')">
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:if>
+ <xsl:call-template name="print_python_line_recursively">
+ <xsl:with-param name="text" select="$rest"/>
+ <xsl:with-param name="a" select="$a"/>
+ <xsl:with-param name="b" select="$b"/>
+ <xsl:with-param name="previous_indent" select="$previous_indent"/>
+ <xsl:with-param name="previous_ends_with_colon"
+ select="$previous_ends_with_colon"/>
+ <xsl:with-param name="is_first_line" select="0"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:variable name="indent_after_b">
+ <xsl:call-template name="num_leading_spaces_one_line">
+ <xsl:with-param name="text" select="substring($line, $b + 1)"/>
+ <xsl:with-param name="current_count" select="0"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="d" select="$b + $indent_after_b"/>
+ <xsl:variable name="c">
+ <xsl:choose>
+ <xsl:when test="$previous_ends_with_colon = '1' or
+ $previous_indent > $d">
+ <xsl:value-of select="$d"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$previous_indent"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:value-of select="substring($line, $a + 1, $c - $a)"/>
+ <span class="external">
+ <xsl:value-of select="substring($line, $b + 1, $c - $b)"/>
+ </span>
+ <xsl:call-template name="munge_function_names_in_text">
+ <xsl:with-param name="stripped_line"
+ select="substring($line, $c + 1)"/>
+ </xsl:call-template>
+ <xsl:if test="not(substring($rest, $a) = '')">
+ <xsl:text>&#xA;</xsl:text>
+ <xsl:call-template name="print_python_line_recursively">
+ <xsl:with-param name="text" select="$rest"/>
+ <xsl:with-param name="a" select="$a"/>
+ <xsl:with-param name="b" select="$b"/>
+ <xsl:with-param name="previous_indent" select="$c"/>
+ <xsl:with-param name="previous_ends_with_colon">
+ <xsl:call-template name="ends_with_colon">
+ <xsl:with-param name="line" select="$line"/>
+ <xsl:with-param name="found_colon" select="0"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ <xsl:with-param name="is_first_line" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Print python code with internal and external styles.
+ In order to conform with PEP-8 externally, we identify 2-space indents
+ and an external-only 4-space indent.
+ Function names that are marked with $$FunctionName/$$ have an external
+ lower_with_underscore version added. -->
+ <xsl:template name="print_python_code">
+ <xsl:param name="text"/>
+
+ <xsl:variable name="a">
+ <xsl:call-template name="num_leading_spaces">
+ <xsl:with-param name="text" select="."/>
+ <xsl:with-param name="max_so_far" select="1000"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:variable name="b">
+ <xsl:call-template name="code_start_index">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="current_count" select="0"/>
+ </xsl:call-template>
+ </xsl:variable>
+
+ <xsl:call-template name="print_python_line_recursively">
+ <xsl:with-param name="text" select="$text"/>
+ <xsl:with-param name="a" select="$a"/>
+ <xsl:with-param name="b" select="$b"/>
+ <xsl:with-param name="previous_indent" select="$b"/>
+ <xsl:with-param name="previous_ends_with_colon" select="0"/>
+ <xsl:with-param name="is_first_line" select="1"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Given a block of text, each line terminated by \n, and a number n,
+ emits the text with the first n characters of each line
+ deleted. If strip==1, then we omit blank lines at the beginning
+ and end of the text (but not the middle!) -->
+ <!-- TODO(csilvers): deal well with leading tabs (treat as 8 spaces?) -->
+ <xsl:template name="print_without_leading_chars">
+ <xsl:param name="text"/>
+ <xsl:param name="trim_count"/>
+ <xsl:param name="strip"/>
+ <xsl:param name="is_firstline"/>
+ <!-- TODO(csilvers): deal with case text doesn't end in a newline -->
+ <xsl:variable name="line" select="substring-before($text, '&#xA;')"/>
+ <xsl:variable name="rest" select="substring-after($text, '&#xA;')"/>
+ <xsl:variable name="stripped_line" select="substring($line, $trim_count+1)"/>
+ <xsl:choose>
+ <!-- $line (or $rest) is considered empty if we'd trim the entire line -->
+ <xsl:when test="($strip = '1') and ($is_firstline = '1') and
+ (string-length($line) &lt;= $trim_count)">
+ </xsl:when>
+ <xsl:when test="($strip = '1') and
+ (string-length($rest) &lt;= $trim_count)">
+ <xsl:value-of select="$stripped_line"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$stripped_line"/>
+ <xsl:text>&#xA;</xsl:text>
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="not($rest='')">
+ <xsl:call-template name="print_without_leading_chars">
+ <xsl:with-param name="text" select="$rest"/>
+ <xsl:with-param name="trim_count" select="$trim_count"/>
+ <xsl:with-param name="strip" select="$strip"/>
+ <xsl:with-param name="is_firstline" select="0"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+
+ <!-- Given a line of code, find function names that are marked with $$ /$$ and
+ print out the line with the internal and external versions of the
+ function names.-->
+ <xsl:template name="munge_function_names_in_text">
+ <xsl:param name="stripped_line"/>
+ <xsl:choose>
+ <xsl:when test="contains($stripped_line, '$$')">
+ <xsl:value-of select="substring-before($stripped_line, '$$')"/>
+ <xsl:call-template name="print_function_name">
+ <xsl:with-param name="text" select="substring-after(substring-before($stripped_line, '/$$'), '$$')"/>
+ </xsl:call-template>
+ <xsl:call-template name="munge_function_names_in_text">
+ <xsl:with-param name="stripped_line" select="substring-after($stripped_line, '/$$')"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$stripped_line"/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!-- Given a function name, print out both the internal and external version
+ of the function name in their respective spans.-->
+ <xsl:template name="print_function_name">
+ <xsl:param name="text"/>
+ <xsl:call-template name="convert_camel_case_to_lowercase_with_under">
+ <xsl:with-param name="text" select="$text"/>
+ </xsl:call-template>
+ </xsl:template>
+
+ <!-- Given a single word of text convert it from CamelCase to
+ lower_with_under.
+ This means replacing each uppercase character with _ followed by the
+ lowercase version except for the first character which is replaced
+ without adding the _.-->
+ <xsl:template name="convert_camel_case_to_lowercase_with_under">
+ <xsl:param name="text"/>
+ <xsl:param name="is_recursive_call"/>
+ <xsl:variable name="first_char" select="substring($text, 1, 1)"/>
+ <xsl:variable name="rest" select="substring($text, 2)"/>
+ <xsl:choose>
+ <xsl:when test="contains('ABCDEFGHIJKLMNOPQRSTUVWXYZ', $first_char)">
+ <xsl:if test="$is_recursive_call='1'">
+ <xsl:text>_</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="translate($first_char, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$first_char" />
+ </xsl:otherwise>
+ </xsl:choose>
+ <xsl:if test="not($rest='')">
+ <xsl:call-template name="convert_camel_case_to_lowercase_with_under">
+ <xsl:with-param name="text" select="$rest"/>
+ <xsl:with-param name="is_recursive_call" select="1"/>
+ </xsl:call-template>
+ </xsl:if>
+ </xsl:template>
+</xsl:stylesheet>
+