diff options
Diffstat (limited to '')
-rw-r--r-- | src/boost/tools/boostbook/xsl/function.xsl | 1217 |
1 files changed, 1217 insertions, 0 deletions
diff --git a/src/boost/tools/boostbook/xsl/function.xsl b/src/boost/tools/boostbook/xsl/function.xsl new file mode 100644 index 000000000..edba8ed1c --- /dev/null +++ b/src/boost/tools/boostbook/xsl/function.xsl @@ -0,0 +1,1217 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- + Copyright (c) 2002 Douglas Gregor <doug.gregor -at- gmail.com> + + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt) + --> +<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" + version="1.0"> + + <xsl:strip-space elements="requires effects postconditions returns throws + complexity notes rationale purpose"/> + + <!-- When true, the stylesheet will emit compact definitions of + functions when the function does not have any detailed + description. --> + <xsl:param name="boost.compact.function">1</xsl:param> + + <!-- The longest type length that is considered "short" for the + layout of function return types. When the length of the result type + and any storage specifiers is greater than this length, they will be + placed on a separate line from the function name and parameters + unless everything fits on a single line. --> + <xsl:param name="boost.short.result.type">12</xsl:param> + + <!-- Display a function declaration --> + <xsl:template name="function"> + <xsl:param name="indentation"/> + <xsl:param name="is-reference"/> + + <!-- Whether or not we should include parameter names in the output --> + <xsl:param name="include-names" select="$is-reference"/> + + <!-- What type of link the function name should have. This shall + be one of 'anchor' (the function output will be the target of + links), 'link' (the function output will link to a definition), or + 'none' (the function output will not be either a link or a link + target) --> + <xsl:param name="link-type"> + <xsl:choose> + <xsl:when test="$is-reference"> + <xsl:text>anchor</xsl:text> + </xsl:when> + <xsl:otherwise> + <xsl:text>link</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:param> + + <!-- The id we should link to or anchor as --> + <xsl:param name="link-to"> + <xsl:call-template name="generate.id"/> + </xsl:param> + + <!-- If we are printing a constructor --> + <xsl:param name="constructor-for"/> + + <!-- If we are printing a destructor --> + <xsl:param name="destructor-for"/> + + <!-- If we are printing a copy assignment operator --> + <xsl:param name="copy-assign-for"/> + + <!-- The name of this function --> + <xsl:param name="name" select="@name"/> + + <!-- True if this is the function's separate documentation --> + <xsl:param name="standalone" select="false()"/> + + <!-- True if we should suppress the template header --> + <xsl:param name="suppress-template" select="false()"/> + + <!-- Calculate the specifiers --> + <xsl:variable name="specifiers"> + <xsl:if test="@specifiers"> + <xsl:value-of select="concat(@specifiers, ' ')"/> + </xsl:if> + </xsl:variable> + + <!-- Calculate the type --> + <xsl:variable name="type"> + <xsl:value-of select="$specifiers"/> + + <xsl:choose> + <!-- Conversion operators have an empty type, because the return + type is part of the name --> + <xsl:when test="$name='conversion-operator'"/> + + <!-- Constructors and destructors have no return type --> + <xsl:when test="$constructor-for or $destructor-for"/> + + <!-- Copy assignment operators return a reference to the class + they are in, unless another type has been explicitly + provided in the element. --> + <xsl:when test="$copy-assign-for and not(type)"> + <xsl:value-of select="concat($copy-assign-for, '& ')"/> + </xsl:when> + + <xsl:otherwise> + <xsl:apply-templates select="type" mode="annotation"/> + <xsl:text> </xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <!-- Build the function name with return type --> + <xsl:variable name="function-name"> + <xsl:choose> + <xsl:when test="$constructor-for"> + <xsl:value-of select="$constructor-for"/> + </xsl:when> + <xsl:when test="$destructor-for"> + <xsl:value-of select="concat('~',$destructor-for)"/> + </xsl:when> + <xsl:when test="$copy-assign-for"> + <xsl:value-of select="'operator='"/> + </xsl:when> + <xsl:when test="$name='conversion-operator'"> + <xsl:text>operator </xsl:text> + <xsl:apply-templates select="type" mode="annotation"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$name"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:if test="not ($standalone) or + (local-name(.)='signature' and (position() > 1)) + or $suppress-template"> + <xsl:text> </xsl:text> + </xsl:if> + + <!-- Indent this declaration --> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + + <!-- Build the template header --> + <xsl:variable name="template-length"> + <xsl:choose> + <xsl:when test="$suppress-template"> + 0 + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="template.synopsis.length"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <!-- Build a full parameter string (without line breaks) --> + <xsl:variable name="param-string"> + <xsl:text>(</xsl:text> + <xsl:call-template name="function-parameters"> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="wrap" select="false()"/> + </xsl:call-template> + <xsl:text>)</xsl:text> + </xsl:variable> + + <!-- Build the text that follows the declarator--> + <xsl:variable name="postdeclarator"> + <xsl:if test="@cv and @cv != ''"> + <xsl:text> </xsl:text> + <xsl:value-of select="@cv"/> + </xsl:if> + </xsl:variable> + + <!-- Build the full declaration text --> + <xsl:variable name="decl-string" + select="concat($type, $function-name, $param-string, $postdeclarator)"/> + <xsl:variable name="end-column" + select="$template-length + string-length($decl-string) + $indentation"/> + + <xsl:choose> + <!-- Check if we should put the template header on its own line to + save horizontal space. --> + <xsl:when test="($template-length > 0) and + ($end-column > $max-columns)"> + <!-- Emit template header on its own line --> + <xsl:apply-templates select="template" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + + <!-- Emit the rest of the function declaration (without the + template header) indented two extra spaces. --> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation + 2"/> + <xsl:with-param name="is-reference" select="$is-reference"/> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="link-type" select="$link-type"/> + <xsl:with-param name="link-to" select="$link-to"/> + <xsl:with-param name="constructor-for" select="$constructor-for"/> + <xsl:with-param name="destructor-for" select="$destructor-for"/> + <xsl:with-param name="copy-assign-for" select="$copy-assign-for"/> + <xsl:with-param name="name" select="$name"/> + <xsl:with-param name="standalone" select="$standalone"/> + <xsl:with-param name="suppress-template" select="true()"/> + </xsl:call-template> + </xsl:when> + + <!-- Check if we can put the entire declaration on a single + line. --> + <xsl:when test="not($end-column > $max-columns)"> + <!-- Emit template header, if not suppressed --> + <xsl:if test="not($suppress-template)"> + <xsl:apply-templates select="template" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="wrap" select="false()"/> + <xsl:with-param name="highlight" select="true()"/> + </xsl:apply-templates> + </xsl:if> + + <!-- Emit specifiers --> + <xsl:call-template name="source-highlight"> + <xsl:with-param name="text" select="$specifiers"/> + </xsl:call-template> + + <!-- Emit type, if any --> + <xsl:choose> + <!-- Conversion operators have an empty type, because the return + type is part of the name --> + <xsl:when test="$name='conversion-operator'"/> + + <!-- Constructors and destructors have no return type --> + <xsl:when test="$constructor-for or $destructor-for"/> + + <!-- Copy assignment operators return a reference to the class + they are in, unless another type has been explicitly + provided in the element. --> + <xsl:when test="$copy-assign-for and not(type)"> + <xsl:value-of select="concat($copy-assign-for, '& ')"/> + </xsl:when> + + <xsl:otherwise> + <xsl:apply-templates select="type" mode="highlight"/> + <xsl:text> </xsl:text> + </xsl:otherwise> + </xsl:choose> + + <xsl:call-template name="link-or-anchor"> + <xsl:with-param name="to" select="$link-to"/> + <xsl:with-param name="text" select="$function-name"/> + <xsl:with-param name="link-type" select="$link-type"/> + <xsl:with-param name="highlight" select="true()"/> + </xsl:call-template> + + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="'('"/> + </xsl:call-template> + <xsl:call-template name="function-parameters"> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="indentation" + select="$indentation + $template-length + string-length($type) + + string-length($function-name) + 1"/> + <xsl:with-param name="final" select="true()"/> + </xsl:call-template> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="')'"/> + </xsl:call-template> + + <xsl:call-template name="source-highlight"> + <xsl:with-param name="text" select="$postdeclarator"/> + </xsl:call-template> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="';'"/> + </xsl:call-template> + </xsl:when> + + <!-- This declaration will take multiple lines --> + <xsl:otherwise> + <!-- Emit specifiers --> + <xsl:call-template name="source-highlight"> + <xsl:with-param name="text" select="$specifiers"/> + </xsl:call-template> + + <!-- Emit type, if any --> + <xsl:choose> + <!-- Conversion operators have an empty type, because the return + type is part of the name --> + <xsl:when test="$name='conversion-operator'"/> + + <!-- Constructors and destructors have no return type --> + <xsl:when test="$constructor-for or $destructor-for"/> + + <!-- Copy assignment operators return a reference to the class + they are in, unless another type has been explicitly + provided in the element. --> + <xsl:when test="$copy-assign-for and not(type)"> + <xsl:value-of select="concat($copy-assign-for, '& ')"/> + </xsl:when> + + <xsl:otherwise> + <xsl:apply-templates select="type" mode="highlight"/> + <xsl:text> </xsl:text> + </xsl:otherwise> + </xsl:choose> + + <xsl:if test="string-length($type) > $boost.short.result.type"> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + </xsl:if> + + <!-- Determine how many columns the type and storage + specifiers take on the same line as the function name. --> + <xsl:variable name="type-length"> + <xsl:choose> + <xsl:when test="string-length($type) > $boost.short.result.type"> + 0 + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="string-length($type)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:variable> + + <xsl:call-template name="link-or-anchor"> + <xsl:with-param name="to" select="$link-to"/> + <xsl:with-param name="text" select="$function-name"/> + <xsl:with-param name="link-type" select="$link-type"/> + <xsl:with-param name="highlight" select="true()"/> + </xsl:call-template> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="'('"/> + </xsl:call-template> + <xsl:call-template name="function-parameters"> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="indentation" + select="$indentation + $type-length + + string-length($function-name) + 1"/> + <xsl:with-param name="final" select="true()"/> + </xsl:call-template> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="')'"/> + </xsl:call-template> + <xsl:call-template name="source-highlight"> + <xsl:with-param name="text" select="$postdeclarator"/> + </xsl:call-template> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="';'"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Synopsis of function parameters, e.g., "(const T&, int x = 5)" --> + <xsl:template name="function-parameters"> + <!-- Indentation level of this parameter list --> + <xsl:param name="indentation"/> + + <!-- True if we should include parameter names --> + <xsl:param name="include-names" select="true()"/> + + <!-- True if we should wrap function parameters to the next line --> + <xsl:param name="wrap" select="true()"/> + + <!-- True if we are printing the final output --> + <xsl:param name="final" select="false()"/> + + <!-- Internal: The prefix to emit before a parameter --> + <xsl:param name="prefix" select="''"/> + + <!-- Internal: The list of parameters --> + <xsl:param name="parameters" select="parameter"/> + + <!-- Internal: The column we are on --> + <xsl:param name="column" select="$indentation"/> + + <!-- Internal: Whether this is the first parameter on this line or not --> + <xsl:param name="first-on-line" select="true()"/> + + <xsl:if test="$parameters"> + <!-- Information for this parameter --> + <xsl:variable name="parameter" select="$parameters[position()=1]"/> + <xsl:variable name="pack"> + <xsl:if test="$parameter/@pack=1"> + <xsl:choose> + <xsl:when test="$final"> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="'...'"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:text>...</xsl:text> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:variable> + <xsl:variable name="name"> + <xsl:if test="$include-names and $parameter/@name != ''"> + <xsl:text> </xsl:text><xsl:value-of select="$parameter/@name"/> + </xsl:if> + </xsl:variable> + + <xsl:variable name="type" select="string($parameter/paramtype)"/> + + <xsl:variable name="default"> + <xsl:choose> + <xsl:when test="$parameter/@default"> + <xsl:choose> + <xsl:when test="$final"> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="concat(' = ', $parameter/@default)"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:text> = </xsl:text> + <xsl:value-of select="$parameter/@default"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + <xsl:when test="$parameter/default"> + <xsl:choose> + <xsl:when test="$final"> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="' = '"/> + </xsl:call-template> + <xsl:apply-templates + select="$parameter/default/*|$parameter/default/text()" + mode="annotation"> + <xsl:with-param name="highlight" select="true()"/> + </xsl:apply-templates> + </xsl:when> + <xsl:otherwise> + <xsl:text> = </xsl:text> + <xsl:value-of select="string($parameter/default)"/> + </xsl:otherwise> + </xsl:choose> + </xsl:when> + </xsl:choose> + </xsl:variable> + + <xsl:variable name="text" select="concat($type, $pack, $name, $default)"/> + + <xsl:variable name="end-column" + select="$column + string-length($prefix) + string-length($text)"/> + + <xsl:choose> + <!-- Parameter goes on this line --> + <xsl:when test="$first-on-line or ($end-column < $max-columns) + or not($wrap)"> + <xsl:choose> + <xsl:when test="$final"> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="$prefix"/> + </xsl:call-template> + <xsl:apply-templates + select="$parameter/paramtype/*|$parameter/paramtype/text()" + mode="annotation"> + <xsl:with-param name="highlight" select="true()"/> + </xsl:apply-templates> + <xsl:copy-of select="$pack"/> + <xsl:value-of select="$name"/> + <xsl:copy-of select="$default"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="concat($prefix, $text)"/> + </xsl:otherwise> + </xsl:choose> + + <xsl:call-template name="function-parameters"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="wrap" select="$wrap"/> + <xsl:with-param name="final" select="$final"/> + <xsl:with-param name="parameters" + select="$parameters[position()!=1]"/> + <xsl:with-param name="prefix" select="', '"/> + <xsl:with-param name="column" select="$end-column"/> + <xsl:with-param name="first-on-line" select="false()"/> + </xsl:call-template> + </xsl:when> + <!-- Parameter goes on next line --> + <xsl:otherwise> + <!-- The comma goes on this line --> + <xsl:choose> + <xsl:when test="$final"> + <xsl:call-template name="highlight-text"> + <xsl:with-param name="text" select="$prefix"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="$prefix"/> + </xsl:otherwise> + </xsl:choose> + <xsl:text> </xsl:text> + + <!-- Indent and print the parameter --> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + <xsl:choose> + <xsl:when test="$final"> + <xsl:apply-templates + select="$parameter/paramtype/*|$parameter/paramtype/text()" + mode="annotation"> + <xsl:with-param name="highlight" select="true()"/> + </xsl:apply-templates> + <xsl:copy-of select="$pack"/> + <xsl:value-of select="$name"/> + <xsl:copy-of select="$default"/> + </xsl:when> + <xsl:otherwise> + <xsl:value-of select="concat($prefix, $text)"/> + </xsl:otherwise> + </xsl:choose> + + <!-- Emit next parameter --> + <xsl:call-template name="function-parameters"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="include-names" select="$include-names"/> + <xsl:with-param name="wrap" select="$wrap"/> + <xsl:with-param name="final" select="$final"/> + <xsl:with-param name="parameters" + select="$parameters[position()!=1]"/> + <xsl:with-param name="prefix" select="', '"/> + <xsl:with-param name="column" + select="1 + string-length($text) + $indentation"/> + <xsl:with-param name="first-on-line" select="false()"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:if> + </xsl:template> + + <!-- Function synopsis --> + <xsl:template match="function|method" mode="synopsis"> + <xsl:param name="indentation"/> + + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1') and + not (local-name(.)='method')"/> + + <xsl:choose> + <xsl:when test="$compact"> + <xsl:if test="purpose"> + <!-- Compact display outputs the purpose as a comment (if + there is one) and the entire function declaration. --> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + + <xsl:call-template name="highlight-comment"> + <xsl:with-param name="text"> + <xsl:text>// </xsl:text> + <xsl:apply-templates select="purpose/*|purpose/text()" + mode="purpose"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="is-reference" select="true()"/> + </xsl:call-template> + </xsl:when> + <xsl:otherwise> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="is-reference" select="false()"/> + </xsl:call-template> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <xsl:template match="overloaded-function|overloaded-method" mode="synopsis"> + <xsl:param name="indentation"/> + + <xsl:variable name="name" select="@name"/> + + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1') and + not (local-name(.)='overloaded-method')"/> + + <xsl:choose> + <xsl:when test="$compact"> + <xsl:if test="purpose"> + <!-- Compact display outputs the purpose as a comment (if + there is one) and the entire function declaration. --> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + + <xsl:call-template name="highlight-comment"> + <xsl:with-param name="text"> + <xsl:text>// </xsl:text> + <xsl:apply-templates select="purpose" mode="annotation"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="name" select="$name"/> + </xsl:call-template> + </xsl:for-each> + </xsl:when> + <xsl:when test="local-name(..)='namespace'"> + <xsl:variable name="link-to"> + <xsl:call-template name="generate.id"/> + </xsl:variable> + + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="is-reference" select="false()"/> + <xsl:with-param name="name" select="$name"/> + <xsl:with-param name="link-to" select="$link-to"/> + </xsl:call-template> + </xsl:for-each> + </xsl:when> + <xsl:otherwise> + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="$indentation"/> + <xsl:with-param name="is-reference" select="false()"/> + <xsl:with-param name="name" select="$name"/> + </xsl:call-template> + </xsl:for-each> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Group free functions together under a category name (header synopsis)--> + <xsl:template match="free-function-group" mode="header-synopsis"> + <xsl:param name="class"/> + <xsl:param name="indentation"/> + <xsl:apply-templates select="function|overloaded-function" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + </xsl:template> + + <!-- Constructors, destructor, and assignment operators --> + <xsl:template name="construct-copy-destruct-synopsis"> + <xsl:param name="indentation"/> + <xsl:if test="constructor|copy-assignment|destructor"> + <xsl:if test="typedef|static-constant"> + <xsl:text> </xsl:text> + </xsl:if> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + <xsl:call-template name="highlight-comment"> + <xsl:with-param name="text"> + <xsl:text>// </xsl:text> + <xsl:call-template name="internal-link"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + <xsl:text>construct-copy-destruct</xsl:text> + </xsl:with-param> + <xsl:with-param name="text" select="'construct/copy/destruct'"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + <xsl:apply-templates select="constructor" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + <xsl:apply-templates select="copy-assignment" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + <xsl:apply-templates select="destructor" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + </xsl:if> + </xsl:template> + + <xsl:template name="construct-copy-destruct-reference"> + <xsl:if test="constructor|copy-assignment|destructor"> + <xsl:call-template name="member-documentation"> + <xsl:with-param name="name"> + <xsl:call-template name="anchor"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + <xsl:text>construct-copy-destruct</xsl:text> + </xsl:with-param> + <xsl:with-param name="text" select="''"/> + </xsl:call-template> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text"> + <xsl:call-template name="object-name"/> + </xsl:with-param> + </xsl:call-template> + <xsl:text> </xsl:text> + <xsl:call-template name="access-name"/> + <xsl:text> construct/copy/destruct</xsl:text> + </xsl:with-param> + <xsl:with-param name="text"> + <orderedlist> + <xsl:apply-templates select="constructor" mode="reference"/> + <xsl:apply-templates select="copy-assignment" mode="reference"/> + <xsl:apply-templates select="destructor" mode="reference"/> + </orderedlist> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template match="constructor" mode="reference"> + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="constructor-for"> + <xsl:call-template name="object-name"/> + </xsl:with-param> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:template> + + <xsl:template match="copy-assignment" mode="reference"> + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="copy-assign-for"> + <xsl:call-template name="object-name"/> + </xsl:with-param> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:template> + + <xsl:template match="destructor" mode="reference"> + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="destructor-for"> + <xsl:call-template name="object-name"/> + </xsl:with-param> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:template> + + <!-- Templates for functions --> + <xsl:template name="function.documentation"> + <xsl:param name="text"/> + <xsl:choose> + <xsl:when test="count(ancestor::free-function-group) > 0 + or count(ancestor::method-group) > 0 + or local-name(.)='constructor' + or local-name(.)='copy-assignment' + or local-name(.)='destructor'"> + <listitem><xsl:copy-of select="$text"/></listitem> + </xsl:when> + <xsl:otherwise> + <xsl:copy-of select="$text"/> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Semantic descriptions of functions --> + <xsl:template name="function-requirements"> + <xsl:param name="namespace-reference" select="false()"/> + + <xsl:if test="$namespace-reference=false()"> + <xsl:apply-templates select="purpose/*|purpose/text()"/> + </xsl:if> + + <xsl:apply-templates select="description/*"/> + + <xsl:if test="parameter/description|signature/parameter/description| + template/template-type-parameter/purpose| + template/template-nontype-parameter/purpose| + requires|effects|postconditions|returns|throws|complexity| + notes|rationale"> + <variablelist spacing="compact"> + <xsl:processing-instruction name="dbhtml"> + list-presentation="table" + </xsl:processing-instruction> + + <!-- Document parameters --> + <xsl:if test="parameter/description|signature/parameter/description"> + <varlistentry> + <term>Parameters:</term> + <listitem> + <variablelist spacing="compact"> + <xsl:processing-instruction name="dbhtml"> + list-presentation="table" + </xsl:processing-instruction> + <xsl:for-each select="parameter|signature/parameter"> + <xsl:sort select="attribute::name"/> + <xsl:if test="description"> + <varlistentry> + <term> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text" select="@name"/> + </xsl:call-template> + </term> + <listitem> + <xsl:apply-templates select="description/*"/> + </listitem> + </varlistentry> + </xsl:if> + </xsl:for-each> + </variablelist> + </listitem> + </varlistentry> + </xsl:if> + + <!-- Document template parameters --> + <xsl:if test="template/template-type-parameter/purpose| + template/template-nontype-parameter/purpose"> + <varlistentry> + <term>Template Parameters:</term> + <listitem> + <variablelist spacing="compact"> + <xsl:processing-instruction name="dbhtml"> + list-presentation="table" + </xsl:processing-instruction> + <xsl:for-each select="template/template-type-parameter| + template/template-nontype-parameter"> + <xsl:sort select="attribute::name"/> + <xsl:if test="purpose"> + <varlistentry> + <term> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text" select="@name"/> + </xsl:call-template> + </term> + <listitem> + <xsl:apply-templates select="purpose/*"/> + </listitem> + </varlistentry> + </xsl:if> + </xsl:for-each> + </variablelist> + </listitem> + </varlistentry> + </xsl:if> + + <!-- Document rest of function's contract --> + <xsl:for-each select="requires|effects|postconditions|returns|throws|complexity| + notes|rationale"> + <varlistentry> + <term><xsl:call-template name="function.requirement.name"/>:</term> + <listitem> + <xsl:apply-templates select="./*|./text()" mode="annotation"/> + </listitem> + </varlistentry> + </xsl:for-each> + + </variablelist> + </xsl:if> + + <xsl:if test="para"> + <xsl:message> + <xsl:text>Warning: Use of 'para' elements in a function is deprecated. </xsl:text> + <xsl:text> Wrap them in a 'description' element.</xsl:text> + </xsl:message> + <xsl:call-template name="print.warning.context"/> + <xsl:apply-templates select="para"/> + </xsl:if> + + </xsl:template> + + <xsl:template name="function.requirement.name"> + <xsl:param name="node" select="."/> + <xsl:choose> + <xsl:when test="local-name($node)='requires'">Requires</xsl:when> + <xsl:when test="local-name($node)='effects'">Effects</xsl:when> + <xsl:when test="local-name($node)='postconditions'"> + <xsl:text>Postconditions</xsl:text> + </xsl:when> + <xsl:when test="local-name($node)='returns'">Returns</xsl:when> + <xsl:when test="local-name($node)='throws'">Throws</xsl:when> + <xsl:when test="local-name($node)='complexity'">Complexity</xsl:when> + <xsl:when test="local-name($node)='notes'">Notes</xsl:when> + <xsl:when test="local-name($node)='rationale'">Rationale</xsl:when> + <xsl:otherwise> + <xsl:message> + <xsl:text>Error: unhandled node type `</xsl:text> + <xsl:value-of select="local-name($node)"/> + <xsl:text>' in template function.requirement.name.</xsl:text> + </xsl:message> + </xsl:otherwise> + </xsl:choose> + </xsl:template> + + <!-- Function reference --> + <xsl:template match="function|method" mode="reference"> + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1') and + not (local-name(.)='method')"/> + + <xsl:if test="not ($compact)"> + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="link-type" select="'anchor'"/> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <!-- Reference for functions at namespace level --> + <xsl:template match="function" mode="namespace-reference"> + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1')"/> + + <xsl:if test="not ($compact)"> + <xsl:call-template name="reference-documentation"> + <xsl:with-param name="name"> + <xsl:text>Function </xsl:text> + <xsl:if test="template"> + <xsl:text>template </xsl:text> + </xsl:if> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text" select="@name"/> + </xsl:call-template> + </xsl:with-param> + <xsl:with-param name="refname"> + <xsl:call-template name="fully-qualified-name"> + <xsl:with-param name="node" select="."/> + </xsl:call-template> + </xsl:with-param> + <xsl:with-param name="purpose" select="purpose/*|purpose/text()"/> + <xsl:with-param name="anchor"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="synopsis"> + <xsl:call-template name="header-link"/> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="link-type" select="'none'"/> + </xsl:call-template> + </xsl:with-param> + <xsl:with-param name="text"> + <xsl:call-template name="function-requirements"> + <xsl:with-param name="namespace-reference" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template match="overloaded-function" mode="reference"> + <xsl:variable name="name" select="@name"/> + + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1')"/> + + <xsl:if test="not ($compact)"> + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:attribute name="id"> + <xsl:call-template name="generate.id"/> + </xsl:attribute> + + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="name" select="$name"/> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:for-each> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template match="overloaded-function" mode="namespace-reference"> + <!-- True if we should compact this function --> + <xsl:variable name="compact" + select="not (para|description|requires|effects|postconditions|returns| + throws|complexity|notes|rationale) and + ($boost.compact.function='1')"/> + + <xsl:variable name="name" select="@name"/> + + <xsl:if test="not ($compact)"> + <xsl:call-template name="reference-documentation"> + <xsl:with-param name="name"> + <xsl:text>Function </xsl:text> + <xsl:if test="template"> + <xsl:text>template </xsl:text> + </xsl:if> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text" select="@name"/> + </xsl:call-template> + </xsl:with-param> + <xsl:with-param name="refname"> + <xsl:call-template name="fully-qualified-name"> + <xsl:with-param name="node" select="."/> + </xsl:call-template> + </xsl:with-param> + <xsl:with-param name="purpose" select="purpose/*|purpose/text()"/> + <xsl:with-param name="anchor"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="synopsis"> + <xsl:call-template name="header-link"/> + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="link-type" select="'none'"/> + <xsl:with-param name="name" select="$name"/> + </xsl:call-template> + </xsl:for-each> + </xsl:with-param> + <xsl:with-param name="text"> + <xsl:call-template name="function-requirements"> + <xsl:with-param name="namespace-reference" select="true()"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <xsl:template match="overloaded-method" mode="reference"> + <xsl:variable name="name" select="@name"/> + + <xsl:call-template name="function.documentation"> + <xsl:with-param name="text"> + <para> + <xsl:call-template name="preformatted"> + <xsl:with-param name="text"> + <xsl:call-template name="anchor"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + </xsl:call-template> + <xsl:for-each select="signature"> + <xsl:call-template name="function"> + <xsl:with-param name="indentation" select="0"/> + <xsl:with-param name="is-reference" select="true()"/> + <xsl:with-param name="name" select="$name"/> + <xsl:with-param name="standalone" select="true()"/> + </xsl:call-template> + </xsl:for-each> + </xsl:with-param> + </xsl:call-template> + </para> + <xsl:call-template name="function-requirements"/> + </xsl:with-param> + </xsl:call-template> + </xsl:template> + + <!-- Group member functions together under a category name (synopsis)--> + <xsl:template match="method-group" mode="synopsis"> + <xsl:param name="indentation"/> + <xsl:if test="count(child::*) > 0"> + <xsl:text> </xsl:text> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + <xsl:call-template name="highlight-comment"> + <xsl:with-param name="text"> + <xsl:text>// </xsl:text> + <xsl:call-template name="internal-link"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="text" select="string(@name)"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + <xsl:apply-templates select="method|overloaded-method" + mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + </xsl:if> + </xsl:template> + + <!-- Group member functions together under a category name (reference)--> + <xsl:template match="method-group" mode="reference"> + <xsl:if test="count(child::*) > 0"> + <xsl:call-template name="member-documentation"> + <xsl:with-param name="name"> + <xsl:call-template name="anchor"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="text" select="''"/> + </xsl:call-template> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text"> + <xsl:call-template name="object-name"/> + </xsl:with-param> + </xsl:call-template> + <xsl:text> </xsl:text> + <xsl:value-of select="@name"/> + </xsl:with-param> + <xsl:with-param name="text"> + <orderedlist> + <xsl:apply-templates select="method|overloaded-method" + mode="reference"/> + </orderedlist> + </xsl:with-param> + </xsl:call-template> + </xsl:if> + </xsl:template> + + <!-- Group free functions together under a category name (synopsis)--> + <xsl:template match="free-function-group" mode="synopsis"> + <xsl:param name="class"/> + <xsl:param name="indentation"/> + <xsl:text> </xsl:text> + <xsl:text> </xsl:text> + <xsl:call-template name="indent"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:call-template> + <xsl:call-template name="highlight-comment"> + <xsl:with-param name="text"> + <xsl:text>// </xsl:text> + <xsl:call-template name="internal-link"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="text" select="string(@name)"/> + </xsl:call-template> + </xsl:with-param> + </xsl:call-template> + <xsl:apply-templates select="function|overloaded-function" mode="synopsis"> + <xsl:with-param name="indentation" select="$indentation"/> + </xsl:apply-templates> + </xsl:template> + + <!-- Group free functions together under a category name (reference)--> + <xsl:template match="free-function-group" mode="reference"> + <xsl:param name="class"/> + <xsl:call-template name="member-documentation"> + <xsl:with-param name="name"> + <xsl:call-template name="anchor"> + <xsl:with-param name="to"> + <xsl:call-template name="generate.id"/> + </xsl:with-param> + <xsl:with-param name="text" select="''"/> + </xsl:call-template> + <xsl:call-template name="monospaced"> + <xsl:with-param name="text" select="$class"/> + </xsl:call-template> + <xsl:value-of select="concat(' ',@name)"/> + </xsl:with-param> + <xsl:with-param name="text"> + <orderedlist> + <xsl:apply-templates select="function|overloaded-function" + mode="reference"/> + </orderedlist> + </xsl:with-param> + </xsl:call-template> + </xsl:template> +</xsl:stylesheet> |