mirror of
https://github.com/boostorg/website2022.git
synced 2026-01-19 04:52:07 +00:00
This is based off of revision 56094d2c9f510f5ee4f1ffd4eb6b73788aaa62d7
of https://github.com/boostorg/website/.
URL of exact commit is: 56094d2c9f
962 lines
31 KiB
HTML
962 lines
31 KiB
HTML
---
|
|
title: Boost Library Requirements and Guidelines
|
|
copyright: Beman Dawes, 2003. Rene Rivera, 2015.
|
|
revised:
|
|
---
|
|
|
|
|
|
Boost Library Requirements and Guidelines
|
|
|
|
|
|
|
|
Boost Library Requirements and Guidelines
|
|
=========================================
|
|
|
|
* [Introduction](#Introduction)
|
|
* [Requirements](#Requirements)
|
|
+ [License requirements](#License)
|
|
+ [Portability
|
|
requirements](#Portability)
|
|
+ [Ownership](#Ownership)
|
|
+ [Organization](#Organization)
|
|
+ [Integration](#Integration)
|
|
* [Guidelines](#Guidelines)
|
|
+ [Backwards Compatibility](#Backwards_compatibility)
|
|
+ [Design and
|
|
programming](#Design_and_Programming)
|
|
+ [Filenames](#Filenames)
|
|
+ [Naming
|
|
consistency](#Naming_consistency)
|
|
+ [Documentation](#Documentation)
|
|
* [Rationale](#Rationale)
|
|
+ [Exception-specification
|
|
rationale](#Exception-specification)
|
|
+ [Naming conventions
|
|
rationale](#Naming)
|
|
+ [Source code fonts
|
|
rationale](#code_fonts)
|
|
+ [Tabs rationale](#Tabs)
|
|
+ [Directory and filename
|
|
rationale](#FileNamesRat)
|
|
+ [ECMAScript/JavaScript
|
|
rationale](#JavaScript)
|
|
+ [Rationale
|
|
rationale](#Rationale_rationale)
|
|
+ [Acknowledgements
|
|
rationale](#Acknowledgements)
|
|
|
|
|
|
Introduction
|
|
------------
|
|
|
|
|
|
This page describes requirements and guidelines for the
|
|
content of a library submitted to Boost.
|
|
|
|
|
|
See the [Boost Library Submission
|
|
Process](submissions.html) page for a description of the process involved.
|
|
|
|
|
|
Requirements
|
|
------------
|
|
|
|
|
|
To avoid the frustration and wasted time of a proposed
|
|
library being rejected, it must meet these requirements:
|
|
|
|
|
|
* The license must meet the [license
|
|
requirements](#License) below. Restricted licenses like the GPL and
|
|
LGPL are not acceptable.
|
|
* The copyright [ownership](#Ownership) must be
|
|
clear.
|
|
* The library should be generally useful.
|
|
* The library must meet the [portability requirements](#Portability) below.
|
|
* The library should preferably meet the [organization requirements](#Organization) below. But is
|
|
only required to meet them after acceptance.
|
|
* The library must come reasonably close to meeting the
|
|
[Guidelines](#Guidelines) below.
|
|
+ [Design and
|
|
Programming](#Design_and_Programming)
|
|
+ [Filenames](#Filenames)
|
|
+ [Documentation](#Documentation)
|
|
* The author must be willing to participate in discussions
|
|
on the mailing list, and to refine the library
|
|
accordingly.
|
|
|
|
|
|
There's no requirement that an author read the mailing list
|
|
for a time before making a submission. It has been noted,
|
|
however, that submissions which begin "I just started to read
|
|
this mailing list ..." seem to fail, often embarrassingly.
|
|
|
|
|
|
### License
|
|
requirements
|
|
|
|
|
|
The preferred way to meet the license requirements is to use
|
|
the [Boost Software License](../LICENSE_1_0.txt).
|
|
See [license information](../users/license.html). If
|
|
for any reason you do not intend to use the Boost Software
|
|
License, please discuss the issues on the Boost [developers mailing list](../community/groups.html#main)
|
|
first.
|
|
|
|
|
|
The license requirements:
|
|
|
|
|
|
* Must be simple to read and understand.
|
|
* Must grant permission without fee to copy, use and modify
|
|
the software for any use (commercial and
|
|
non-commercial).
|
|
* Must require that the license appear on all copies of the
|
|
software source code.
|
|
* Must not require that the license appear with executables
|
|
or other binary uses of the library.
|
|
* Must not require that the source code be available for
|
|
execution or other binary uses of the library.
|
|
* May restrict the use of the name and description of the
|
|
library to the standard version found on the Boost web
|
|
site.
|
|
|
|
|
|
### Portability
|
|
requirements
|
|
|
|
|
|
* A library's interface must portable and not restricted to
|
|
a particular compiler or operating system.
|
|
* A library's implementation must if possible be portable
|
|
and not restricted to a particular compiler or operating
|
|
system. If a portable implementation is not possible,
|
|
non-portable constructions are acceptable if reasonably easy
|
|
to port to other environments, and implementations are
|
|
provided for at least two popular operating systems (such as
|
|
UNIX and Windows).
|
|
* There is no requirement that a library run on C++
|
|
compilers which do not conform to the ISO standard.
|
|
* There is no requirement that a library run on any
|
|
particular C++ compiler. Boost contributors often try to
|
|
ensure their libraries work with popular compilers. The
|
|
boost/config.hpp [configuration
|
|
header](../doc/libs/release/libs/config/config.htm) is the preferred mechanism for working around
|
|
compiler deficiencies.
|
|
|
|
|
|
Since there is no absolute way to prove portability, many
|
|
boost submissions demonstrate practical portability by
|
|
compiling and executing correctly with two different C++
|
|
compilers, often under different operating systems. Otherwise
|
|
reviewers may disbelieve that porting is in fact practical.
|
|
|
|
|
|
### Ownership
|
|
|
|
|
|
Are you sure you own the library you are thinking of
|
|
submitting? "How to Copyright Software" by MJ Salone, Nolo
|
|
Press, 1990 says:
|
|
>
|
|
> Doing work on your own time that is very similar to
|
|
> programming you do for your employer on company time can
|
|
> raise nasty legal problems. In this situation, it's best to
|
|
> get a written release from your employer in advance.
|
|
>
|
|
>
|
|
>
|
|
|
|
|
|
Place a copyright notice in all the important files you
|
|
submit. Boost won't accept libraries without clear copyright
|
|
information.
|
|
|
|
|
|
### Organization
|
|
|
|
|
|
The quality of the Boost libraries is not just about the
|
|
APIs and code design. But also about presenting a consistent
|
|
view to users of the libraries as a whole. Upon acceptance
|
|
libraries must adhere to this directory and file structure:
|
|
|
|
|
|
Boost standard library organization
|
|
| Sub-directory or file | Contents | Required |
|
|
| --- | --- | --- |
|
|
| `build` | Library build files such as a Jamfile, IDE projects,
|
|
Makefiles, Cmake files, etc. | Required if the library has sources to build. |
|
|
| `config` | Files used for build-time configuration checks. This
|
|
directory may contain source files and build system
|
|
scripts to be used when building the library, tests or
|
|
examples to check if the target system satisfies certain
|
|
conditions. For example, a check may test if the compiler
|
|
implements a certain feature, or if the target system
|
|
supports a certain API. | Optional. |
|
|
| `doc` | Sources to build with and built documentation for the
|
|
library. If the library needs to build documentation from
|
|
non-HTML files this location must be buildable with Boost
|
|
Build. | Required for all libraries. |
|
|
| `doc/html` | Documentation (HTML) files. | Required for all libraries with pregenerated
|
|
documentation. And generated documentation must be
|
|
generated here. |
|
|
| `example` | Sample program files. | Required if library has sample files. Which is highly
|
|
recommended. |
|
|
| `index.html` | Redirection to HTML documentation. See ["Redirection"](#Redirection) for a template for this
|
|
file. | Required for all libraries. |
|
|
| `include/boost/*library*` | Header files for the library. | Required for all libraries. |
|
|
| `meta` | Meta-data about the library. | Required for all libraries. |
|
|
| `meta/libraries.json` | [A JSON file containing
|
|
information about the library](library_metadata.html "Library Metadata File Format") used to generate
|
|
website and documentation for the Boost C++ Libraries
|
|
collection. | Required for all libraries. |
|
|
| `meta/explicit-failures-markup.xml` | XML file describing expected test failures, used to
|
|
generate the test report. | Optional |
|
|
| `src` | Source files which must be compiled to build the
|
|
library. | Required if the library has source files to
|
|
build. |
|
|
| `test` | Regression or other test programs or scripts. This is
|
|
the *only* location considered for automated
|
|
testing. If you have additional locations that need to be
|
|
part of automated testing it is required that this
|
|
location refer to the additional test locations. | Required for all libraries. |
|
|
| `tools` | Tools used, or offered, by the library. The structure
|
|
within this is up to the library, but it's recommended to
|
|
use similar structure as a regular Boost library or
|
|
tool. | Required for libraries that have runable tools. |
|
|
|
|
|
|
### Integration
|
|
|
|
|
|
Once a library is accepted as part of the Boost C++
|
|
Libraries it is required that it integrate properly into the
|
|
development, testing, documentation, and release processes.
|
|
This integration increases the eventual quality of all the
|
|
libraries and is integral to the expected quality of the whole
|
|
of the Boost C++ Libraries from users. In addition to the
|
|
[organization requirements](#Organization) above the
|
|
following integration is required:
|
|
|
|
|
|
#### Building Sources
|
|
|
|
|
|
The library needs to provide a Boost Build project that the
|
|
user, and the top level Boost project, can use to build the
|
|
library if it has sources to build. The Jamfile for the source
|
|
build needs to minimally declare the project, the library
|
|
target(s), and register the target(s) for installation. For
|
|
example:
|
|
```
|
|
|
|
project boost/my\_lib ;
|
|
|
|
lib boost\_my\_lib : a.cpp ;
|
|
|
|
boost-install boost\_my\_lib ;
|
|
|
|
```
|
|
|
|
#### Testing
|
|
|
|
|
|
The library needs to provide a Boost Build project that the
|
|
user, and the root Boost test script, can use to build and run
|
|
the tests for the library. The testing build project must
|
|
reside in the project-root/test directory and must be
|
|
buildable from this or another directory (for example, b2
|
|
libs/*library*/test from the Boost root must
|
|
work.)
|
|
|
|
|
|
An example test/Jamfile is given below:
|
|
```
|
|
|
|
import testing ;
|
|
|
|
run default\_constructor.cpp ;
|
|
run copy\_constructor.cpp ;
|
|
compile nested\_value\_type.cpp ;
|
|
compile-fail invalid\_conversion\_1.cpp ;
|
|
|
|
```
|
|
|
|
*WARNING:* This is the only location considered for
|
|
testing by the top level testing script. If you want to test
|
|
additional locations you must declare such that they are built
|
|
as dependencies or by using build-project.
|
|
|
|
|
|
If the library requires a level of C++ conformance that
|
|
precludes certain compilers or configurations from working,
|
|
it's possible (and recommended) to declare these requirements
|
|
in the test Jamfile so that the tests aren't run, to
|
|
conserve test resources, as given in the example below:
|
|
```
|
|
|
|
import testing ;
|
|
import ../../config/checks/config : requires ;
|
|
|
|
project : requirements [ requires cxx11\_variadic\_templates cxx11\_template\_aliases ] ;
|
|
|
|
run cpp11\_test.cpp ;
|
|
|
|
```
|
|
|
|
For more information, see the [documentation
|
|
of Boost.Config](../libs/config/doc/html/boost_config/build_config.html).
|
|
|
|
|
|
#### Building Documentation
|
|
|
|
|
|
The library needs to provide a Boost Build project for
|
|
building the documentation for the library. The
|
|
project-root/doc project is the only location refered
|
|
to by the top level documentation build scripts and the release
|
|
building scripts. The documentation build project must have the
|
|
following two features:
|
|
|
|
|
|
1. Define a boostdoc target. This target should
|
|
likely be an alias that looks roughly like:
|
|
|
|
|
|
```
|
|
|
|
alias boostdoc : my\_boostbook\_target
|
|
: : : <implicit-dependency>my\_boostbook\_target ;
|
|
|
|
```
|
|
But if your project doesn't integrate into the global documentation
|
|
book you can use an empty alias like:
|
|
|
|
|
|
```
|
|
|
|
alias boostdoc ;
|
|
|
|
```
|
|
2. The project must default to building standalone
|
|
documentation if it has any. The release scripts build this
|
|
default so as to guarantee all projects have up to date
|
|
documentation.
|
|
|
|
|
|
Guidelines
|
|
----------
|
|
|
|
|
|
Please use these guidelines as a checklist for preparing the
|
|
content a library submission. Not every guideline applies to
|
|
every library, but a reasonable effort to comply is
|
|
expected.
|
|
|
|
|
|
### Backwards Compatibility
|
|
Boost libraries generally have a large and diverse user base.
|
|
To ensure successful transitions from old APIs to newer APIs
|
|
under those circumstances, library authors are encouraged to
|
|
follow a few guidelines when introducing breaking changes in
|
|
their library:
|
|
|
|
1. Non-breaking changes can be done without restriction.
|
|
2. Small breaking changes can be made, but users should be
|
|
given notice a few releases before the change is published.
|
|
Most breaking changes fall into this category.
|
|
3. For large breaking changes with a migration path from
|
|
the old API to the new API (for example boost::filesystem
|
|
v2 to v3), the new API should be introduced in a separate
|
|
directory/namespace, and users should be noticed and given
|
|
a few releases to move over. The old API can be removed after
|
|
some time.
|
|
4. For large breaking changes without a migration path
|
|
(for example boost::spirit v2 to v3), the new API
|
|
should be provided in a separate directory/namespace, and the
|
|
old API should be preserved (because there's no migration path).
|
|
Removing the API should be considered the same as removing a
|
|
Boost library, which can be done but needs a more extensive
|
|
deprecation period.
|
|
5. Large breaking changes that are equivalent to a redesign or
|
|
rewrite of the library should be treated as a new library
|
|
and a formal review (or at least a mini review) is encouraged.
|
|
|
|
|
|
### Design and Programming
|
|
|
|
|
|
Aim first for clarity and correctness; optimization should
|
|
be only a secondary concern in most Boost libraries.
|
|
|
|
|
|
Aim for ISO Standard C++. Than means making effective use of
|
|
the standard features of the language, and avoiding
|
|
non-standard compiler extensions. It also means using the C++
|
|
Standard Library where applicable.
|
|
|
|
|
|
Headers should be good neighbors. See the [header policy](./header.html). See [Naming consistency](#Naming_consistency).
|
|
|
|
|
|
Follow quality programming practices. See, for example,
|
|
"Effective C++" 2nd Edition, and "More Effective C++", both by
|
|
Scott Meyers, published by Addison Wesley.
|
|
|
|
|
|
Use the C++ Standard Library or other Boost libraries, but
|
|
only when the benefits outweigh the costs. Do not use libraries
|
|
other than the C++ Standard Library or Boost. See [Library reuse](./reuse.html).
|
|
|
|
|
|
Read [Implementation
|
|
Variation](../community/implementation_variations.html) to see how to supply performance, platform, or
|
|
other implementation variations.
|
|
|
|
|
|
Browse through [the
|
|
Best Practices Handbook](https://svn.boost.org/trac/boost/wiki/BestPracticeHandbook) for ideas and links to source code
|
|
in existing Boost libraries.
|
|
|
|
|
|
Read the [guidelines
|
|
for libraries with separate source](./separate_compilation.html) to see how to ensure
|
|
that compiled link libraries meet user expectations.
|
|
|
|
|
|
Use the naming conventions of the C++ Standard Library (See
|
|
[Naming conventions rationale](#Naming)):
|
|
|
|
|
|
* Names (except as noted below) should be all lowercase,
|
|
with words separated by underscores.
|
|
* Acronyms should be treated as ordinary names (e.g.
|
|
`xml_parser` instead of
|
|
`XML_parser`).
|
|
* Template parameter names begin with an uppercase
|
|
letter.
|
|
* Macro (gasp!) names all uppercase and begin with
|
|
BOOST\_.
|
|
|
|
|
|
Choose meaningful names - explicit is better than implicit,
|
|
and readability counts. There is a strong preference for clear
|
|
and descriptive names, even if lengthy.
|
|
|
|
|
|
Use exceptions to report errors where appropriate, and write
|
|
code that is safe in the face of exceptions.
|
|
|
|
|
|
Avoid exception-specifications. See [exception-specification
|
|
rationale](#Exception-specification).
|
|
|
|
|
|
Provide sample programs or confidence tests so potential
|
|
users can see how to use your library.
|
|
|
|
|
|
Provide a regression test program or programs which follow
|
|
the [Test Policies and Protocols](./test.html).
|
|
|
|
|
|
Although some boost members use proportional fonts, tabs,
|
|
and unrestricted line lengths in their own code, boost's widely
|
|
distributed source code should follow more conservative
|
|
guidelines:
|
|
|
|
|
|
* Use fixed-width fonts. See [fonts
|
|
rationale](#code_fonts).
|
|
* Use spaces rather than tabs. See [tabs
|
|
rationale](#Tabs).
|
|
* Limit line lengths to 80 characters.
|
|
|
|
|
|
End all documentation files (HTML or otherwise) with a
|
|
copyright message and a licensing message. See the [license information](../users/license.html) page for the
|
|
preferred form.
|
|
|
|
|
|
Begin all source files (including programs, headers,
|
|
scripts, etc.) with:
|
|
|
|
|
|
* A comment line describing the contents of the file.
|
|
* Comments describing copyright and licensing: again, the
|
|
preferred form is indicated in the [license information](../users/license.html) page
|
|
* Note that developers are allowed to provide a copy of
|
|
the license text in `LICENSE_1_0.txt`,
|
|
`LICENSE.txt` or `LICENSE`
|
|
file within repositories of their libraries.
|
|
* A comment line referencing your library on the Boost web
|
|
site. For example:
|
|
|
|
```
|
|
|
|
// See https://www.boost.org/libs/foo for library home page.
|
|
|
|
```
|
|
|
|
Where `foo` is the directory name (see below)
|
|
for the library. As well as aiding users who come across a
|
|
Boost file detached from its documentation, some of Boost's
|
|
automatic tools depend on this comment to identify which
|
|
library header files belong to.
|
|
|
|
|
|
**Assertions:** If you want to add runtime
|
|
assertions to your code (you should!), avoid C's
|
|
`assert` macro and use Boost's
|
|
`BOOST_ASSERT` macro (in
|
|
`boost/assert.hpp` ) instead. It is more
|
|
configurable. Use `BOOST_ASSERT` in public headers
|
|
and in library source code (for separately compiled libraries).
|
|
Use of C's `assert` macro is ok in examples and in
|
|
documentation.
|
|
|
|
|
|
Make sure your code compiles in the presence of the
|
|
`min()` and `max()` macros. Some platform
|
|
headers define `min()` and `max()` macros
|
|
which cause some common C++ constructs to fail to compile. Some
|
|
simple tricks can protect your code from inappropriate macro
|
|
substitution:
|
|
|
|
|
|
* If you want to call `std::min()` or
|
|
`std::max()`:
|
|
+ If you do not require argument-dependent look-up, use
|
|
`(std::min)(a,b)`.
|
|
+ If you do require argument-dependent look-up, you
|
|
should:
|
|
- `#include
|
|
<boost/config.hpp>`
|
|
- Use `BOOST_USING_STD_MIN();` to bring
|
|
`std::min()` into the current scope.
|
|
- Use `min BOOST_PREVENT_MACRO_SUBSTITUTION
|
|
(a,b);` to make an argument-dependent call to
|
|
`min(a,b)`.
|
|
* If you want to call
|
|
`std::numeric_limits<int>::max()`, use
|
|
`(std::numeric_limits<int>::max)()`
|
|
instead.
|
|
* If you want to call a `min()` or
|
|
`max()` member function, instead to doing
|
|
`obj.min()`, use `(obj.min)()`.
|
|
* If you want to declare or define a function or a member
|
|
function named `min` or `max`, then you
|
|
must use the `BOOST_PREVENT_MACRO_SUBSTITUTION`
|
|
macro. Instead of writing `int min() { return 0;
|
|
}` you should write `int min
|
|
BOOST_PREVENT_MACRO_SUBSTITUTION () { return 0; }` This
|
|
is true regardless if the function is a free (namespace
|
|
scope) function, a member function or a static member
|
|
function, and it applies for the function declaration as well
|
|
as for the function definition.
|
|
|
|
|
|
###
|
|
Filenames
|
|
|
|
|
|
Naming requirements ensure that file and directory names are
|
|
relatively portable, including to ISO 9660:1999 (with
|
|
extensions) and other relatively limited file systems.
|
|
Superscript links are provided to detailed rationale for each
|
|
choice.
|
|
|
|
|
|
* Names must contain only
|
|
**lowercase**[1](#Filename_rationale_1) ASCII letters
|
|
(`'a'`-`'z'`), numbers
|
|
(`'0'`-`'9'`), underscores
|
|
(`'_'`), hyphens (`'-'`), and periods
|
|
(`'.'`). Spaces are not allowed[2](#Filename_rationale_2).
|
|
* Directory names must not contain periods
|
|
(`'.'`)[3](#Filename_Rationale_3).
|
|
* The first and last character of a file name must not be a
|
|
period (`'.'`)[4](#Filename_rationale_4).
|
|
* The first character of names must not be a hyphen
|
|
(`'-'`)[5](#Filename_rationale_5).
|
|
* The maximum length of directory and file names is 31
|
|
characters[6](#Filename_rationale_6).
|
|
* The total path length must not exceed 207
|
|
characters[7](#Filename_rationale_7).
|
|
|
|
|
|
Other conventions ease communication:
|
|
|
|
|
|
* Files intended to be processed by a C++ compiler as part
|
|
of a translation unit should have **a three-letter
|
|
filename extension ending in "pp"**. Other files
|
|
should *not* use extensions ending in "pp". This
|
|
convention makes it easy to identify all of the C++ source in
|
|
Boost.
|
|
* All libraries have at their highest level a primary
|
|
directory named for the particular library. See [Naming consistency](#Naming_consistency). The primary
|
|
directory may have sub-directories.
|
|
|
|
|
|
#### Redirection
|
|
|
|
|
|
The primary directory should always contain a file named
|
|
index.html. Authors have requested this so that they can
|
|
publish URL's in the form
|
|
*https://www.boost.org/libs/lib-name* with the assurance a
|
|
documentation reorganization won't invalidate the URL. Boost's
|
|
internal tools are also simplified by knowing that a library's
|
|
documentation is always reachable via the simplified URL.
|
|
|
|
|
|
The primary directory `index.html` file should
|
|
just do an automatic redirection to the `doc/html`
|
|
subdirectory:
|
|
```
|
|
|
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
|
|
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
|
|
|
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
|
<head>
|
|
<title>Boost.Name Documentation</title>
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<meta http-equiv="refresh" content="0; URL=doc/html/index.html" />
|
|
</head>
|
|
|
|
<body>
|
|
Automatic redirection failed, please go to <a href=
|
|
"doc/index.html">doc/index.html</a>
|
|
</body>
|
|
</html>
|
|
|
|
```
|
|
|
|
### Naming consistency
|
|
|
|
|
|
As library developers and users have gained experience with
|
|
Boost, the following consistent naming approach has come to be
|
|
viewed as very helpful, particularly for larger libraries that
|
|
need their own header subdirectories and namespaces.
|
|
|
|
|
|
Here is how it works. The library is given a name that
|
|
describes the contents of the library. Cryptic abbreviations
|
|
are strongly discouraged. Following the practice of the C++
|
|
Standard Library, names are usually singular rather than
|
|
plural. For example, a library dealing with file systems might
|
|
chose the name "filesystem", but not "filesystems", "fs" or
|
|
"nicecode".
|
|
|
|
|
|
* The library's primary directory (in parent
|
|
boost-root/libs) is given that same name. For
|
|
example, boost-root/libs/filesystem.
|
|
* The library's primary header directory (in
|
|
boost-root/libs/name/include) is given that same
|
|
name. For example,
|
|
boost-root/libs/filesystem/boost/filesystem.
|
|
* The library's primary namespace (in parent
|
|
*::boost*) is given that same name, except when
|
|
there's a component with that name (e.g.,
|
|
*boost::tuple*), in which case the namespace name is
|
|
pluralized. For example, *::boost::filesystem*.
|
|
|
|
|
|
When documenting Boost libraries, follow these conventions
|
|
(see also the following section of this document):
|
|
|
|
|
|
* The library name is set in roman type.
|
|
* The library name is capitalized.
|
|
* A period between "Boost" and the library name (e.g.,
|
|
Boost.Bind) is used if and only if the library name is not
|
|
followed by the word "library".
|
|
* The word "library" is not part of the library name and is
|
|
therefore lowercased.
|
|
|
|
|
|
Here are a few examples of how to apply these
|
|
conventions:
|
|
|
|
|
|
* Boost.Bind was written by Peter Dimov.
|
|
* The Boost Bind library was written by Peter Dimov.
|
|
* I regularly use Bind, a Boost library written by Peter
|
|
Dimov.
|
|
|
|
|
|
### Documentation
|
|
|
|
|
|
Even the simplest library needs some documentation; the
|
|
amount should be proportional to the need. The documentation
|
|
should assume the readers have a basic knowledge of C++, but
|
|
are not necessarily experts.
|
|
|
|
|
|
The format for documentation should be HTML, and should not
|
|
require an advanced browser or server-side extensions. Style
|
|
sheets are acceptable. ECMAScript/JavaScript is discouraged.
|
|
The documentation entry point should always be a file named
|
|
index.html; see [Redirection](#Redirection).
|
|
|
|
|
|
There is no single right way to do documentation. HTML
|
|
documentation is often organized quite differently from
|
|
traditional printed documents. Task-oriented styles differ from
|
|
reference oriented styles. In the end, it comes down to the
|
|
question: Is the documentation sufficient for the mythical
|
|
"average" C++ programmer to use the library successfully?
|
|
|
|
|
|
Appropriate topics for documentation often include:
|
|
|
|
|
|
* General introduction to the library. The introduction
|
|
particularly needs to include:
|
|
+ A very high-level overview of what the library is
|
|
good for, and perhaps what it isn't good for,
|
|
understandable even by those with no prior knowledge of
|
|
the problem domain.
|
|
+ The simplest possible ("hello world") example of
|
|
using the library.
|
|
* Tutorial covering basic use cases.
|
|
* Reference documentation:
|
|
+ Description of each class.
|
|
+ Relationship between classes.
|
|
+ For each function, as applicable, description,
|
|
requirements (preconditions), effects, post-conditions,
|
|
returns, and throws.
|
|
+ Discussion of error detection and recovery
|
|
strategy.
|
|
* How to compile and link.
|
|
* How to test.
|
|
* Version or revision history.
|
|
* Rationale for design decisions. See [Rationale rationale](#Rationale).
|
|
* Acknowledgements. See [Acknowledgments rationale.](#Acknowledgements)
|
|
|
|
|
|
If you need more help with how to write documentation you
|
|
can check out the article on [Writing
|
|
Documentation for Boost](../doc/libs/release/more/writingdoc/index.html).
|
|
|
|
|
|
Rationale
|
|
---------
|
|
|
|
|
|
Rationale for some of the requirements and guidelines
|
|
follows.
|
|
|
|
|
|
### Exception-specification
|
|
rationale
|
|
|
|
|
|
Exception specifications [ISO 15.4] are sometimes coded to
|
|
indicate what exceptions may be thrown, or because the
|
|
programmer hopes they will improve performance. But consider
|
|
the following member from a smart pointer:
|
|
```
|
|
|
|
T& operator\*() const throw() { return \*ptr; }
|
|
|
|
```
|
|
|
|
This function calls no other functions; it only manipulates
|
|
fundamental data types like pointers Therefore, no runtime
|
|
behavior of the exception-specification can ever be invoked.
|
|
The function is completely exposed to the compiler; indeed it
|
|
is declared inline Therefore, a smart compiler can easily
|
|
deduce that the functions are incapable of throwing exceptions,
|
|
and make the same optimizations it would have made based on the
|
|
empty exception-specification. A "dumb" compiler, however, may
|
|
make all kinds of pessimizations.
|
|
|
|
|
|
For example, some compilers turn off inlining if there is an
|
|
exception-specification. Some compilers add try/catch blocks.
|
|
Such pessimizations can be a performance disaster which makes
|
|
the code unusable in practical applications.
|
|
|
|
|
|
Although initially appealing, an exception-specification
|
|
tends to have consequences that require **very**
|
|
careful thought to understand. The biggest problem with
|
|
exception-specifications is that programmers use them as though
|
|
they have the effect the programmer would like, instead of the
|
|
effect they actually have.
|
|
|
|
|
|
A non-inline function is the one place a "throws nothing"
|
|
exception-specification may have some benefit with some
|
|
compilers.
|
|
|
|
|
|
### Naming conventions
|
|
rationale
|
|
|
|
|
|
The C++ standard committee's Library Working Group discussed
|
|
this issue in detail, and over a long period of time. The
|
|
discussion was repeated again in early boost postings. A short
|
|
summary:
|
|
|
|
|
|
* Naming conventions are contentious, and although several
|
|
are widely used, no one style predominates.
|
|
* Given the intent to propose portions of boost for the
|
|
next revision of the C++ standard library, boost decided to
|
|
follow the standard library's conventions.
|
|
* Once a library settles on a particular convention, a vast
|
|
majority of stakeholders want that style to be consistently
|
|
used.
|
|
|
|
|
|
### Source code fonts
|
|
rationale
|
|
|
|
|
|
Dave Abrahams comments: An important purpose (I daresay the
|
|
primary purpose) of source code is communication: the
|
|
documentation of intent. This is a doubly important goal for
|
|
boost, I think. Using a fixed-width font allows us to
|
|
communicate with more people, in more ways (diagrams are
|
|
possible) right there in the source. Code written for
|
|
fixed-width fonts using spaces will read reasonably well when
|
|
viewed with a variable-width font, and as far as I can tell
|
|
every editor supporting variable-width fonts also supports
|
|
fixed width. I don't think the converse is true.
|
|
|
|
|
|
### Tabs rationale
|
|
|
|
|
|
Tabs are banned because of the practical problems caused by
|
|
tabs in multi-developer projects like Boost, rather than any
|
|
dislike in principle. See [mailing list archives](../community/groups.html#archive).
|
|
Problems include maintenance of a single source file by
|
|
programmers using tabs and programmers using spaces, and the
|
|
difficulty of enforcing a consistent tab policy other than just
|
|
"no tabs". Discussions concluded that Boost files should either
|
|
all use tabs, or all use spaces, and thus the decision to stick
|
|
with spaces for indentation.
|
|
|
|
|
|
### Directory and
|
|
File Names rationale
|
|
|
|
|
|
1. Some legacy file systems require
|
|
single-case names. Single-case names eliminate casing mistakes
|
|
when moving from case-insensitive to case-sensitive file
|
|
systems.
|
|
|
|
|
|
2. This is the lowercase portion of
|
|
the POSIX portable filename character set. To quote the POSIX
|
|
standard, "Filenames should be constructed from the portable
|
|
filename character set because the use of other characters can
|
|
be confusing or ambiguous in certain contexts."
|
|
|
|
|
|
3. Strict implementations of ISO
|
|
9660:1999 and some legacy operating systems prohibit dots in
|
|
directory names. The need for this restriction is fading, and
|
|
it will probably be removed fairly soon.
|
|
|
|
|
|
4. POSIX has special rules for names
|
|
beginning with a period. Windows prohibits names ending in a
|
|
period.
|
|
|
|
|
|
5. Would be too confusing or
|
|
ambiguous in certain contexts.
|
|
|
|
|
|
6. We had to draw the line
|
|
somewhere, and so the limit imposed by a now obsolete Apple
|
|
file system was chosen years ago. It still seems a reasonable
|
|
limit to aid human comprehension.
|
|
|
|
|
|
7. ISO 9660:1999.
|
|
|
|
|
|
### ECMAScript/JavaScript rationale
|
|
|
|
|
|
Before the 1.29.0 release, two Boost libraries added
|
|
ECMAScript/JavaScript documentation. Controversy followed (see
|
|
[mailing list
|
|
archives](../community/groups.html#archive)), and the developers were asked to remove the
|
|
ECMAScript/JavaScript. Reasons given for banning included:
|
|
|
|
|
|
* Incompatible with some older browsers and some text based
|
|
browsers.
|
|
* Makes printing docs pages difficult.
|
|
* Often results in really bad user interface design.
|
|
* "It's just annoying in general."
|
|
* Would require Boost to test web pages for
|
|
ECMAScript/JavaScript compliance.
|
|
* Makes docs maintenance by other than the original
|
|
developer more difficult.
|
|
|
|
|
|
Please conside those reasons if you decide that JavaScript
|
|
is something you must use. In particular please keep in mind
|
|
that the Boost community is not responsible for testing your
|
|
use of JavaScript. And hence it is up to you to ensure that the
|
|
above issues are fully resolved in your use case.
|
|
|
|
|
|
ECMAScript/JavaScript use is allowed but discouraged for the
|
|
reasons above.
|
|
|
|
|
|
### Rationale rationale
|
|
|
|
|
|
Rationale is defined as "The fundamental reasons for
|
|
something; basis" by the American Heritage Dictionary.
|
|
|
|
|
|
Beman Dawes comments: Failure to supply contemporaneous
|
|
rationale for design decisions is a major defect in many
|
|
software projects. Lack of accurate rationale causes issues to
|
|
be revisited endlessly, causes maintenance bugs when a
|
|
maintainer changes something without realizing it was done a
|
|
certain way for some purpose, and shortens the useful lifetime
|
|
of software.
|
|
|
|
|
|
Rationale is fairly easy to provide at the time decisions
|
|
are made, but very hard to accurately recover even a short time
|
|
later.
|
|
|
|
|
|
### Acknowledgements rationale
|
|
|
|
|
|
As a library matures, it almost always accumulates
|
|
improvements suggested to the authors by other boost members.
|
|
It is a part of the culture of boost.org to acknowledge such
|
|
contributions, identifying the person making the suggestion.
|
|
Major contributions are usually acknowledged in the
|
|
documentation, while minor fixes are often mentioned in
|
|
comments within the code itself.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|