Boost logo

Boost-Commit :

From: chris_at_[hidden]
Date: 2008-07-10 19:05:26


Author: chris_kohlhoff
Date: 2008-07-10 19:05:26 EDT (Thu, 10 Jul 2008)
New Revision: 47298
URL: http://svn.boost.org/trac/boost/changeset/47298

Log:
Fix generation for some links from tutorial to reference material.

Text files modified:
   trunk/libs/asio/doc/reference.dox | 2
   trunk/libs/asio/doc/tutorial.dox | 2
   trunk/libs/asio/doc/tutorial.qbk | 80 ++++++++++--------
   trunk/libs/asio/doc/tutorial.xsl | 168 +++++++++++++++++++++++++++++++++++++++
   4 files changed, 213 insertions(+), 39 deletions(-)

Modified: trunk/libs/asio/doc/reference.dox
==============================================================================
--- trunk/libs/asio/doc/reference.dox (original)
+++ trunk/libs/asio/doc/reference.dox 2008-07-10 19:05:26 EDT (Thu, 10 Jul 2008)
@@ -200,7 +200,7 @@
 # Configuration::additions related to external references
 #---------------------------------------------------------------------------
 TAGFILES =
-GENERATE_TAGFILE =
+GENERATE_TAGFILE = reference.tags
 ALLEXTERNALS = NO
 EXTERNAL_GROUPS = YES
 PERL_PATH = /usr/bin/perl

Modified: trunk/libs/asio/doc/tutorial.dox
==============================================================================
--- trunk/libs/asio/doc/tutorial.dox (original)
+++ trunk/libs/asio/doc/tutorial.dox 2008-07-10 19:05:26 EDT (Thu, 10 Jul 2008)
@@ -188,7 +188,7 @@
 #---------------------------------------------------------------------------
 # Configuration::additions related to external references
 #---------------------------------------------------------------------------
-TAGFILES =
+TAGFILES = reference.tags
 GENERATE_TAGFILE =
 ALLEXTERNALS = NO
 EXTERNAL_GROUPS = YES

Modified: trunk/libs/asio/doc/tutorial.qbk
==============================================================================
--- trunk/libs/asio/doc/tutorial.qbk (original)
+++ trunk/libs/asio/doc/tutorial.qbk 2008-07-10 19:05:26 EDT (Thu, 10 Jul 2008)
@@ -88,7 +88,8 @@
 
 
 
-All programs that use asio need to have at least one boost::asio::io\_service object. This class provides access to I/O functionality. We declare an object of this type first thing in the main function.
+All programs that use asio need to have at least one
+[link boost_asio.reference.io_service io_service] object. This class provides access to I/O functionality. We declare an object of this type first thing in the main function.
 
 
 
@@ -106,9 +107,9 @@
 
 
 
-In this simple example we perform a blocking wait on the timer. That is, the call to boost::asio::deadline\_timer::wait() will not return until the timer has expired, 5 seconds after it was created (i.e. not from when the wait starts).
+In this simple example we perform a blocking wait on the timer. That is, the call to [link boost_asio.reference.basic_deadline_timer.wait deadline_timer::wait()] will not return until the timer has expired, 5 seconds after it was created (i.e. not from when the wait starts).
 
-A deadline timer is always in one of two states: "expired" or "not expired". If the boost::asio::deadline\_timer::wait() function is called on an expired timer, it will return immediately.
+A deadline timer is always in one of two states: "expired" or "not expired". If the [link boost_asio.reference.basic_deadline_timer.wait deadline_timer::wait()] function is called on an expired timer, it will return immediately.
 
 
   ``''''''`` t.wait();
@@ -201,20 +202,20 @@
 
 
 
-Next, instead of doing a blocking wait as in tutorial Timer.1, we call the boost::asio::deadline\_timer::async\_wait() function to perform an asynchronous wait. When calling this function we pass the `print` callback handler that was defined above.
+Next, instead of doing a blocking wait as in tutorial Timer.1, we call the [link boost_asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] function to perform an asynchronous wait. When calling this function we pass the `print` callback handler that was defined above.
 
 
   ``''''''`` t.async_wait(print);
 
 
 
-Finally, we must call the boost::asio::io\_service::run() member function on the io\_service object.
+Finally, we must call the [link boost_asio.reference.io_service.run io_service::run()] member function on the io\_service object.
 
-The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling boost::asio::io\_service::run(). Therefore unless the boost::asio::io\_service::run() function is called the callback for the asynchronous wait completion will never be invoked.
+The asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link boost_asio.reference.io_service.run io_service::run()]. Therefore unless the [link boost_asio.reference.io_service.run io_service::run()] function is called the callback for the asynchronous wait completion will never be invoked.
 
-The boost::asio::io\_service::run() function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.
+The [link boost_asio.reference.io_service.run io_service::run()] function will also continue to run while there is still "work" to do. In this example, the work is the asynchronous wait on the timer, so the call will not return until the timer has expired and the callback has completed.
 
-It is important to remember to give the io\_service some work to do before calling boost::asio::io\_service::run(). For example, if we had omitted the above call to boost::asio::deadline\_timer::async\_wait(), the io\_service would not have had any work to do, and consequently boost::asio::io\_service::run() would have returned immediately.
+It is important to remember to give the io\_service some work to do before calling [link boost_asio.reference.io_service.run io_service::run()]. For example, if we had omitted the above call to [link boost_asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()], the io\_service would not have had any work to do, and consequently [link boost_asio.reference.io_service.run io_service::run()] would have returned immediately.
 
 
   ``''''''`` io.run();
@@ -306,7 +307,7 @@
 
 
 
-As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io\_service to stop. Recall that in tutorial Timer.2 we learnt that the boost::asio::io\_service::run() function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when `count` reaches 5, the io\_service will run out of work and stop running.
+As mentioned above, this tutorial program uses a counter to stop running when the timer fires for the sixth time. However you will observe that there is no explicit call to ask the io\_service to stop. Recall that in tutorial Timer.2 we learnt that the [link boost_asio.reference.io_service.run io_service::run()] function completes when there is no more "work" to do. By not starting a new asynchronous wait on the timer when `count` reaches 5, the io\_service will run out of work and stop running.
 
 
   ``''''''`` if (*count < 5)
@@ -324,7 +325,7 @@
 
 
 
-Then we start a new asynchronous wait on the timer. As you can see, the boost::bind() function is used to associate the extra parameters with your callback handler. The boost::asio::deadline\_timer::async\_wait() function expects a handler function (or function object) with the signature `void(const boost::system::error_code&)`. Binding the additional parameters converts your `print` function into a function object that matches the signature correctly.
+Then we start a new asynchronous wait on the timer. As you can see, the boost::bind() function is used to associate the extra parameters with your callback handler. The [link boost_asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] function expects a handler function (or function object) with the signature `void(const boost::system::error_code&)`. Binding the additional parameters converts your `print` function into a function object that matches the signature correctly.
 
 See the [@http://www.boost.org/libs/bind/bind.html Boost.Bind documentation] for more information on how to use boost::bind().
 
@@ -351,7 +352,7 @@
 
 
 
-As in Step 4, when making the call to boost::asio::deadline\_timer::async\_wait() from `main` we bind the additional parameters needed for the `print` function.
+As in Step 4, when making the call to [link boost_asio.reference.basic_deadline_timer.async_wait deadline_timer::async_wait()] from `main` we bind the additional parameters needed for the `print` function.
 
 
   ``''''''`` t.async_wait(boost::bind(print,
@@ -612,7 +613,7 @@
 
 This tutorial demonstrates the use of the boost::asio::strand class to synchronise callback handlers in a multithreaded program.
 
-The previous four tutorials avoided the issue of handler synchronisation by calling the boost::asio::io\_service::run() function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling boost::asio::io\_service::run(). Consequently, calling boost::asio::io\_service::run() from only one thread ensures that callback handlers cannot run concurrently.
+The previous four tutorials avoided the issue of handler synchronisation by calling the [link boost_asio.reference.io_service.run io_service::run()] function from one thread only. As you already know, the asio library provides a guarantee that callback handlers will only be called from threads that are currently calling [link boost_asio.reference.io_service.run io_service::run()]. Consequently, calling [link boost_asio.reference.io_service.run io_service::run()] from only one thread ensures that callback handlers cannot run concurrently.
 
 The single threaded approach is usually the best place to start when developing applications using asio. The downside is the limitations it places on programs, particularly servers, including:
 
@@ -624,7 +625,7 @@
 
 
 
-If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling boost::asio::io\_service::run(). However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.
+If you find yourself running into these limitations, an alternative approach is to have a pool of threads calling [link boost_asio.reference.io_service.run io_service::run()]. However, as this allows handlers to execute concurrently, we need a method of synchronisation when handlers might be accessing a shared, thread-unsafe resource.
 
 
 
@@ -651,7 +652,7 @@
 
 In addition to initialising a pair of boost::asio::deadline\_timer members, the constructor initialises the `strand_` member, an object of type boost::asio::strand.
 
-An boost::asio::strand guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling boost::asio::io\_service::run(). Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an boost::asio::strand, or were dispatched through a different boost::asio::strand object.
+An boost::asio::strand guarantees that, for those handlers that are dispatched through it, an executing handler will be allowed to complete before the next one is started. This is guaranteed irrespective of the number of threads that are calling [link boost_asio.reference.io_service.run io_service::run()]. Of course, the handlers may still execute concurrently with other handlers that were not dispatched through an boost::asio::strand, or were dispatched through a different boost::asio::strand object.
 
 
   ``''''''`` printer(boost::asio::io_service& io)
@@ -663,7 +664,7 @@
 
 
 
-When initiating the asynchronous operations, each callback handler is "wrapped" using the boost::asio::strand object. The boost::asio::strand::wrap() function returns a new handler that automatically dispatches its contained handler through the boost::asio::strand object. By wrapping the handlers using the same boost::asio::strand, we are ensuring that they cannot execute concurrently.
+When initiating the asynchronous operations, each callback handler is "wrapped" using the boost::asio::strand object. The [link boost_asio.reference.io_service__strand.wrap strand::wrap()] function returns a new handler that automatically dispatches its contained handler through the boost::asio::strand object. By wrapping the handlers using the same boost::asio::strand, we are ensuring that they cannot execute concurrently.
 
 
   ``''''''`` timer1_.async_wait(strand_.wrap(boost::bind(&printer::print1, this)));
@@ -714,9 +715,9 @@
 
 
 
-The `main` function now causes boost::asio::io\_service::run() to be called from two threads: the main thread and one additional thread. This is accomplished using an boost::thread object.
+The `main` function now causes [link boost_asio.reference.io_service.run io_service::run()] to be called from two threads: the main thread and one additional thread. This is accomplished using an boost::thread object.
 
-Just as it would with a call from a single thread, concurrent calls to boost::asio::io\_service::run() will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.
+Just as it would with a call from a single thread, concurrent calls to [link boost_asio.reference.io_service.run io_service::run()] will continue to execute while there is "work" left to do. The background thread will not exit until all asynchronous operations have completed.
 
 
 
@@ -863,7 +864,8 @@
 
 
 
-All programs that use asio need to have at least one boost::asio::io\_service object.
+All programs that use asio need to have at least one
+[link boost_asio.reference.io_service io_service] object.
 
 
 
@@ -871,7 +873,7 @@
 
 
 
-We need to turn the server name that was specified as a parameter to the application, into a TCP endpoint. To do this we use an boost::asio::ip::tcp::resolver object.
+We need to turn the server name that was specified as a parameter to the application, into a TCP endpoint. To do this we use an [link boost_asio.reference.ip__tcp.resolver ip::tcp::resolver] object.
 
 
 
@@ -886,7 +888,7 @@
 
 
 
-The list of endpoints is returned using an iterator of type boost::asio::ip::tcp::resolver::iterator. A default constructed boost::asio::ip::tcp::resolver::iterator object is used as the end iterator.
+The list of endpoints is returned using an iterator of type [link boost_asio.reference.ip__basic_resolver.iterator ip::tcp::resolver::iterator]. A default constructed [link boost_asio.reference.ip__basic_resolver.iterator ip::tcp::resolver::iterator] object is used as the end iterator.
 
 
   ``''''''`` tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
@@ -925,7 +927,7 @@
 
 
 
-When the server closes the connection, the boost::asio::ip::tcp::socket::read\_some() function will exit with the boost::asio::error::eof error, which is how we know to exit the loop.
+When the server closes the connection, the [link boost_asio.reference.basic_stream_socket.read_some ip::tcp::socket::read_some()] function will exit with the boost::asio::error::eof error, which is how we know to exit the loop.
 
 
 
@@ -1070,7 +1072,7 @@
 
 
 
-A boost::asio::ip::tcp::acceptor object needs to be created to listen for new connections. It is initialised to listen on TCP port 13, for IP version 4.
+A [link boost_asio.reference.ip__tcp.acceptor ip::tcp::acceptor] object needs to be created to listen for new connections. It is initialised to listen on TCP port 13, for IP version 4.
 
 
 
@@ -1199,7 +1201,8 @@
 
 
 
-We need to create a server object to accept incoming client connections. The boost::asio::io\_service object provides I/O services, such as sockets, that the server object will use.
+We need to create a server object to accept incoming client connections. The
+[link boost_asio.reference.io_service io_service] object provides I/O services, such as sockets, that the server object will use.
 
 
   ``''''''`` boost::asio::io_service io_service;
@@ -1207,7 +1210,8 @@
 
 
 
-Run the boost::asio::io\_service object so that it will perform asynchronous operations on your behalf.
+Run the
+[link boost_asio.reference.io_service io_service] object so that it will perform asynchronous operations on your behalf.
 
 
   ``''''''`` io_service.run();
@@ -1298,7 +1302,7 @@
 
 
 
-In the function `start()`, we call boost::asio::async\_write() to serve the data to the client. Note that we are using boost::asio::async\_write(), rather than boost::asio::ip::tcp::socket::async\_write\_some(), to ensure that the entire block of data is sent.
+In the function `start()`, we call boost::asio::async\_write() to serve the data to the client. Note that we are using boost::asio::async\_write(), rather than [link boost_asio.reference.basic_stream_socket.async_write_some ip::tcp::socket::async_write_some()], to ensure that the entire block of data is sent.
 
 
 
@@ -1533,7 +1537,7 @@
 
 
 
-We use an boost::asio::ip::udp::resolver object to find the correct remote endpoint to use based on the host and service names. The query is restricted to return only IPv4 endpoints by the boost::asio::ip::udp::v4() argument.
+We use an [link boost_asio.reference.ip__udp.resolver ip::udp::resolver] object to find the correct remote endpoint to use based on the host and service names. The query is restricted to return only IPv4 endpoints by the [link boost_asio.reference.ip__udp.v4 ip::udp::v4()] argument.
 
 
 
@@ -1542,14 +1546,14 @@
 
 
 
-The boost::asio::ip::udp::resolver::resolve() function is guaranteed to return at least one endpoint in the list if it does not fail. This means it is safe to dereference the return value directly.
+The [link boost_asio.reference.ip__basic_resolver.resolve ip::udp::resolver::resolve()] function is guaranteed to return at least one endpoint in the list if it does not fail. This means it is safe to dereference the return value directly.
 
 
   ``''''''`` udp::endpoint receiver_endpoint = *resolver.resolve(query);
 
 
 
-Since UDP is datagram-oriented, we will not be using a stream socket. Create an boost::asio::ip::udp::socket and initiate contact with the remote endpoint.
+Since UDP is datagram-oriented, we will not be using a stream socket. Create an [link boost_asio.reference.ip__udp.socket ip::udp::socket] and initiate contact with the remote endpoint.
 
 
 
@@ -1561,7 +1565,7 @@
 
 
 
-Now we need to be ready to accept whatever the server sends back to us. The endpoint on our side that receives the server's response will be initialised by boost::asio::ip::udp::socket::receive\_from().
+Now we need to be ready to accept whatever the server sends back to us. The endpoint on our side that receives the server's response will be initialised by [link boost_asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()].
 
 
 
@@ -1671,7 +1675,7 @@
 
 
 
-Create an boost::asio::ip::udp::socket object to receive requests on UDP port 13.
+Create an [link boost_asio.reference.ip__udp.socket ip::udp::socket] object to receive requests on UDP port 13.
 
 
 
@@ -1679,7 +1683,7 @@
 
 
 
-Wait for a client to initiate contact with us. The remote\_endpoint object will be populated by boost::asio::ip::udp::socket::receive\_from().
+Wait for a client to initiate contact with us. The remote\_endpoint object will be populated by [link boost_asio.reference.basic_datagram_socket.receive_from ip::udp::socket::receive_from()].
 
 
 
@@ -1819,7 +1823,8 @@
 
 
 
-Create a server object to accept incoming client requests, and run the boost::asio::io\_service object.
+Create a server object to accept incoming client requests, and run the
+[link boost_asio.reference.io_service io_service] object.
 
 
   ``''''''`` boost::asio::io_service io_service;
@@ -1860,7 +1865,8 @@
 
 
 
-The function boost::asio::ip::udp::socket::async\_receive\_from() will cause the application to listen in the background for a new request. When such a request is received, the boost::asio::io\_service object will invoke the `handle_receive()` function with two arguments: a value of type boost::system::error\_code indicating whether the operation succeeded or failed, and a `size_t` value `bytes_transferred` specifying the number of bytes received.
+The function [link boost_asio.reference.basic_datagram_socket.async_receive_from ip::udp::socket::async_receive_from()] will cause the application to listen in the background for a new request. When such a request is received, the
+[link boost_asio.reference.io_service io_service] object will invoke the `handle_receive()` function with two arguments: a value of type boost::system::error\_code indicating whether the operation succeeded or failed, and a `size_t` value `bytes_transferred` specifying the number of bytes received.
 
 
   ``''''''`` socket_.async_receive_from(
@@ -1882,7 +1888,8 @@
 
 
 
-The `error` parameter contains the result of the asynchronous operation. Since we only provide the 1-byte `recv_buffer_` to contain the client's request, the boost::asio::io\_service object would return an error if the client sent anything larger. We can ignore such an error if it comes up.
+The `error` parameter contains the result of the asynchronous operation. Since we only provide the 1-byte `recv_buffer_` to contain the client's request, the
+[link boost_asio.reference.io_service io_service] object would return an error if the client sent anything larger. We can ignore such an error if it comes up.
 
 
   ``''''''`` if (!error || error == boost::asio::error::message_size)
@@ -1898,7 +1905,7 @@
 
 
 
-We now call boost::asio::ip::udp::socket::async\_send\_to() to serve the data to the client.
+We now call [link boost_asio.reference.basic_datagram_socket.async_send_to ip::udp::socket::async_send_to()] to serve the data to the client.
 
 
 
@@ -2082,7 +2089,8 @@
 
 
 
-We have created two lots of work for the boost::asio::io\_service object to do.
+We have created two lots of work for the
+[link boost_asio.reference.io_service io_service] object to do.
 
 
   ``''''''`` io_service.run();

Modified: trunk/libs/asio/doc/tutorial.xsl
==============================================================================
--- trunk/libs/asio/doc/tutorial.xsl (original)
+++ trunk/libs/asio/doc/tutorial.xsl 2008-07-10 19:05:26 EDT (Thu, 10 Jul 2008)
@@ -70,6 +70,115 @@
 </xsl:template>
 
 
+<!--========== Utilities ==========-->
+
+<xsl:template name="strip-asio-ns">
+ <xsl:param name="name"/>
+ <xsl:choose>
+ <xsl:when test="contains($name, 'boost::system::is_error_code_enum')">
+ <xsl:value-of select="$name"/>
+ </xsl:when>
+ <xsl:when test="contains($name, 'asio::')">
+ <xsl:value-of select="substring-after($name, 'asio::')"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="make-id">
+ <xsl:param name="name"/>
+ <xsl:choose>
+ <xsl:when test="contains($name, '::')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '::'), '__', substring-after($name, '::'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '=')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '='), '_eq_', substring-after($name, '='))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '!')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '!'), '_not_', substring-after($name, '!'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '&lt;')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '&lt;'), '_lt_', substring-after($name, '&lt;'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '&gt;')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '&gt;'), '_gt_', substring-after($name, '&gt;'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '+')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '+'), '_plus_', substring-after($name, '+'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, '~')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, '~'), '_', substring-after($name, '~'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, ' ')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, ' '), '_', substring-after($name, ' '))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:when test="contains($name, 'boost__posix_time__ptime')">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name"
+ select="concat(substring-before($name, 'boost__posix_time__ptime'), 'ptime', substring-after($name, 'boost__posix_time__ptime'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$name"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="replace-scope-marker">
+ <xsl:param name="text"/>
+ <xsl:choose>
+ <xsl:when test="contains($text, '_1_1')">
+ <xsl:call-template name="replace-scope-marker">
+ <xsl:with-param name="text"
+ select="concat(substring-before($text, '_1_1'), '::', substring-after($text, '_1_1'))"/>
+ </xsl:call-template>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:value-of select="$text"/>
+ </xsl:otherwise>
+ </xsl:choose>
+</xsl:template>
+
+
+<xsl:template name="refid-to-anchor">
+ <xsl:param name="text"/>
+ <xsl:variable name="scoped-text">
+ <xsl:call-template name="replace-scope-marker">
+ <xsl:with-param name="text" select="$text"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:value-of select="substring-after($scoped-text, '_1')"/>
+</xsl:template>
+
+
 <!--========== Markup ==========-->
 
 <xsl:template match="para">
@@ -217,6 +326,9 @@
 
 
 <xsl:template match="ref[@kindref='compound']">
+ <xsl:variable name="name">
+ <xsl:value-of select="."/>
+ </xsl:variable>
   <xsl:variable name="refid">
     <xsl:value-of select="@refid"/>
   </xsl:variable>
@@ -235,6 +347,19 @@
       <xsl:value-of select="concat(' ', .)"/>
       <xsl:text>]</xsl:text>
     </xsl:when>
+ <xsl:when test="contains($name, 'asio::')">
+ <xsl:variable name="ref-name">
+ <xsl:call-template name="strip-asio-ns">
+ <xsl:with-param name="name" select="$name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="ref-id">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name" select="$ref-name"/>
+ </xsl:call-template>
+ </xsl:variable>
+[link boost_asio.reference.<xsl:value-of select="$ref-id"/><xsl:text> </xsl:text><xsl:value-of
+ select="$ref-name"/>]</xsl:when>
     <xsl:otherwise>
       <xsl:apply-templates/>
     </xsl:otherwise>
@@ -246,12 +371,53 @@
   <xsl:variable name="refid">
     <xsl:value-of select="@refid"/>
   </xsl:variable>
+ <xsl:variable name="text">
+ <xsl:call-template name="strip-asio-ns">
+ <xsl:with-param name="name" select="."/>
+ </xsl:call-template>
+ </xsl:variable>
   <xsl:choose>
     <xsl:when test="$refid='index_1index'">
       <xsl:text>[link boost_asio.tutorial </xsl:text>
- <xsl:value-of select="."/>
+ <xsl:value-of select="$text"/>
       <xsl:text>]</xsl:text>
     </xsl:when>
+ <xsl:when test="@external='reference.tags'">
+ <xsl:variable name="anchor">
+ <xsl:call-template name="refid-to-anchor">
+ <xsl:with-param name="text" select="$refid"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:choose>
+ <xsl:when test="count(document('reference.tags')/tagfile/compound[@kind='class']/member[anchor=$anchor]) &gt; 0">
+ <xsl:for-each select="document('reference.tags')/tagfile/compound[@kind='class']/member[anchor=$anchor]">
+ <xsl:variable name="scope">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name">
+ <xsl:call-template name="strip-asio-ns">
+ <xsl:with-param name="name" select="../name"/>
+ </xsl:call-template>
+ </xsl:with-param>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:variable name="name">
+ <xsl:call-template name="make-id">
+ <xsl:with-param name="name" select="name"/>
+ </xsl:call-template>
+ </xsl:variable>
+ <xsl:text>[link boost_asio.reference.</xsl:text>
+ <xsl:if test="string-length($scope) &gt; 0">
+ <xsl:value-of select="$scope"/><xsl:text>.</xsl:text>
+ </xsl:if>
+ <xsl:value-of select="$name"/>
+ <xsl:text> </xsl:text><xsl:value-of select="$text"/><xsl:text>]</xsl:text>
+ </xsl:for-each>
+ </xsl:when>
+ <xsl:otherwise>
+ <xsl:apply-templates/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
     <xsl:otherwise>
       <xsl:apply-templates/>
     </xsl:otherwise>


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk