Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r70639 - in sandbox/opaque/boost/opaque: . macros meta_mixin
From: vicente.botet_at_[hidden]
Date: 2011-03-27 13:48:21


Author: viboes
Date: 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
New Revision: 70639
URL: http://svn.boost.org/trac/boost/changeset/70639

Log:
Opaque: macros moved to a specific directory
Added:
   sandbox/opaque/boost/opaque/macros/
   sandbox/opaque/boost/opaque/macros/forward_constructors.hpp (contents, props changed)
   sandbox/opaque/boost/opaque/macros/inherit_from_underlying_spec.hpp (contents, props changed)
   sandbox/opaque/boost/opaque/macros/new_class.hpp (contents, props changed)
   sandbox/opaque/boost/opaque/macros/new_type.hpp (contents, props changed)
   sandbox/opaque/boost/opaque/macros/private_opaque.hpp (contents, props changed)
   sandbox/opaque/boost/opaque/macros/public_opaque.hpp (contents, props changed)
Removed:
   sandbox/opaque/boost/opaque/new_class_macro.hpp
   sandbox/opaque/boost/opaque/new_type_macro.hpp
Text files modified:
   sandbox/opaque/boost/opaque/boolean.hpp | 3
   sandbox/opaque/boost/opaque/macros.hpp | 305 ---------------------------------------
   sandbox/opaque/boost/opaque/meta_mixin/combined_operators.hpp | 13 +
   sandbox/opaque/boost/opaque/meta_mixin/inherited_from_underlying.hpp | 5
   sandbox/opaque/boost/opaque/meta_mixin/linear_hierarchy.hpp | 5
   sandbox/opaque/boost/opaque/meta_mixin/operators.hpp | 12
   sandbox/opaque/boost/opaque/meta_mixin/using_explicit_conversion_to_ut_hierarchy.hpp | 5
   sandbox/opaque/boost/opaque/meta_mixin/using_implicit_conversion_to_ut_hierarchy.hpp | 5
   sandbox/opaque/boost/opaque/new_class.hpp | 3
   sandbox/opaque/boost/opaque/new_type.hpp | 5
   sandbox/opaque/boost/opaque/opaque.hpp | 13 +
   sandbox/opaque/boost/opaque/private_opaque_class.hpp | 7
   sandbox/opaque/boost/opaque/private_opaque_type.hpp | 5
   sandbox/opaque/boost/opaque/public_opaque_class.hpp | 5
   sandbox/opaque/boost/opaque/public_opaque_type.hpp | 5
   15 files changed, 87 insertions(+), 309 deletions(-)

Modified: sandbox/opaque/boost/opaque/boolean.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/boolean.hpp (original)
+++ sandbox/opaque/boost/opaque/boolean.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -11,7 +11,8 @@
 //////////////////////////////////////////////////////////////////////////////
 
 /**
- * @File Defines an opaque boolean class.
+ * @file
+ * Defines an opaque boolean class.
  */
 
 #ifndef BOOST_OPAQUE_BOOLEAN_HPP

Modified: sandbox/opaque/boost/opaque/macros.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/macros.hpp (original)
+++ sandbox/opaque/boost/opaque/macros.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -12,309 +12,18 @@
 
 /**
  * @file
- * Defines helper macros.
+ * Includes all the helper macros files.
  */
 
 #ifndef BOOST_OPAQUE_MACROS_HPP
 #define BOOST_OPAQUE_MACROS_HPP
 
-#include <boost/config.hpp>
-#include <boost/opaque/private_opaque_type.hpp>
-#include <boost/opaque/boolean.hpp>
-#include <boost/opaque/public_opaque_type.hpp>
-#include <boost/opaque/private_opaque_class.hpp>
-#include <boost/opaque/public_opaque_class.hpp>
-
-
-/** forward the constructors from the new class @c OT to the base class @ BASE
-
- @Note This macro can be used only inside the public part of a class.
-
- @Params
- @Param{OT, the class been defined}
- @Param{BASE, the base class}
-
- @Result
- @code
- OT(){}
- template <typename W>
- explicit OT(W w)
- : BASE(w)
- {}
- OT(OT const& r)
- : BASE(r.val_)
- {}
- @endcode
- */
-#define BOOST_OPAQUE_FORWARD_CONSTRUCTORS(OT,BASE) \
- OT(){} \
- template <typename W> \
- explicit OT(W w) \
- : BASE(w) \
- {}\
- OT(OT const& r) \
- : BASE(r.val_) \
- {}
-
-
-/**
- Specialize inherited_from_underlying for the type @ OT just inheriting the ones from its underlying type.
-
- @Note This macro can be used only outside a namespace.
-
- @Params
- @Param{OT, the opaque type}
-
- @Result
- @code
- namespace boost {
- namespace opaque {
- template <typename Bool>
- struct inherited_from_underlying<OT,Bool>
- : inherited_from_underlying<typename OT::underlying_type,Bool> { };
- }
- }
- @endcode
- */
-#define BOOST_OPAQUE_INHERIT_FROM_UNDERLYING(OT) \
-namespace boost {\
-namespace opaque {\
- template <typename Bool>\
- struct inherited_from_underlying<OT,Bool>\
- : inherited_from_underlying<typename OT::underlying_type,Bool> { };\
-} \
-}
-
-#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
-
-#define BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, B) \
- struct BOOST_JOIN(OT, _tag) {};\
- typedef boost::opaque::public_opaque_type<UT, BOOST_JOIN(OT, _tag), B> OT
-
-#endif
-/**
- Declares a @c public_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c boost::opaque::boolean as <em>Boolean</em> type.
-
- @Note This macro must be used inside the @c OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct OT_tag {};
- typedef boost::opaque::public_opaque_type<UT, OT_tag, boost::opaque::boolean> OT
- @endcode
- */
-#define BOOST_OPAQUE_BOOLEAN_PUBLIC_TYPEDEF(UT, OT) \
-BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, boost::opaque::boolean)
-
-/**
- Declares a @c public_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
-
- @Note This macro must be used inside the @c OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct OT_tag {};
- typedef boost::opaque::public_opaque_type<UT, OT_tag, bool> OT
- @endcode
- */
-#define BOOST_OPAQUE_PUBLIC_TYPEDEF(UT, OT) \
-BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, bool)
-
-//////////////////////////
-#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
-
-#define BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, NT1, B) \
- struct NT1 : boost::opaque::public_opaque_class<NT1, UT,B> \
- { \
- BOOST_OPAQUE_FORWARD_CONSTRUCTORS(NT1, (boost::opaque::public_opaque_class<NT1, UT,B>)) \
- }
-
-#endif
-
-/**
- Declares a @c public_opaque_class @c OT having @c boost::opaque::boolean as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct NT1 : boost::opaque::public_opaque_class<NT1, UT,boost::opaque::boolean>
- {
- typedef boost::opaque::public_opaque_class<NT1, UT,boost::opaque::boolean> base_type;
- OT(){}
- template <typename W>
- explicit OT(W w)
- : base_type(w)
- {}
- OT(OT const& r)
- : base_type(r.val_)
- {}
- }
- @endcode
- */
-#define BOOST_OPAQUE_BOOLEAN_PUBLIC_CLASS(UT, OT) \
- BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, OT, boost::opaque::boolean)
-
-
-/**
- Declares a @c public_opaque_class @c OT having @c bool as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct NT1 : boost::opaque::public_opaque_class<NT1, UT, bool>
- {
- typedef boost::opaque::public_opaque_class<NT1, UT,bool> base_type;
- OT(){}
- template <typename W>
- explicit OT(W w)
- : base_type(w)
- {}
- OT(OT const& r)
- : base_type(r.val_)
- {}
- }
- @endcode
- */
-#define BOOST_OPAQUE_PUBLIC_CLASS(UT, OT) \
- BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, OT, bool)
-
-//////////////////////////
-#define BOOST_OPAQUE_PRIVATE_FORWARD_CONSTRUCTORS(UT, OT) \
- BOOST_OPAQUE_FORWARD_CONSTRUCTORS(OT,(boost::opaque::private_opaque_class<OT, UT>))
-
-#define BOOST_OPAQUE_PRIVATE_OPERATIONS(UT, OT) \
- BOOST_OPAQUE_PRIVATE_FORWARD_CONSTRUCTORS(UT, OT)
-
-//////////////////////////
-#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
-
-#define BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT,B) \
- struct BOOST_JOIN(OT, _tag) {};\
- typedef boost::opaque::private_opaque_type<UT, BOOST_JOIN(OT, _tag),B> OT
-
-#endif
-
-/**
- Declares a @c private_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct OT_tag {};
- typedef boost::opaque::private_opaque_type<UT, OT_tag, boost::opaque::boolean> OT
- @endcode
- */
-#define BOOST_OPAQUE_BOOLEAN_PRIVATE_TYPEDEF(UT, OT) \
- BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT, boost::opaque::boolean)
-
-/**
- Declares a @c private_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct OT_tag {};
- typedef boost::opaque::private_opaque_type<UT, OT_tag, bool> OT
- @endcode
- */
-#define BOOST_OPAQUE_PRIVATE_TYPEDEF(UT, OT) \
- BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT, bool)
-
-#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
-
-#define BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, NT1, B) \
-struct NT1 : boost::opaque::private_opaque_class<NT1, UT,B> \
-{ \
- typedef boost::opaque::private_opaque_class<NT1, UT, B> base_type; \
- BOOST_OPAQUE_FORWARD_CONSTRUCTORS(NT1, (boost::opaque::private_opaque_class<NT1, UT,B>)) \
-}
-
-#endif
-
-/**
- Declares a @c private_opaque_class @c OT having @c boost::opaque::boolean as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct NT1 : boost::opaque::private_opaque_class<NT1, UT, boost::opaque::boolean>
- {
- typedef boost::opaque::private_opaque_class<NT1, UT,boost::opaque::boolean> base_type;
- OT(){}
- template <typename W>
- explicit OT(W w)
- : base_type(w)
- {}
- OT(OT const& r)
- : base_type(r.val_)
- {}
- }
- @endcode
- */
-
-#define BOOST_OPAQUE_BOOLEAN_PRIVATE_CLASS(UT, OT) \
- BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, OT, boost::opaque::boolean)
-
-/**
- Declares a @c private_opaque_class @c OT having @c bool as <em>Boolean</em> type.
-
- @Note This macro must be used inside the OT's namespace.
-
- @Params
- @Param{UT, the underlying type}
- @Param{OT, the opaque type}
-
- @Result
- @code
- struct NT1 : boost::opaque::private_opaque_class<NT1, UT, bool>
- {
- typedef boost::opaque::private_opaque_class<NT1, UT,bool> base_type;
- OT(){}
- template <typename W>
- explicit OT(W w)
- : base_type(w)
- {}
- OT(OT const& r)
- : base_type(r.val_)
- {}
- }
- @endcode
- */
-#define BOOST_OPAQUE_PRIVATE_CLASS(UT, OT) \
- BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, OT, bool)
+#include <boost/opaque/macros/forward_constructors.hpp>
+#include <boost/opaque/macros/inherit_from_underlying_spec.hpp>
+#include <boost/opaque/macros/new_class.hpp>
+#include <boost/opaque/macros/new_type.hpp>
+#include <boost/opaque/macros/private_opaque.hpp>
+#include <boost/opaque/macros/public_opaque.hpp>
 
 #endif
 

Added: sandbox/opaque/boost/opaque/macros/forward_constructors.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/forward_constructors.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2010-2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @file
+ * Defines helper macro @c BOOST_OPAQUE_FORWARD_CONSTRUCTORS.
+ */
+
+#ifndef BOOST_OPAQUE_MACROS_FORWARD_CONSTRUCTORS_HPP
+#define BOOST_OPAQUE_MACROS_FORWARD_CONSTRUCTORS_HPP
+
+/** forward the constructors from the new class @c OT to the base class @ BASE
+
+ @Note This macro can be used only inside the public part of a class.
+
+ @Params
+ @Param{OT, the class been defined}
+ @Param{BASE, the base class}
+
+ @Result
+ @code
+ OT(){}
+ template <typename W>
+ explicit OT(W w)
+ : BASE(w)
+ {}
+ OT(OT const& r)
+ : BASE(r.val_)
+ {}
+ @endcode
+ */
+#define BOOST_OPAQUE_FORWARD_CONSTRUCTORS(OT,BASE) \
+ OT(){} \
+ template <typename W> \
+ explicit OT(W w) \
+ : BASE(w) \
+ {}\
+ OT(OT const& r) \
+ : BASE(r.val_) \
+ {}
+
+#endif
+

Added: sandbox/opaque/boost/opaque/macros/inherit_from_underlying_spec.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/inherit_from_underlying_spec.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,52 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2010-2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @file
+ * Defines helper macro @c BOOST_OPAQUE_INHERIT_FROM_UNDERLYING.
+ */
+
+#ifndef BOOST_OPAQUE_MACROS_INHERIT_FROM_UNDERLYING_SPEC_HPP
+#define BOOST_OPAQUE_MACROS_INHERIT_FROM_UNDERLYING_SPEC_HPP
+
+#include <boost/opaque/meta_mixin/inherited_from_underlying.hpp>
+
+/**
+ Specialize inherited_from_underlying for the type @ OT just inheriting the ones from its underlying type.
+
+ @Note This macro can be used only outside a namespace.
+
+ @Params
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ namespace boost {
+ namespace opaque {
+ template <typename Bool>
+ struct inherited_from_underlying<OT,Bool>
+ : inherited_from_underlying<typename OT::underlying_type,Bool> { };
+ }
+ }
+ @endcode
+ */
+#define BOOST_OPAQUE_INHERIT_FROM_UNDERLYING(OT) \
+namespace boost {\
+namespace opaque {\
+ template <typename Bool>\
+ struct inherited_from_underlying<OT,Bool>\
+ : inherited_from_underlying<typename OT::underlying_type,Bool> { };\
+} \
+}
+
+#endif
+

Added: sandbox/opaque/boost/opaque/macros/new_class.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/new_class.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,47 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_OPAQUE_MACROS_NEW_CLASS_HPP
+#define BOOST_OPAQUE_MACROS_NEW_CLASS_HPP
+
+#include <boost/config.hpp>
+#include <boost/opaque/new_class.hpp>
+#include <boost/opaque/macros.hpp>
+#include <boost/preprocessor/seq/enum.hpp>
+
+
+/**
+
+ @brief
+
+ @Params
+ @Param{NC,the new class to be defined }
+ @Param{UT,the underlying type}
+ @Param{MMSEQ,the META_MIXIN_SEQ sequence}
+
+ @Result If @c MMSEQ is <c>( (MM1) ... ((MMn) )</c>
+ @code
+ boost::opaque::new_class< NC, UT,
+ boost::mpl::vector<MM1, ..., MMn>
+ >
+ @endcode
+
+ */
+
+#define BOOST_OPAQUE_NEW_CLASS(NC, UT, MMSEQ) \
+ boost::opaque::new_class< NC, UT, \
+ boost::mpl::vector< \
+ BOOST_PP_SEQ_ENUM(MMSEQ) \
+ > >
+
+
+#endif // BOOST_OPAQUE_MACROS_NEW_CLASS_HPP

Added: sandbox/opaque/boost/opaque/macros/new_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/new_type.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,47 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+#ifndef BOOST_OPAQUE_MACROS_NEW_TYPE_HPP
+#define BOOST_OPAQUE_MACROS_NEW_TYPE_HPP
+
+#include <boost/config.hpp>
+#include <boost/opaque/new_type.hpp>
+#include <boost/preprocessor/seq/enum.hpp>
+
+/**
+
+ @brief Generates the code to define a new typedef.
+
+ @Params
+ @Param{UT,the underlying type}
+ @Param{NT,the new type to be defined }
+ @Param{MMSEQ,the META_MIXIN_SEQ sequence}
+
+ @Result If @c MMSEQ is <c>( (MM1) ... ((MMn) )</c>
+ @code
+ struct NC_tag {};
+ typedef boost::opaque::new_type< UT, NC_tag,
+ boost::mpl::vector<MM1, ..., MMn>
+ > NT
+ @endcode
+
+ */
+
+#define BOOST_OPAQUE_NEW_TYPE(UT,NT,MMSEQ) \
+ struct BOOST_JOIN(NT,_tag){}; \
+ typedef boost::opaque::new_type< UT, BOOST_JOIN(NT,_tag), \
+ boost::mpl::vector< \
+ BOOST_PP_SEQ_ENUM(MMSEQ) \
+ > \
+ > NT
+
+#endif // BOOST_OPAQUE_MACROS_NEW_TYPE_HPP

Added: sandbox/opaque/boost/opaque/macros/private_opaque.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/private_opaque.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,141 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2010-2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @file
+ * Defines helper macros.
+ */
+
+#ifndef BOOST_OPAQUE_MACROS_PRIVATE_OPAQUE_HPP
+#define BOOST_OPAQUE_MACROS_PRIVATE_OPAQUE_HPP
+
+#include <boost/config.hpp>
+#include <boost/opaque/private_opaque_type.hpp>
+#include <boost/opaque/private_opaque_class.hpp>
+#include <boost/opaque/boolean.hpp>
+#include <boost/opaque/macros/forward_constructors.hpp>
+
+//////////////////////////
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
+
+#define BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT,B) \
+ struct BOOST_JOIN(OT, _tag) {};\
+ typedef boost::opaque::private_opaque_type<UT, BOOST_JOIN(OT, _tag),B> OT
+
+#endif
+
+/**
+ Declares a @c private_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct OT_tag {};
+ typedef boost::opaque::private_opaque_type<UT, OT_tag, boost::opaque::boolean> OT
+ @endcode
+ */
+#define BOOST_OPAQUE_BOOLEAN_PRIVATE_TYPEDEF(UT, OT) \
+ BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT, boost::opaque::boolean)
+
+/**
+ Declares a @c private_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct OT_tag {};
+ typedef boost::opaque::private_opaque_type<UT, OT_tag, bool> OT
+ @endcode
+ */
+#define BOOST_OPAQUE_PRIVATE_TYPEDEF(UT, OT) \
+ BOOST_OPAQUE_EXT_PRIVATE_TYPEDEF(UT, OT, bool)
+
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
+
+#define BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, NT1, B) \
+struct NT1 : boost::opaque::private_opaque_class<NT1, UT,B> \
+{ \
+ typedef boost::opaque::private_opaque_class<NT1, UT, B> base_type; \
+ BOOST_OPAQUE_FORWARD_CONSTRUCTORS(NT1, (boost::opaque::private_opaque_class<NT1, UT,B>)) \
+}
+
+#endif
+
+/**
+ Declares a @c private_opaque_class @c OT having @c boost::opaque::boolean as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct NT1 : boost::opaque::private_opaque_class<NT1, UT, boost::opaque::boolean>
+ {
+ typedef boost::opaque::private_opaque_class<NT1, UT,boost::opaque::boolean> base_type;
+ OT(){}
+ template <typename W>
+ explicit OT(W w)
+ : base_type(w)
+ {}
+ OT(OT const& r)
+ : base_type(r.val_)
+ {}
+ }
+ @endcode
+ */
+
+#define BOOST_OPAQUE_BOOLEAN_PRIVATE_CLASS(UT, OT) \
+ BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, OT, boost::opaque::boolean)
+
+/**
+ Declares a @c private_opaque_class @c OT having @c bool as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct NT1 : boost::opaque::private_opaque_class<NT1, UT, bool>
+ {
+ typedef boost::opaque::private_opaque_class<NT1, UT,bool> base_type;
+ OT(){}
+ template <typename W>
+ explicit OT(W w)
+ : base_type(w)
+ {}
+ OT(OT const& r)
+ : base_type(r.val_)
+ {}
+ }
+ @endcode
+ */
+#define BOOST_OPAQUE_PRIVATE_CLASS(UT, OT) \
+ BOOST_OPAQUE_EXT_PRIVATE_CLASS(UT, OT, bool)
+
+#endif
+

Added: sandbox/opaque/boost/opaque/macros/public_opaque.hpp
==============================================================================
--- (empty file)
+++ sandbox/opaque/boost/opaque/macros/public_opaque.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -0,0 +1,141 @@
+//////////////////////////////////////////////////////////////////////////////
+//
+// (C) Copyright Vicente J. Botet Escriba 2010-2011.
+// 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)
+//
+// See http://www.boost.org/libs/opaque for documentation.
+//
+//////////////////////////////////////////////////////////////////////////////
+
+/**
+ * @file
+ * Defines helper macros.
+ */
+
+#ifndef BOOST_OPAQUE_MACROS_PUBLIC_OPAQUE_HPP
+#define BOOST_OPAQUE_MACROS_PUBLIC_OPAQUE_HPP
+
+#include <boost/config.hpp>
+#include <boost/opaque/public_opaque_type.hpp>
+#include <boost/opaque/public_opaque_class.hpp>
+#include <boost/opaque/boolean.hpp>
+#include <boost/opaque/macros/forward_constructors.hpp>
+
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
+
+#define BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, B) \
+ struct BOOST_JOIN(OT, _tag) {};\
+ typedef boost::opaque::public_opaque_type<UT, BOOST_JOIN(OT, _tag), B> OT
+
+#endif
+/**
+ Declares a @c public_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c boost::opaque::boolean as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the @c OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct OT_tag {};
+ typedef boost::opaque::public_opaque_type<UT, OT_tag, boost::opaque::boolean> OT
+ @endcode
+ */
+#define BOOST_OPAQUE_BOOLEAN_PUBLIC_TYPEDEF(UT, OT) \
+BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, boost::opaque::boolean)
+
+/**
+ Declares a @c public_opaque_type typedef @c OT defining a specific tag @c OT_tag having @c bool as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the @c OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct OT_tag {};
+ typedef boost::opaque::public_opaque_type<UT, OT_tag, bool> OT
+ @endcode
+ */
+#define BOOST_OPAQUE_PUBLIC_TYPEDEF(UT, OT) \
+BOOST_OPAQUE_EXT_PUBLIC_TYPEDEF(UT, OT, bool)
+
+//////////////////////////
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
+
+#define BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, NT1, B) \
+ struct NT1 : boost::opaque::public_opaque_class<NT1, UT,B> \
+ { \
+ BOOST_OPAQUE_FORWARD_CONSTRUCTORS(NT1, (boost::opaque::public_opaque_class<NT1, UT,B>)) \
+ }
+
+#endif
+
+/**
+ Declares a @c public_opaque_class @c OT having @c boost::opaque::boolean as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct NT1 : boost::opaque::public_opaque_class<NT1, UT,boost::opaque::boolean>
+ {
+ typedef boost::opaque::public_opaque_class<NT1, UT,boost::opaque::boolean> base_type;
+ OT(){}
+ template <typename W>
+ explicit OT(W w)
+ : base_type(w)
+ {}
+ OT(OT const& r)
+ : base_type(r.val_)
+ {}
+ }
+ @endcode
+ */
+#define BOOST_OPAQUE_BOOLEAN_PUBLIC_CLASS(UT, OT) \
+ BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, OT, boost::opaque::boolean)
+
+
+/**
+ Declares a @c public_opaque_class @c OT having @c bool as <em>Boolean</em> type.
+
+ @Note This macro must be used inside the OT's namespace.
+
+ @Params
+ @Param{UT, the underlying type}
+ @Param{OT, the opaque type}
+
+ @Result
+ @code
+ struct NT1 : boost::opaque::public_opaque_class<NT1, UT, bool>
+ {
+ typedef boost::opaque::public_opaque_class<NT1, UT,bool> base_type;
+ OT(){}
+ template <typename W>
+ explicit OT(W w)
+ : base_type(w)
+ {}
+ OT(OT const& r)
+ : base_type(r.val_)
+ {}
+ }
+ @endcode
+ */
+#define BOOST_OPAQUE_PUBLIC_CLASS(UT, OT) \
+ BOOST_OPAQUE_EXT_PUBLIC_CLASS(UT, OT, bool)
+
+
+
+#endif
+

Modified: sandbox/opaque/boost/opaque/meta_mixin/combined_operators.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/combined_operators.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/combined_operators.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,8 +10,20 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * This file includes meta-mixins combining several operators.
+ *
+ * These meta-mixins have names that follows the naming used in <b>Boost.Operators</b>, but prefixed by @c using_.
+ *
+ * The composite operator templates only list what other templates they use.
+ * The supplied operations and requirements of the composite operator templates can be inferred from the
+ * operations and requirements of the listed components.
+ */
+
 #ifndef BOOST_OPAQUE_COMBINED_OPERATORS_HPP
 #define BOOST_OPAQUE_COMBINED_OPERATORS_HPP
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
 
 #include <boost/operators.hpp>
 #include <boost/opaque/meta_mixin/operators.hpp>
@@ -515,3 +527,4 @@
 
 
 #endif
+#endif

Modified: sandbox/opaque/boost/opaque/meta_mixin/inherited_from_underlying.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/inherited_from_underlying.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/inherited_from_underlying.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c inherited_from_underlying meta-function, the helper inherited_from_arithmetic and the specialization for the builtin type.
+ */
+
 #ifndef BOOST_OPAQUE_INHERITED_FROM_UNDERLYING_HPP
 #define BOOST_OPAQUE_INHERITED_FROM_UNDERLYING_HPP
 

Modified: sandbox/opaque/boost/opaque/meta_mixin/linear_hierarchy.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/linear_hierarchy.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/linear_hierarchy.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c linear_hierarchy meta-function.
+ */
+
 #ifndef BOOST_OPAQUE_LINEAR_HIERARCHY_HPP
 #define BOOST_OPAQUE_LINEAR_HIERARCHY_HPP
 

Modified: sandbox/opaque/boost/opaque/meta_mixin/operators.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/operators.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/operators.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -17,6 +17,11 @@
  * There is a meta-mixin for each one of the C++ overloadable operators.
  * These meta-mixins have names that follows the naming used in <b>Boost.ConceptsTraits</b>, but prefixed by using_.
  *
+ * See the section for a complete list of operators meta-mixins.
+ */
+
+/*
+ * In this section the meta-mixin follows the schema
  * <b>Arithmetic Operators</b>
  *
  * The arithmetic meta-mixins ease the task of creating a custom numeric type based on the underlying type.
@@ -33,8 +38,6 @@
  * has to provide. They have an additional optional template parameter Base, which is not shown, for the base class
  * chaining technique.
  *
- * In this section the meta-mixin follows the schema
- *
  * @code
  * struct meta-mixin {
  * template <typename NT, typename Base>
@@ -53,14 +56,12 @@
  * - @c lhs_ut is the instance @c UT reference obtained @c lhs.underlying().
  * - @c rhs_ut is the instance @c UT reference obtained @c rhs.underlying().
  *
-
-
-
  *
  */
 
 #ifndef BOOST_OPAQUE_OPERATORS_HPP
 #define BOOST_OPAQUE_OPERATORS_HPP
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
 
 #include <boost/operators.hpp>
 
@@ -1079,3 +1080,4 @@
 }
 
 #endif
+#endif

Modified: sandbox/opaque/boost/opaque/meta_mixin/using_explicit_conversion_to_ut_hierarchy.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/using_explicit_conversion_to_ut_hierarchy.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/using_explicit_conversion_to_ut_hierarchy.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c using_explicit_conversion_to_underlying_type_hierarchy meta-mixin.
+ */
+
 #ifndef BOOST_OPAQUE_TRANSITIVE_EXPLICIT_SUBSTITUABLE_HPP
 #define BOOST_OPAQUE_TRANSITIVE_EXPLICIT_SUBSTITUABLE_HPP
 

Modified: sandbox/opaque/boost/opaque/meta_mixin/using_implicit_conversion_to_ut_hierarchy.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/meta_mixin/using_implicit_conversion_to_ut_hierarchy.hpp (original)
+++ sandbox/opaque/boost/opaque/meta_mixin/using_implicit_conversion_to_ut_hierarchy.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c using_implicit_conversion_to_underlying_type_hierarchy meta-mixin.
+ */
+
 #ifndef BOOST_OPAQUE_TRANSITIVE_SUBSTITUABLE_HPP
 #define BOOST_OPAQUE_TRANSITIVE_SUBSTITUABLE_HPP
 

Modified: sandbox/opaque/boost/opaque/new_class.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/new_class.hpp (original)
+++ sandbox/opaque/boost/opaque/new_class.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -12,7 +12,8 @@
 
 
 /**
- * @File Defines the new_class<> class.
+ * @file
+ * Defines the new_class<> class.
  */
 
 

Deleted: sandbox/opaque/boost/opaque/new_class_macro.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/new_class_macro.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
+++ (empty file)
@@ -1,47 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Vicente J. Botet Escriba 2011.
-// 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)
-//
-// See http://www.boost.org/libs/opaque for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_OPAQUE_NEW_CLASS_MACRO_HPP
-#define BOOST_OPAQUE_NEW_CLASS_MACRO_HPP
-
-#include <boost/config.hpp>
-#include <boost/opaque/new_class.hpp>
-#include <boost/opaque/macros.hpp>
-#include <boost/preprocessor/seq/enum.hpp>
-
-
-/**
-
- @brief
-
- @Params
- @Param{NC,the new class to be defined }
- @Param{UT,the underlying type}
- @Param{MMSEQ,the META_MIXIN_SEQ sequence}
-
- @Result If @c MMSEQ is <c>( (MM1) ... ((MMn) )</c>
- @code
- boost::opaque::new_class< NC, UT,
- boost::mpl::vector<MM1, ..., MMn>
- >
- @endcode
-
- */
-
-#define BOOST_OPAQUE_NEW_CLASS(NC, UT, MMSEQ) \
- boost::opaque::new_class< NC, UT, \
- boost::mpl::vector< \
- BOOST_PP_SEQ_ENUM(MMSEQ) \
- > >
-
-
-#endif

Modified: sandbox/opaque/boost/opaque/new_type.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/new_type.hpp (original)
+++ sandbox/opaque/boost/opaque/new_type.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the new_type<> class.
+ */
+
 #ifndef BOOST_OPAQUE_NEW_TYPE_HPP
 #define BOOST_OPAQUE_NEW_TYPE_HPP
 

Deleted: sandbox/opaque/boost/opaque/new_type_macro.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/new_type_macro.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
+++ (empty file)
@@ -1,47 +0,0 @@
-//////////////////////////////////////////////////////////////////////////////
-//
-// (C) Copyright Vicente J. Botet Escriba 2011.
-// 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)
-//
-// See http://www.boost.org/libs/opaque for documentation.
-//
-//////////////////////////////////////////////////////////////////////////////
-
-#ifndef BOOST_OPAQUE_NEW_TYPE_MACRO_HPP
-#define BOOST_OPAQUE_NEW_TYPE_MACRO_HPP
-
-#include <boost/config.hpp>
-#include <boost/opaque/new_type.hpp>
-#include <boost/preprocessor/seq/enum.hpp>
-
-/**
-
- @brief Generates the code to define a new typedef.
-
- @Params
- @Param{UT,the underlying type}
- @Param{NT,the new type to be defined }
- @Param{MMSEQ,the META_MIXIN_SEQ sequence}
-
- @Result If @c MMSEQ is <c>( (MM1) ... ((MMn) )</c>
- @code
- struct NC_tag {};
- typedef boost::opaque::new_type< UT, NC_tag,
- boost::mpl::vector<MM1, ..., MMn>
- > NT
- @endcode
-
- */
-
-#define BOOST_OPAQUE_NEW_TYPE(UT,NT,MMSEQ) \
- struct BOOST_JOIN(NT,_tag){}; \
- typedef boost::opaque::new_type< UT, BOOST_JOIN(NT,_tag), \
- boost::mpl::vector< \
- BOOST_PP_SEQ_ENUM(MMSEQ) \
- > \
- > NT
-
-#endif

Modified: sandbox/opaque/boost/opaque/opaque.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/opaque.hpp (original)
+++ sandbox/opaque/boost/opaque/opaque.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,25 +10,34 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Includes all the opaque public headers.
+ */
+
 #ifndef BOOST_OPAQUE_OPAQUE_HPP
 #define BOOST_OPAQUE_OPAQUE_HPP
 
 #include <boost/opaque/new_type.hpp>
 #include <boost/opaque/new_class.hpp>
-#include <boost/opaque/meta_mixin/operators.hpp>
-#include <boost/opaque/meta_mixin/combined_operators.hpp>
 #include <boost/opaque/private_opaque_type.hpp>
 #include <boost/opaque/private_opaque_class.hpp>
 #include <boost/opaque/public_opaque_type.hpp>
 #include <boost/opaque/public_opaque_class.hpp>
 #include <boost/opaque/boolean.hpp>
+#include <boost/opaque/meta_mixin/operators.hpp>
+#include <boost/opaque/meta_mixin/combined_operators.hpp>
 #include <boost/opaque/macros.hpp>
 #include <boost/mpl/bool.hpp>
 #include <boost/mpl/assert.hpp>
 
+#if !defined(BOOST_OPAQUE_DOXYGEN_INVOKED)
+
 #define BOOST_OPAQUE_STATIC_ASSERT(CND, MSG, TYPES) \
     BOOST_MPL_ASSERT_MSG(boost::mpl::bool_< (CND) >::type::value, MSG, TYPES)
 
+#endif
+
 namespace boost {
 
     #if 0

Modified: sandbox/opaque/boost/opaque/private_opaque_class.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/private_opaque_class.hpp (original)
+++ sandbox/opaque/boost/opaque/private_opaque_class.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,11 +10,14 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c base_private_opaque_type and @c private_opaque_class classes.
+ */
+
 #ifndef BOOST_OPAQUE_PRIVATE_OPAQUE_CLASS_HPP
 #define BOOST_OPAQUE_PRIVATE_OPAQUE_CLASS_HPP
 
-
-
 #include <boost/opaque/meta_mixin/inherited_from_underlying.hpp>
 #include <boost/opaque/meta_mixin/using_explicit_conversion_to_ut_hierarchy.hpp>
 

Modified: sandbox/opaque/boost/opaque/private_opaque_type.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/private_opaque_type.hpp (original)
+++ sandbox/opaque/boost/opaque/private_opaque_type.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c private_opaque_type class.
+ */
+
 #ifndef BOOST_OPAQUE_PRIVATE_OPAQUE_TYPE_HPP
 #define BOOST_OPAQUE_PRIVATE_OPAQUE_TYPE_HPP
 

Modified: sandbox/opaque/boost/opaque/public_opaque_class.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/public_opaque_class.hpp (original)
+++ sandbox/opaque/boost/opaque/public_opaque_class.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c base_public_opaque_type and @c public_opaque_class classes.
+ */
+
 #ifndef BOOST_OPAQUE_PUBLIC_OPAQUE_CLASS_HPP
 #define BOOST_OPAQUE_PUBLIC_OPAQUE_CLASS_HPP
 

Modified: sandbox/opaque/boost/opaque/public_opaque_type.hpp
==============================================================================
--- sandbox/opaque/boost/opaque/public_opaque_type.hpp (original)
+++ sandbox/opaque/boost/opaque/public_opaque_type.hpp 2011-03-27 13:48:19 EDT (Sun, 27 Mar 2011)
@@ -10,6 +10,11 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+/**
+ * @file
+ * Defines the @c public_opaque_type class.
+ */
+
 #ifndef BOOST_OPAQUE_PUBLIC_OPAQUE_TYPE_HPP
 #define BOOST_OPAQUE_PUBLIC_OPAQUE_TYPE_HPP
 


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