|
Boost-Commit : |
From: eric_at_[hidden]
Date: 2007-12-22 01:08:48
Author: eric_niebler
Date: 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
New Revision: 42241
URL: http://svn.boost.org/trac/boost/changeset/42241
Log:
port extends to c++0x
Text files modified:
branches/proto/v3/boost/xpressive/proto/expr.hpp | 6
branches/proto/v3/boost/xpressive/proto/extends.hpp | 324 +++++++++++++++++++++++++--------------
branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp | 6
branches/proto/v3/boost/xpressive/regex_actions.hpp | 6
branches/proto/v3/libs/xpressive/proto/test/lambda.cpp | 4
branches/proto/v3/libs/xpressive/proto/test/proto_fusion_s.cpp | 6
6 files changed, 222 insertions(+), 130 deletions(-)
Modified: branches/proto/v3/boost/xpressive/proto/expr.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/expr.hpp (original)
+++ branches/proto/v3/boost/xpressive/proto/expr.hpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -227,7 +227,7 @@
/// construct
///
template<typename Expr, typename A>
- inline Expr construct(A &a)
+ inline Expr construct(A const &a)
{
typedef typename Expr::proto_args::cons_type cons_type;
Expr that = {proto::argsns_::make_cons_<cons_type>(a)};
@@ -238,7 +238,7 @@
/// \overload
///
template<typename Expr, typename... A>
- inline Expr construct(A const &... a)
+ inline Expr construct(A &... a)
{
typedef typename Expr::proto_args::cons_type cons_type;
Expr that = {proto::argsns_::make_cons_<cons_type>(a...)};
@@ -247,7 +247,7 @@
#else
#define TMP(Z, N, DATA) \
template<typename Expr BOOST_PP_ENUM_TRAILING_PARAMS_Z(Z, N, typename A)> \
- inline Expr construct(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, const &a)) \
+ inline Expr construct(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a)) \
{ \
typedef typename Expr::proto_args::cons_type cons_type; \
Expr that = {proto::argsns_::make_cons_<cons_type>(BOOST_PP_ENUM_PARAMS_Z(Z, N, a))}; \
Modified: branches/proto/v3/boost/xpressive/proto/extends.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/extends.hpp (original)
+++ branches/proto/v3/boost/xpressive/proto/extends.hpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -53,145 +53,237 @@
Expr const &proto_base() const \
{ \
return this->expr; \
- } \
- /**/
+ }
+#if defined(BOOST_HAS_VARIADIC_TMPL) && defined(BOOST_HAS_RVALUE_REFS)
/// INTERNAL ONLY
///
- #define BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(Expr, Derived, Domain, Const) \
+ #define BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(Const) \
template<typename A> \
- typename boost::mpl::apply_wrap1< \
- Domain \
- , boost::proto::expr< \
- boost::proto::tag::assign \
- , boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type \
- > \
- > \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A \
>::type const \
operator =(A &&a) BOOST_PROTO_CONST ## Const \
{ \
- typedef \
- boost::proto::expr< \
- boost::proto::tag::assign \
- , boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type \
- > \
- > \
- that_type; \
- that_type that = { \
- {*static_cast<Derived BOOST_PROTO_CONST ## Const *>(this) \
- , {boost::proto::result_of::as_expr_ref<A, Domain>::call(a)}} \
- }; \
- return Domain::make(that); \
- } \
- /**/
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_ASSIGN() \
+ BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(0) \
+ BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(1)
- #define BOOST_PROTO_EXTENDS_ASSIGN_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(Expr, Derived, Domain, 1)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(Const) \
+ template<typename A> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A \
+ >::type const \
+ operator [](A &&a) BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_SUBSCRIPT() \
+ BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(0) \
+ BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(1)
- #define BOOST_PROTO_EXTENDS_ASSIGN_NON_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(Expr, Derived, Domain, 0)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(Const) \
+ template<typename... A> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::function \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A... \
+ >::type const \
+ operator ()(A &&... a) BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::function \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A... \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a...); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_FUNCTION() \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(0) \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(1)
- #define BOOST_PROTO_EXTENDS_ASSIGN(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_ASSIGN_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_ASSIGN_NON_CONST(Expr, Derived, Domain) \
- /**/
+#else
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(Const) \
+ template<typename A> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A & \
+ >::type const \
+ operator =(A &a) BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A & \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
+ } \
+ template<typename A> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A const & \
+ >::type const \
+ operator =(A const &a) BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::assign \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A const & \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_ASSIGN() \
+ BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(0) \
+ BOOST_PROTO_EXTENDS_ASSIGN_IMPL_(1)
/// INTERNAL ONLY
///
- #define BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(Expr, Derived, Domain, Const) \
+ #define BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(Const) \
template<typename A> \
- typename boost::mpl::apply_wrap1< \
- Domain \
- , boost::proto::expr< \
- boost::proto::tag::subscript \
- , boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type \
- > \
- > \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A & \
>::type const \
- operator [](A &&a) BOOST_PROTO_CONST ## Const \
+ operator [](A &a) BOOST_PROTO_CONST ## Const \
{ \
- typedef \
- boost::proto::expr< \
- boost::proto::tag::subscript \
- , boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type \
- > \
- > \
- that_type; \
- that_type that = { \
- {*static_cast<Derived BOOST_PROTO_CONST ## Const *>(this) \
- , {boost::proto::result_of::as_expr_ref<A, Domain>::call(a)}} \
- }; \
- return Domain::make(that); \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A & \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
} \
- /**/
+ template<typename A> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A const & \
+ >::type const \
+ operator [](A const &a) BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::subscript \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ , A const & \
+ >::call(*static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this), a); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_SUBSCRIPT() \
+ BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(0) \
+ BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(1)
- #define BOOST_PROTO_EXTENDS_SUBSCRIPT_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(Expr, Derived, Domain, 1)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_1 \
+ ((0)(1))
- #define BOOST_PROTO_EXTENDS_SUBSCRIPT_NON_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_SUBSCRIPT_IMPL_(Expr, Derived, Domain, 0)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_2(R, PRODUCT) \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_8(R, BOOST_PP_SEQ_SIZE(PRODUCT), PRODUCT)
- #define BOOST_PROTO_EXTENDS_SUBSCRIPT(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_SUBSCRIPT_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_SUBSCRIPT_NON_CONST(Expr, Derived, Domain) \
- /**/
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_3(R, STATE) \
+ BOOST_PP_NOT_EQUAL(BOOST_PROTO_MAX_ARITY, BOOST_PP_SEQ_SIZE(STATE))
/// INTERNAL ONLY
///
- #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(Expr, Derived, Domain, Const) \
- template<typename... A> \
- typename boost::mpl::apply_wrap1< \
- Domain \
- , boost::proto::expr< \
- boost::proto::tag::function \
- , boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type... \
- > \
- > \
- >::type const \
- operator ()(A &&... a) BOOST_PROTO_CONST ## Const \
- { \
- typedef \
- boost::proto::args< \
- Derived BOOST_PROTO_CONST ## Const & \
- , typename boost::proto::result_of::as_expr_ref<A, Domain>::type... \
- > \
- args_type; \
- typedef \
- boost::proto::expr< \
- boost::proto::tag::function \
- , args_type \
- > \
- that_type; \
- that_type that = { \
- boost::proto::argsns_::make_cons_<typename args_type::cons_type>( \
- *static_cast<Derived BOOST_PROTO_CONST ## Const *>(this) \
- , boost::proto::result_of::as_expr_ref<A, Domain>::call(a)... \
- ) \
- }; \
- return Domain::make(that); \
- } \
- /**/
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_4(R, STATE) \
+ STATE BOOST_PROTO_EXTENDS_FUNCTION_IMPL_1
+
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_5(R, _, I, ELEM) \
+ BOOST_PP_COMMA_IF(I) \
+ BOOST_PP_CAT(A, I) BOOST_PP_CAT(BOOST_PROTO_CONST, ELEM) &BOOST_PP_CAT(a, I)
+
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_6(R, _, I, ELEM) \
+ , BOOST_PP_CAT(A, I) BOOST_PP_CAT(BOOST_PROTO_CONST, ELEM) &
+
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_7(R, STATE) \
+ BOOST_PP_SEQ_FOR_EACH_PRODUCT_R(R, BOOST_PROTO_EXTENDS_FUNCTION_IMPL_2, STATE)
- #define BOOST_PROTO_EXTENDS_FUNCTION_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(Expr, Derived, Domain, 1)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_8(R, SIZE, PRODUCT) \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_9(R, SIZE, PRODUCT, 0) \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_9(R, SIZE, PRODUCT, 1)
- #define BOOST_PROTO_EXTENDS_FUNCTION_NON_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_FUNCTION_IMPL_(Expr, Derived, Domain, 0)
+ /// INTERNAL ONLY
+ ///
+ #define BOOST_PROTO_EXTENDS_FUNCTION_IMPL_9(R, SIZE, PRODUCT, Const) \
+ template<BOOST_PP_ENUM_PARAMS(SIZE, typename A)> \
+ typename boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::function \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ BOOST_PP_SEQ_FOR_EACH_I_R(R, BOOST_PROTO_EXTENDS_FUNCTION_IMPL_6, ~, PRODUCT) \
+ >::type const \
+ operator ()(BOOST_PP_SEQ_FOR_EACH_I_R(R, BOOST_PROTO_EXTENDS_FUNCTION_IMPL_5, ~, PRODUCT)) \
+ BOOST_PROTO_CONST ## Const \
+ { \
+ return boost::proto::result_of::make_expr_ref< \
+ boost::proto::tag::function \
+ , proto_domain \
+ , proto_derived_expr BOOST_PROTO_CONST ## Const & \
+ BOOST_PP_SEQ_FOR_EACH_I_R(R, BOOST_PROTO_EXTENDS_FUNCTION_IMPL_6, ~, PRODUCT) \
+ >::call( \
+ *static_cast<proto_derived_expr BOOST_PROTO_CONST ## Const *>(this) \
+ BOOST_PP_ENUM_TRAILING_PARAMS(SIZE, a) \
+ ); \
+ }
+
+ #define BOOST_PROTO_EXTENDS_FUNCTION() \
+ BOOST_PP_FOR( \
+ BOOST_PROTO_EXTENDS_FUNCTION_IMPL_1 \
+ , BOOST_PROTO_EXTENDS_FUNCTION_IMPL_3 \
+ , BOOST_PROTO_EXTENDS_FUNCTION_IMPL_4 \
+ , BOOST_PROTO_EXTENDS_FUNCTION_IMPL_7 \
+ )
- #define BOOST_PROTO_EXTENDS_FUNCTION(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_FUNCTION_CONST(Expr, Derived, Domain) \
- BOOST_PROTO_EXTENDS_FUNCTION_NON_CONST(Expr, Derived, Domain) \
- /**/
+#endif
namespace exprns_
{
@@ -241,9 +333,9 @@
{}
BOOST_PROTO_EXTENDS(Expr, Derived, Domain)
- BOOST_PROTO_EXTENDS_ASSIGN(Expr, Derived, Domain)
- BOOST_PROTO_EXTENDS_SUBSCRIPT(Expr, Derived, Domain)
- BOOST_PROTO_EXTENDS_FUNCTION(Expr, Derived, Domain)
+ BOOST_PROTO_EXTENDS_ASSIGN()
+ BOOST_PROTO_EXTENDS_SUBSCRIPT()
+ BOOST_PROTO_EXTENDS_FUNCTION()
};
} // namespace exprns_
Modified: branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp (original)
+++ branches/proto/v3/boost/xpressive/proto/proto_fwd.hpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -113,15 +113,15 @@
struct is_proto_expr;
template<typename Expr, typename A>
- Expr construct(A &a);
+ Expr construct(A const &a);
#ifdef BOOST_HAS_VARIADIC_TMPL
template<typename Expr, typename... A>
- Expr construct(A const &... a);
+ Expr construct(A &... a);
#else
#define TMP(Z, N, DATA) \
template<typename Expr BOOST_PP_ENUM_TRAILING_PARAMS_Z(Z, N, typename A)> \
- Expr construct(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, const &a)); \
+ Expr construct(BOOST_PP_ENUM_BINARY_PARAMS_Z(Z, N, A, &a)); \
/**/
BOOST_PP_REPEAT_FROM_TO(1, BOOST_PP_INC(BOOST_PROTO_MAX_ARITY), TMP, ~)
#undef TMP
Modified: branches/proto/v3/boost/xpressive/regex_actions.hpp
==============================================================================
--- branches/proto/v3/boost/xpressive/regex_actions.hpp (original)
+++ branches/proto/v3/boost/xpressive/regex_actions.hpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -797,9 +797,9 @@
typedef typename proto::terminal<detail::action_arg<T, mpl::int_<I> > >::type action_arg_type;
BOOST_PROTO_EXTENDS(action_arg_type, this_type, proto::default_domain)
- BOOST_PROTO_EXTENDS_ASSIGN(action_arg_type, this_type, proto::default_domain)
- BOOST_PROTO_EXTENDS_SUBSCRIPT(action_arg_type, this_type, proto::default_domain)
- BOOST_PROTO_EXTENDS_FUNCTION(action_arg_type, this_type, proto::default_domain)
+ BOOST_PROTO_EXTENDS_ASSIGN()
+ BOOST_PROTO_EXTENDS_SUBSCRIPT()
+ BOOST_PROTO_EXTENDS_FUNCTION()
};
/// Usage: construct\<Type\>(arg1, arg2)
Modified: branches/proto/v3/libs/xpressive/proto/test/lambda.cpp
==============================================================================
--- branches/proto/v3/libs/xpressive/proto/test/lambda.cpp (original)
+++ branches/proto/v3/libs/xpressive/proto/test/lambda.cpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -112,8 +112,8 @@
struct lambda
{
BOOST_PROTO_EXTENDS(T, lambda<T>, lambda_domain)
- BOOST_PROTO_EXTENDS_ASSIGN(T, lambda<T>, lambda_domain)
- BOOST_PROTO_EXTENDS_SUBSCRIPT(T, lambda<T>, lambda_domain)
+ BOOST_PROTO_EXTENDS_ASSIGN()
+ BOOST_PROTO_EXTENDS_SUBSCRIPT()
// Careful not to evaluate the return type of the nullary function
// unless we have a nullary lambda!
Modified: branches/proto/v3/libs/xpressive/proto/test/proto_fusion_s.cpp
==============================================================================
--- branches/proto/v3/libs/xpressive/proto/test/proto_fusion_s.cpp (original)
+++ branches/proto/v3/libs/xpressive/proto/test/proto_fusion_s.cpp 2007-12-22 01:08:47 EST (Sat, 22 Dec 2007)
@@ -129,9 +129,9 @@
struct My
{
BOOST_PROTO_EXTENDS(Expr, My<Expr>, MyDomain)
- BOOST_PROTO_EXTENDS_ASSIGN(Expr, My<Expr>, MyDomain)
- BOOST_PROTO_EXTENDS_SUBSCRIPT(Expr, My<Expr>, MyDomain)
- BOOST_PROTO_EXTENDS_FUNCTION(Expr, My<Expr>, MyDomain)
+ BOOST_PROTO_EXTENDS_ASSIGN()
+ BOOST_PROTO_EXTENDS_SUBSCRIPT()
+ BOOST_PROTO_EXTENDS_FUNCTION()
};
void test2()
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