Document the API using breathe.

This commit is contained in:
Victor Zverovich 2013-01-03 08:57:34 -08:00
parent 251e8774b0
commit 00830b99b3
6 changed files with 59 additions and 1280 deletions

View File

@ -1,5 +1,6 @@
add_custom_command(OUTPUT html/index.html add_custom_command(OUTPUT html/index.html
COMMAND doxygen COMMAND doxygen
COMMAND rm -rf ../html
COMMAND sphinx-build -b html . ../html COMMAND sphinx-build -b html . ../html
DEPENDS conf.py index.rst) DEPENDS conf.py index.rst)
add_custom_target(doc DEPENDS html/index.html) add_custom_target(doc DEPENDS html/index.html)

File diff suppressed because it is too large Load Diff

View File

@ -23,6 +23,8 @@ import sys, os
# If your documentation needs a minimal Sphinx version, state it here. # If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0' #needs_sphinx = '1.0'
sys.path.append("../breathe")
# Add any Sphinx extension module names here, as strings. They can be extensions # Add any Sphinx extension module names here, as strings. They can be extensions
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones. # coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
extensions = ['sphinx.ext.ifconfig', 'breathe'] extensions = ['sphinx.ext.ifconfig', 'breathe']
@ -52,9 +54,9 @@ copyright = u'1990-2012, Python Software Foundation'
# built documents. # built documents.
# #
# The short X.Y version. # The short X.Y version.
version = '0.2' version = '0.3'
# The full version, including alpha/beta/rc tags. # The full version, including alpha/beta/rc tags.
release = '0.2' release = '0.3'
# The language for content autogenerated by Sphinx. Refer to documentation # The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages. # for a list of supported languages.

View File

@ -1,39 +1,19 @@
.. highlight:: c++ .. highlight:: c++
.. _string-formatting:
String Formatting
-----------------
.. doxygenfunction:: format::Format(StringRef)
.. doxygenclass:: format::Formatter
:members:
.. ifconfig:: False .. ifconfig:: False
.. _string-formatting:
String Formatting
-----------------
The built-in string class provides the ability to do complex variable
substitutions and value formatting via the :func:`format` method described in
:pep:`3101`. The :class:`Formatter` class in the :mod:`format` module allows
you to create and customize your own string formatting behaviors using the same
implementation as the built-in :meth:`format` method.
.. class:: Formatter .. class:: Formatter
The :class:`Formatter` class has the following public methods:
.. method:: format(format_string, *args, **kwargs)
:meth:`format` is the primary API method. It takes a format string and
an arbitrary set of positional and keyword arguments.
:meth:`format` is just a wrapper that calls :meth:`vformat`.
.. method:: vformat(format_string, args, kwargs)
This function does the actual work of formatting. It is exposed as a
separate function for cases where you want to pass in a predefined
dictionary of arguments, rather than unpacking and repacking the
dictionary as individual arguments using the ``*args`` and ``**kwds``
syntax. :meth:`vformat` does the work of breaking up the format string
into character data and replacement fields. It calls the various
methods described below.
In addition, the :class:`Formatter` defines a number of methods that are In addition, the :class:`Formatter` defines a number of methods that are
intended to be replaced by subclasses: intended to be replaced by subclasses:
@ -111,8 +91,8 @@
Format String Syntax Format String Syntax
-------------------- --------------------
The :meth:`Format` function and the :class:`Formatter` class share the same The :cpp:func:`format::Format()` function and the :cpp:class:`format::Formatter`
syntax for format strings. class share the same syntax for format strings.
Format strings contain "replacement fields" surrounded by curly braces ``{}``. Format strings contain "replacement fields" surrounded by curly braces ``{}``.
Anything that is not contained in braces is considered literal text, which is Anything that is not contained in braces is considered literal text, which is

View File

@ -183,12 +183,12 @@ class BasicFormatter {
/** /**
\rst \rst
The :class:`Formatter` class provides string formatting The :cpp:class:`format::Formatter` class provides string formatting
functionality similar to Python's `str.format functionality similar to Python's `str.format
<http://docs.python.org/3/library/stdtypes.html#str.format>`__. <http://docs.python.org/3/library/stdtypes.html#str.format>`__.
The output is stored in a memory buffer that grows dynamically. The output is stored in a memory buffer that grows dynamically.
Usage:: **Example**::
Formatter out; Formatter out;
out("Current point:\n"); out("Current point:\n");
@ -502,10 +502,15 @@ inline internal::ArgInserter Formatter::operator()(StringRef format) {
return formatter; return formatter;
} }
// A formatting action that does nothing.
struct NoAction {
void operator()(const Formatter &) const {}
};
// A formatter with an action performed when formatting is complete. // A formatter with an action performed when formatting is complete.
// Objects of this class normally exist only as temporaries returned // Objects of this class normally exist only as temporaries returned
// by one of the formatting functions, thus the name. // by one of the formatting functions, thus the name.
template <typename Action> template <typename Action = NoAction>
class TempFormatter : public internal::ArgInserter { class TempFormatter : public internal::ArgInserter {
private: private:
Formatter formatter_; Formatter formatter_;
@ -529,9 +534,9 @@ class TempFormatter : public internal::ArgInserter {
// Action should be an unary function object that takes a const // Action should be an unary function object that takes a const
// reference to Formatter as an argument. See Ignore and Write // reference to Formatter as an argument. See Ignore and Write
// for examples of action classes. // for examples of action classes.
explicit TempFormatter(const char *format, Action a = Action()) explicit TempFormatter(StringRef format, Action a = Action())
: action_(a) { : action_(a) {
Init(formatter_, format); Init(formatter_, format.c_str());
} }
TempFormatter(const Proxy &p) TempFormatter(const Proxy &p)
@ -551,16 +556,25 @@ class TempFormatter : public internal::ArgInserter {
} }
}; };
// A formatting action that does nothing. /**
struct Ignore { \rst
void operator()(const Formatter &) const {} Formats a string. Returns a temporary formatter object that accepts
}; arguments via operator ``<<``. *format* is a format string that contains
literal text and replacement fields surrounded by braces ``{}``.
The formatter object replaces the fields with formatted arguments
and stores the output in a memory buffer. The content of the buffer can
be converted to ``std::string`` with :meth:`str` or accessed as a C string
with :meth:`c_str`.
// Formats a string. **Example**::
// Example:
// std::string s = str(Format("Elapsed time: {0:.2f} seconds") << 1.23); std::string message = str(Format("Elapsed time: {0:.2f} seconds") << 1.23);
inline TempFormatter<Ignore> Format(const char *format) {
return TempFormatter<Ignore>(format); See also `Format String Syntax`_.
\endrst
*/
inline TempFormatter<> Format(StringRef format) {
return TempFormatter<>(format);
} }
// A formatting action that writes formatted output to stdout. // A formatting action that writes formatted output to stdout.
@ -573,7 +587,7 @@ struct Write {
// Formats a string and prints it to stdout. // Formats a string and prints it to stdout.
// Example: // Example:
// Print("Elapsed time: {0:.2f} seconds") << 1.23; // Print("Elapsed time: {0:.2f} seconds") << 1.23;
inline TempFormatter<Write> Print(const char *format) { inline TempFormatter<Write> Print(StringRef format) {
return TempFormatter<Write>(format); return TempFormatter<Write>(format);
} }
} }

View File

@ -995,8 +995,8 @@ TEST(TempFormatterTest, ActionNotCalledOnError) {
TEST(TempFormatterTest, ArgLifetime) { TEST(TempFormatterTest, ArgLifetime) {
// The following code is for testing purposes only. It is a definite abuse // The following code is for testing purposes only. It is a definite abuse
// of the API and shouldn't be used in real applications. // of the API and shouldn't be used in real applications.
const fmt::TempFormatter<fmt::Ignore> &af = fmt::Format("{0}"); const fmt::TempFormatter<> &af = fmt::Format("{0}");
const_cast<fmt::TempFormatter<fmt::Ignore>&>(af) << std::string("test"); const_cast<fmt::TempFormatter<>&>(af) << std::string("test");
// String object passed as an argument to TempFormatter has // String object passed as an argument to TempFormatter has
// been destroyed, but ArgInserter dtor hasn't been called yet. // been destroyed, but ArgInserter dtor hasn't been called yet.
// But that's OK since the Arg's dtor takes care of this and // But that's OK since the Arg's dtor takes care of this and