Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r60621 - in branches/release/libs/config: . doc doc/html doc/html/boost_config test
From: john_at_[hidden]
Date: 2010-03-15 13:53:54


Author: johnmaddock
Date: 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
New Revision: 60621
URL: http://svn.boost.org/trac/boost/changeset/60621

Log:
Merge doc updates from Trunk.
Properties modified:
   branches/release/libs/config/ (props changed)
Text files modified:
   branches/release/libs/config/doc/config.qbk | 2
   branches/release/libs/config/doc/guidelines.qbk | 18 ++++++++-----
   branches/release/libs/config/doc/html/boost_config/acknowledgements.html | 4 +-
   branches/release/libs/config/doc/html/boost_config/boost_macro_reference.html | 53 +++++++++++++++++++++++++++++++++++++--
   branches/release/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html | 30 ++++++++++++----------
   branches/release/libs/config/doc/html/boost_config/rationale.html | 4 +-
   branches/release/libs/config/doc/html/index.html | 10 +++---
   branches/release/libs/config/doc/macro_reference.qbk | 30 +++++++++++++++++++++
   branches/release/libs/config/test/boost_no_integral_int64_t.ipp | 4 --
   9 files changed, 117 insertions(+), 38 deletions(-)

Modified: branches/release/libs/config/doc/config.qbk
==============================================================================
--- branches/release/libs/config/doc/config.qbk (original)
+++ branches/release/libs/config/doc/config.qbk 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -29,7 +29,7 @@
 [/ Other web resources ]
 
 [def __STL_PORT__ [@http://stlport.sourceforge.net STLport]]
-[def __BOOST_TRACKER__ [@http://sourceforge.net/tracker/?group_id=7586 Tracker]]
+[def __BOOST_TRACKER__ [@https://svn.boost.org/trac/boost/newticket Trac]]
 [def __CORE_LANGUAGE_DR337__ [@http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#337 Core Language DR337]]
 [def __PRINCIPLES_AND_PATTERNS_ARTICLE__ [@http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf following article]]
 

Modified: branches/release/libs/config/doc/guidelines.qbk
==============================================================================
--- branches/release/libs/config/doc/guidelines.qbk (original)
+++ branches/release/libs/config/doc/guidelines.qbk 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -112,8 +112,8 @@
 "`int test()`" that is declared in a namespace with the same name as the macro,
 but in all lower case, and which returns zero on success:
 
- namespace boost_no_foo {
 
+ namespace boost_no_foo {
     int test()
     {
         // test code goes here:
@@ -126,14 +126,18 @@
 Once the test code is in place in libs/config/test, updating the configuration
 test system proceeds as:
 
-* cd into `libs/config/tools` and run `bjam` : this generates the `.cpp`
+* cd into `libs/config/tools` and run `bjam`. This generates the `.cpp`
 file test cases from the `.ipp` file, updates the
-libs/config/test/all/Jamfile.v2, `config_test.cpp` and `config_info.cpp`.
-* cd into `libs/config/test/all` and run `bjam `['MACRONAME` compiler-list`] : where
+libs/config/test/all/Jamfile.v2, `config_test.cpp` and `config_info.cpp`.[br][br]
+
+* cd into `libs/config/test/all` and run `bjam `['MACRONAME` compiler-list`], where
 ['MACRONAME] is the name of the new macro, and ['`compiler-list`] is a space separated list of
-compilers to test with. You should see the tests pass with those compilers
-that don't have the defect, and fail with those that do.
-* cd into `libs/config/test` and run `bjam config_info config_test `['`compiler-list`] :
+compilers to test with.[br][br]
+The xxx_pass_test and the xxx_fail_test [*should both report `**passed**`].[br][br]
+If ['MACRONAME] is not defined when it should be defined, xxx_pass_test will not report `**passed**`.
+If ['MACRONAME] is defined when it should not be defined, xxx_fail_test will not report `**passed**`.[br][br]
+
+* cd into `libs/config/test` and run `bjam config_info config_test `['`compiler-list`].
 `config_info` should build and run cleanly for all the compilers in ['`compiler-list`]
 while `config_test` should fail for those that have the defect, and pass for those
 that do not.

Modified: branches/release/libs/config/doc/html/boost_config/acknowledgements.html
==============================================================================
--- branches/release/libs/config/doc/html/boost_config/acknowledgements.html (original)
+++ branches/release/libs/config/doc/html/boost_config/acknowledgements.html 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 <title>Acknowledgements</title>
 <link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
@@ -47,7 +47,7 @@
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
 <td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright © 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
         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)
       </p>

Modified: branches/release/libs/config/doc/html/boost_config/boost_macro_reference.html
==============================================================================
--- branches/release/libs/config/doc/html/boost_config/boost_macro_reference.html (original)
+++ branches/release/libs/config/doc/html/boost_config/boost_macro_reference.html 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 <title>Boost Macro Reference</title>
 <link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
@@ -2851,6 +2851,53 @@
 <tr>
 <td>
               <p>
+ <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span></code>
+ </p>
+ </td>
+<td>
+ <p>
+ This macro is used where a compiler specific workaround is required
+ that is not otherwise described by one of the other Boost.Config
+ macros. To use the macro you must first
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">detail</span><span class="special">/</span><span class="identifier">workaround</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
+</pre>
+<p>
+ usage is then:
+</p>
+<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#if</span> <span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">MACRONAME</span><span class="special">,</span> <span class="identifier">CONDITION</span><span class="special">)</span>
+ <span class="comment">// workaround code goes here...
+</span><span class="preprocessor">#else</span>
+ <span class="comment">// Standard conforming code goes here...
+</span><span class="preprocessor">#endif</span>
+</pre>
+<p>
+ where <code class="computeroutput"><span class="identifier">MACRONAME</span></code> is
+ a macro that usually describes the version number to be tested against,
+ and <code class="computeroutput"><span class="identifier">CONDITION</span></code> is
+ a comparison operator followed by a value. For example <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">BOOST_INTEL</span><span class="special">,</span>
+ <span class="special">&lt;=</span> <span class="number">1010</span><span class="special">)</span></code> would evaluate to <code class="computeroutput"><span class="number">1</span></code> for Intel C++ 10.1 and earlier.
+ </p>
+ <p>
+ The macro can also be used with <code class="computeroutput"><span class="identifier">BOOST_TESTED_AT</span></code>
+ if all current compiler versions exhibit the issue, but the issue
+ is expected to be fixed at some later point.
+ </p>
+ <p>
+ For example <code class="computeroutput"><span class="identifier">BOOST_WORKAROUND</span><span class="special">(</span><span class="identifier">__BORLANDC__</span><span class="special">,</span> <span class="identifier">BOOST_TESTED_AT</span><span class="special">(</span><span class="number">0x590</span><span class="special">))</span></code> would normally evaluate to <code class="computeroutput"><span class="number">1</span></code> for all values of <code class="computeroutput"><span class="identifier">__BORLANDC__</span></code>
+ <span class="emphasis"><em>unless</em></span> the macro <code class="computeroutput"><span class="identifier">BOOST_DETECT_OUTDATED_WORKAROUNDS</span></code>
+ is defined, in which case evaluates to <code class="computeroutput"><span class="special">(</span><span class="identifier">__BORLANDC__</span> <span class="special">&lt;=</span>
+ <span class="number">0x590</span><span class="special">)</span></code>.
+ </p>
+ <p>
+ <span class="bold"><strong>Note</strong></span>: the ultimate source of documentation
+ for this macro is in boost/detail/workaround.hpp.
+ </p>
+ </td>
+</tr>
+<tr>
+<td>
+ <p>
                 <code class="computeroutput"><span class="identifier">BOOST_DEDUCED_TYPENAME</span></code>
               </p>
               </td>
@@ -3160,7 +3207,7 @@
               </td>
 <td>
               <p>
- Describes the boost version number in XXYYZZ format such that: <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_VERSION</span>
+ Describes the boost version number in XYYYZZ format such that: <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_VERSION</span>
                 <span class="special">%</span> <span class="number">100</span><span class="special">)</span></code> is the sub-minor version, <code class="computeroutput"><span class="special">((</span><span class="identifier">BOOST_VERSION</span>
                 <span class="special">/</span> <span class="number">100</span><span class="special">)</span> <span class="special">%</span> <span class="number">1000</span><span class="special">)</span></code>
                 is the minor version, and <code class="computeroutput"><span class="special">(</span><span class="identifier">BOOST_VERSION</span> <span class="special">/</span>
@@ -3534,7 +3581,7 @@
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
 <td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright © 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
         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)
       </p>

Modified: branches/release/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html
==============================================================================
--- branches/release/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html (original)
+++ branches/release/libs/config/doc/html/boost_config/guidelines_for_boost_authors.html 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 <title>Guidelines for Boost Authors</title>
 <link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
@@ -220,7 +220,6 @@
         on success:
       </p>
 <pre class="programlisting"><span class="keyword">namespace</span> <span class="identifier">boost_no_foo</span> <span class="special">{</span>
-
 <span class="keyword">int</span> <span class="identifier">test</span><span class="special">()</span>
 <span class="special">{</span>
     <span class="comment">// test code goes here:
@@ -236,24 +235,27 @@
       </p>
 <div class="itemizedlist"><ul type="disc">
 <li>
- cd into <code class="computeroutput"><span class="identifier">libs</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">tools</span></code> and run <code class="computeroutput"><span class="identifier">bjam</span></code>
- : this generates the <code class="computeroutput"><span class="special">.</span><span class="identifier">cpp</span></code>
+ cd into <code class="computeroutput"><span class="identifier">libs</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">tools</span></code> and run <code class="computeroutput"><span class="identifier">bjam</span></code>.
+ This generates the <code class="computeroutput"><span class="special">.</span><span class="identifier">cpp</span></code>
           file test cases from the <code class="computeroutput"><span class="special">.</span><span class="identifier">ipp</span></code> file, updates the libs/config/test/all/Jamfile.v2,
- <code class="computeroutput"><span class="identifier">config_test</span><span class="special">.</span><span class="identifier">cpp</span></code> and <code class="computeroutput"><span class="identifier">config_info</span><span class="special">.</span><span class="identifier">cpp</span></code>.
- </li>
+ <code class="computeroutput"><span class="identifier">config_test</span><span class="special">.</span><span class="identifier">cpp</span></code> and <code class="computeroutput"><span class="identifier">config_info</span><span class="special">.</span><span class="identifier">cpp</span></code>.<br><br>
+</li>
 <li>
           cd into <code class="computeroutput"><span class="identifier">libs</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">all</span></code> and run <code class="computeroutput"><span class="identifier">bjam</span>
- </code><span class="emphasis"><em>MACRONAME<code class="computeroutput"> <span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span>
- : where <span class="emphasis"><em>MACRONAME</em></span> is the name of the new macro, and
+ </code><span class="emphasis"><em>MACRONAME<code class="computeroutput"> <span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span>,
+ where <span class="emphasis"><em>MACRONAME</em></span> is the name of the new macro, and
           <span class="emphasis"><em><code class="computeroutput"><span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span> is a space separated
- list of compilers to test with. You should see the tests pass with those
- compilers that don't have the defect, and fail with those that do.
- </li>
+ list of compilers to test with.<br><br> The xxx_pass_test and the
+ xxx_fail_test <span class="bold"><strong>should both report <code class="computeroutput"><span class="special">**</span><span class="identifier">passed</span><span class="special">**</span></code></strong></span>.<br><br> If <span class="emphasis"><em>MACRONAME</em></span> is not defined when it should
+ be defined, xxx_pass_test will not report <code class="computeroutput"><span class="special">**</span><span class="identifier">passed</span><span class="special">**</span></code>.
+ If <span class="emphasis"><em>MACRONAME</em></span> is defined when it should not be defined,
+ xxx_fail_test will not report <code class="computeroutput"><span class="special">**</span><span class="identifier">passed</span><span class="special">**</span></code>.<br><br>
+</li>
 <li>
           cd into <code class="computeroutput"><span class="identifier">libs</span><span class="special">/</span><span class="identifier">config</span><span class="special">/</span><span class="identifier">test</span></code> and run <code class="computeroutput"><span class="identifier">bjam</span>
           <span class="identifier">config_info</span> <span class="identifier">config_test</span>
- </code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span>
- : <code class="computeroutput"><span class="identifier">config_info</span></code> should build
+ </code><span class="emphasis"><em><code class="computeroutput"><span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span>.
+ <code class="computeroutput"><span class="identifier">config_info</span></code> should build
           and run cleanly for all the compilers in <span class="emphasis"><em><code class="computeroutput"><span class="identifier">compiler</span><span class="special">-</span><span class="identifier">list</span></code></em></span>
           while <code class="computeroutput"><span class="identifier">config_test</span></code> should
           fail for those that have the defect, and pass for those that do not.
@@ -358,7 +360,7 @@
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
 <td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright © 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
         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)
       </p>

Modified: branches/release/libs/config/doc/html/boost_config/rationale.html
==============================================================================
--- branches/release/libs/config/doc/html/boost_config/rationale.html (original)
+++ branches/release/libs/config/doc/html/boost_config/rationale.html 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 <title>Rationale</title>
 <link rel="stylesheet" href="../../../../../doc/html/boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
@@ -121,7 +121,7 @@
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
 <td align="left"></td>
-<td align="right"><div class="copyright-footer">Copyright © 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
+<td align="right"><div class="copyright-footer">Copyright &#169; 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock<p>
         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)
       </p>

Modified: branches/release/libs/config/doc/html/index.html
==============================================================================
--- branches/release/libs/config/doc/html/index.html (original)
+++ branches/release/libs/config/doc/html/index.html 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -1,6 +1,6 @@
 <html>
 <head>
-<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
 <title>Boost.Config</title>
 <link rel="stylesheet" href="../../../../doc/html/boostbook.css" type="text/css">
 <meta name="generator" content="DocBook XSL Stylesheets V1.74.0">
@@ -26,9 +26,9 @@
 <div><div class="authorgroup"><div class="author"><h3 class="author">
 <span class="firstname">Vesa Karvonen, John Maddock</span> <span class="surname">Beman Dawes</span>
 </h3></div></div></div>
-<div><p class="copyright">Copyright © 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock</p></div>
+<div><p class="copyright">Copyright &#169; 2001 -2007 Beman Dawes, Vesa Karvonen, John Maddock</p></div>
 <div><div class="legalnotice">
-<a name="id770460"></a><p>
+<a name="id793416"></a><p>
         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)
       </p>
@@ -131,7 +131,7 @@
       </p>
 <p>
         Boost library users can request support for additional compilers or platforms
- by visiting our Tracker
+ by visiting our Trac
         and submitting a support request.
       </p>
 </div>
@@ -960,7 +960,7 @@
 </div>
 </div>
 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
-<td align="left"><p><small>Last revised: August 06, 2009 at 09:16:56 GMT</small></p></td>
+<td align="left"><p><small>Last revised: March 02, 2010 at 17:08:14 GMT</small></p></td>
 <td align="right"><div class="copyright-footer"></div></td>
 </tr></table>
 <hr>

Modified: branches/release/libs/config/doc/macro_reference.qbk
==============================================================================
--- branches/release/libs/config/doc/macro_reference.qbk (original)
+++ branches/release/libs/config/doc/macro_reference.qbk 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -633,6 +633,34 @@
 [table
 [[Macro ][Description ]]
 
+[[`BOOST_WORKAROUND`][
+This macro is used where a compiler specific workaround is required that is not otherwise
+described by one of the other Boost.Config macros. To use the macro you must first
+``
+#include <boost/detail/workaround.hpp>
+``
+usage is then:
+``
+#if BOOST_WORKAROUND(MACRONAME, CONDITION)
+ // workaround code goes here...
+#else
+ // Standard conforming code goes here...
+#endif
+``
+where `MACRONAME` is a macro that usually describes the version number to be tested against, and `CONDITION`
+is a comparison operator followed by a value. For example `BOOST_WORKAROUND(BOOST_INTEL, <= 1010)` would
+evaluate to `1` for Intel C++ 10.1 and earlier.
+
+The macro can also be used with `BOOST_TESTED_AT` if all
+current compiler versions exhibit the issue, but the issue is expected to be fixed at some later point.
+
+For example
+`BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x590))` would normally evaluate to `1` for all values
+of `__BORLANDC__` /unless/ the macro `BOOST_DETECT_OUTDATED_WORKAROUNDS` is defined, in which case evaluates to
+`(__BORLANDC__ <= 0x590)`.
+
+[*Note]: the ultimate source of documentation for this macro is in [@../../../../boost/detail/workaround.hpp boost/detail/workaround.hpp].
+]]
 [[`BOOST_DEDUCED_TYPENAME`][
 Some compilers don't support the use of typename for dependent types in deduced
 contexts. This macro expands to nothing on those compilers, and typename
@@ -778,7 +806,7 @@
 [[Macro ][Header ][Description ]]
 
 [[`BOOST_VERSION`][`<boost/version.hpp>`][
-Describes the boost version number in XXYYZZ format such that:
+Describes the boost version number in XYYYZZ format such that:
 `(BOOST_VERSION % 100)` is the sub-minor version, `((BOOST_VERSION / 100) % 1000)`
 is the minor version, and `(BOOST_VERSION / 100000)` is the major version.
 ]]

Modified: branches/release/libs/config/test/boost_no_integral_int64_t.ipp
==============================================================================
--- branches/release/libs/config/test/boost_no_integral_int64_t.ipp (original)
+++ branches/release/libs/config/test/boost_no_integral_int64_t.ipp 2010-03-15 13:53:53 EDT (Mon, 15 Mar 2010)
@@ -43,9 +43,7 @@
 
 int test()
 {
- llt<mask> m;
- (void)m;
- return 0;
+ return llt<mask>::value != (1uLL << 50);
 }
 
 }


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