Contribution Guidelines
On this page
Code Style
When contributing code, in addition to following the C++ Core Guidelines, please follow the same design guidelines and style guidelines as mongodb/mongo. Additions and exceptions are listed below. For anything that isn't explicitly covered here, default to the Google C++ Style Guide. Running clang-format with our configuration file, mongo-cxx-driver/.clang-format, will help ensure your code conforms to the above standards.
Commit Messages
If a pull-request addresses a JIRA ticket, for a single-commit PR, prefix the subject line with the ticket ID. (For a multi-commit PR, we will add the ID later when we squash or merge it.)
CXX-883 Add commit message conventions to CONTRIBUTING.md
Capitalize subject lines and don't use a trailing period. Keep the subject at most 70 characters long. Use active voice! Imagine this preamble to get your phrasing right:
If applied, this commit will... [your subject line]
See Chris Beams' How to write a git commit message for more good guidelines to follow.
Lifecycle Methods
default-or-argument-bearing 'user' constructors
declaration-or-deletion-of-copy-constructor
declaration-or-deletion-of-move-constructor
declaration-or-deletion-of-copy-assignment-operator
declaration-or-deletion-of-move-assignment-operator
declaration-of-dtor
Headers
Public headers must have a ".hpp" suffix. Private headers must have a ".hh" suffix.
General structure:
License
Include Guard (
#pragma once
)Header Prelude
System Headers
<vector>
(alphabetical order)Driver Headers
<path/to/header.hpp>
(alphabetical order)Open Namespace mongocxx
inline namespace v_noabi {
Code
} // namespace v_noabi
Close Namespace mongocxx
Header Postlude
Example:
// Copyright 2018-present MongoDB Inc. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. namespace mongocxx { inline namespace v_noabi { // Declarations // Inline Implementations } // namespace v_noabi } // namespace mongocxx
Class Declarations
Guidelines:
Blank line at beginning and end of class declaration
Public section up top / private at bottom
Lifecycle methods first (see rules above)
Private Member Ordering
Friendships
Private Constructors
Private Methods
Private Variables
Example:
class foo { public: foo(); foo(foo&& other) noexcept; foo& operator=(foo&& other) noexcept; ~foo(); private: friend baz; class MONGOCXX_PRIVATE impl; std::unique_ptr<impl> _impl; };
Inlines
Define outside of class declaration
Specify inline keyword in declaration and definition (for clarity)
Relational Operators
Prefer to use free functions