|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r70101 - in sandbox/assign_v2/boost/assign/v2/detail/traits: . ptr_container value_container
From: erwann.rogard_at_[hidden]
Date: 2011-03-17 21:56:08
Author: e_r
Date: 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
New Revision: 70101
URL: http://svn.boost.org/trac/boost/changeset/70101
Log:
upd assign_v2
Added:
sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/
sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/fwd.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/meta.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/to_value_container.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/category.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/fwd.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_push.hpp (contents, props changed)
sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_value_type.hpp (contents, props changed)
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,15 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_TRAITS_PTR_CONTAINER_ER_2010_HPP
+#define BOOST_ASSIGN_V2_TRAITS_PTR_CONTAINER_ER_2010_HPP
+#include <boost/assign/v2/detail/traits/ptr_container/meta.hpp>
+#include <boost/assign/v2/detail/traits/ptr_container/to_value_container.hpp>
+
+#endif // BOOST_ASSIGN_V2_TRAITS_PTR_CONTAINER_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/fwd.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/fwd.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,100 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_FWD_ER_2010_HPP
+#define BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_FWD_ER_2010_HPP
+#include <cstddef>
+
+
+namespace boost{
+
+ template
+ <
+ class T,
+ std::size_t N,
+ class CloneAllocator
+ >
+ class ptr_array;
+
+ template
+ <
+ class T,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_circular_buffer;
+
+ template
+ <
+ class T,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_deque;
+
+ template
+ <
+ class T,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_list;
+
+ template
+ <
+ class Key,
+ class T,
+ class Compare,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_map;
+
+ template
+ <
+ class Key,
+ class Compare,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_set;
+
+ template
+ <
+ class Key,
+ class T,
+ class Hash,
+ class Pred,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_unordered_map;
+
+ template
+ <
+ class Key,
+ class Hash,
+ class Pred,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_unordered_set;
+
+
+ template
+ <
+ class T,
+ class CloneAllocator,
+ class Allocator
+ >
+ class ptr_vector;
+
+}// boost
+
+#endif // BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_FWD_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/meta.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/meta.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,43 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_META_ER_2010_HPP
+#define BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_META_ER_2010_HPP
+#include <boost/assign/v2/detail/traits/ptr_container/to_value_container.hpp>
+#include <boost/mpl/not.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+namespace ptr_container_aux{
+
+
+ template<typename PtrC>
+ struct is_ptr_container : ::boost::mpl::not_<
+ boost::is_same<
+ PtrC, typename to_value_container<PtrC>::type
+ >
+ >{};
+
+ template<template<typename > class F>
+ struct through_value_container
+ {
+ template<typename PtrC /*or C*/>
+ struct apply : F<
+ typename to_value_container<PtrC>::type
+ >{};
+ };
+
+}// ptr_container_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_META_ER_2010_HPP
\ No newline at end of file
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/to_value_container.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/ptr_container/to_value_container.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,215 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_TRAITS_ER_2010_HPP
+#define BOOST_ASSIGN_V2_DETAIL_TRAITS_PTR_CONTAINER_TRAITS_ER_2010_HPP
+#include <cstddef>
+#include <memory> // std::allocator
+#include <boost/assign/v2/detail/traits/value_container/fwd.hpp>
+#include <boost/assign/v2/detail/traits/ptr_container/fwd.hpp>
+#include <boost/mpl/size_t.hpp>
+#include <boost/type_traits/remove_reference.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+namespace ptr_container_aux{
+
+ template<typename A, typename T> struct to_value_allocator_helper{};
+
+ template<typename T>
+ struct to_value_allocator_helper<std::allocator<void*>, T>
+ {
+ typedef std::allocator<T> type;
+ };
+
+ template<typename PtrC>
+ struct to_value_value : boost::remove_reference<
+ typename PtrC::reference
+ >{};
+
+ template<typename PtrC>
+ struct to_value_allocator : to_value_allocator_helper<
+ typename PtrC::allocator_type,
+ typename to_value_value<PtrC>::type
+ >
+ {};
+
+ template<typename PtrC> struct helper_size{};
+
+ template<typename T, std::size_t N, typename C>
+ struct helper_size< boost::ptr_array<T, N, C> >
+ : ::boost::mpl::size_t<
+ N
+ >{};
+
+ template<typename PtrC>
+ struct to_value_array
+ {
+ typedef boost::array<
+ typename to_value_value<PtrC>::type,
+ helper_size<PtrC>::value
+ > type;
+ };
+
+ template<typename PtrC, template<typename, typename> class C>
+ struct to_value_sequence {
+
+ typedef C<
+ typename to_value_value<PtrC>::type,
+ typename to_value_allocator<PtrC>::type
+ > type;
+
+ };
+
+ template<typename PtrC, template<typename, typename, typename, typename> class C>
+ struct to_value_map{
+
+ typedef C<
+ typename PtrC::key_type,
+ typename to_value_value<PtrC>::type,
+ typename PtrC::key_compare,
+ typename to_value_allocator<PtrC>::type
+ > type;
+
+ };
+
+ template<typename PtrC, template<typename, typename, typename> class C>
+ struct to_value_set{
+
+ typedef C<
+ typename PtrC::key_type,
+ typename PtrC::key_compare,
+ typename to_value_allocator<PtrC>::type
+ > type;
+
+ };
+
+ template<typename PtrC,
+ template<typename, typename, typename, typename, typename> class C>
+ class to_value_unordered_map{
+
+ typedef C<
+ typename PtrC::key_type,
+ typename to_value_value<PtrC>::type,
+ typename PtrC::hasher,
+ typename PtrC::key_equal,
+ typename to_value_allocator<PtrC>::type
+ > container_type;
+
+ };
+
+ template<typename PtrC,
+ template<typename, typename, typename, typename> class C>
+ class unordered_set_like{
+
+ typedef C<
+ typename PtrC::key_type,
+ typename PtrC::hasher,
+ typename PtrC::key_equal,
+ typename to_value_allocator<PtrC>::type
+ > container_type;
+
+ };
+
+ // TO_VALUE_CONTAINER
+
+ template<typename PtrC>
+ struct to_value_container
+ {
+ typedef PtrC type;
+ };
+
+ // Array
+ template<
+ typename T,
+ std::size_t N,
+ typename A
+ >
+ struct to_value_container<
+ boost::ptr_array<T, N, A>
+ > : to_value_array<
+ boost::ptr_array<T, N, A>
+ >{};
+
+ // Sequence
+
+ template<
+ typename T,
+ typename C,
+ typename A
+ >
+ struct to_value_container<
+ boost::ptr_deque<T, C, A>
+ > : to_value_sequence<
+ boost::ptr_deque<T, C, A>,
+ std::deque
+ >{};
+
+ template<
+ typename T,
+ typename C,
+ typename A
+ >
+ struct to_value_container<
+ boost::ptr_list<T, C, A>
+ > : to_value_sequence<
+ boost::ptr_list<T, C, A>,
+ std::list
+ >{};
+
+ template<
+ typename T,
+ typename C,
+ typename A
+ >
+ struct to_value_container<
+ boost::ptr_vector<T, C, A>
+ > : to_value_sequence<
+ boost::ptr_vector<T, C, A>,
+ std::vector
+ >{};
+
+ template
+ <
+ class Key,
+ class T,
+ class Compare,
+ class CloneAllocator,
+ class Allocator
+ >
+ struct to_value_container<
+ boost::ptr_map<Key, T, Compare, CloneAllocator, Allocator>
+ > : to_value_map<
+ boost::ptr_map<Key, T, Compare, CloneAllocator, Allocator>,
+ std::map
+ >{};
+
+ template
+ <
+ class Key,
+ class Compare,
+ class CloneAllocator,
+ class Allocator
+ >
+ struct to_value_container<
+ boost::ptr_set<Key, Compare, CloneAllocator, Allocator>
+ > : to_value_set<
+ boost::ptr_set<Key, Compare, CloneAllocator, Allocator>,
+ std::set
+ >{};
+
+ // TODO unordered
+
+}// ptr_container_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_DETAIL_TRAITS_CONTAINER_FWD_PTR_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/value_container.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/value_container.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,16 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_ER_2010_HPP
+#define BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_ER_2010_HPP
+#include <boost/assign/v2/detail/traits/value_container/category.hpp>
+#include <boost/assign/v2/detail/traits/value_container/has_push.hpp>
+#include <boost/assign/v2/detail/traits/value_container/has_value_type.hpp>
+
+#endif // BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/category.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/category.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,55 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_CATEGORY_ER_2010_HPP
+#define BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_CATEGORY_ER_2010_HPP
+#include <boost/mpl/bool.hpp>
+#include <boost/assign/v2/detail/traits/value_container/fwd.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+namespace value_container_aux{
+
+ // FIFO
+ template<typename C> struct is_fifo : ::boost::mpl::false_{};
+
+ template<typename T, typename A>
+ struct is_fifo< std::queue<T, A> > : ::boost::mpl::true_{};
+
+ // LIFO
+ template<typename V>
+ struct is_lifo : ::boost::mpl::false_{};
+
+ template<typename T, typename A>
+ struct is_lifo< std::stack<T,A> > : ::boost::mpl::true_{};
+
+ // IS_SORTED
+ template<typename V>
+ struct is_sorted : ::boost::mpl::false_{};
+
+ template<typename T, typename C, typename A>
+ struct is_sorted< std::set<T, C, A> > : ::boost::mpl::true_{};
+
+ template<typename K, typename T, typename C, typename A>
+ struct is_sorted< std::map<K, T, C, A> > : ::boost::mpl::true_{};
+
+ // IS_ARRAY
+ template<typename C> struct is_array : ::boost::mpl::false_{};
+ template<typename T, std::size_t sz> struct is_array<
+ boost::array<T, sz>
+ > : ::boost::mpl::true_{};
+
+
+}// value_container_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_CATEGORY_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/fwd.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/fwd.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,48 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_DETAIL_TRAITS_VALUE_CONTAINER_FWD_ER_2010_HPP
+#define BOOST_ASSIGN_V2_DETAIL_TRAITS_VALUE_CONTAINER_FWD_ER_2010_HPP
+#include <cstddef>
+
+namespace std{
+
+ // www.sgi.com/tech/stl/Deque.html
+ template<typename T, typename A> class deque;
+
+ // http://www.sgi.com/tech/stl/List.html
+ template<typename T, typename A> class list;
+
+ // http://www.sgi.com/tech/stl/Map.html
+ template<typename K, typename T, typename C, typename A> class map;
+
+ // http://www.sgi.com/tech/stl/queue.html
+ template<typename T, typename S> class queue;
+
+ // http://www.sgi.com/tech/stl/set.html
+ template<typename T, typename C, typename A> class set;
+
+ // http://www.sgi.com/tech/stl/stack.html
+ template<typename T, typename S> class stack;
+
+ // http://www.sgi.com/tech/stl/Vector.html
+ template<typename T, typename A> class vector;
+
+}// std
+namespace boost{
+
+ // http://www.boost.org/doc/libs/release/doc/html/array.html
+ template<typename T, std::size_t size> class array;
+
+ // http://www.boost.org/doc/libs/release/libs/circular_buffer/index.html
+ template<typename T, typename Alloc> class circular_buffer;
+
+}// boost
+
+#endif // BOOST_ASSIGN_V2_DETAIL_TRAITS_VALUE_CONTAINER_FWD_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_push.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_push.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,54 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_PUSH_ER_2010_HPP
+#define BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_PUSH_ER_2010_HPP
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+namespace value_container_aux{
+
+ template<typename C, typename T = typename C::value_type>
+ struct has_push{
+
+ typedef typename boost::type_traits::yes_type yes_;
+ typedef typename boost::type_traits::no_type no_;
+
+ template<typename U,void (U::*fp)(T const&)>
+ struct helper{
+ // See http://lists.boost.org/Archives/boost/2002/03/27233.php
+ };
+
+ template<typename U>
+ static yes_ test(U*, helper<U, &U::push>* p = 0);
+ static no_ test(...);
+
+ BOOST_STATIC_CONSTANT(
+ bool,
+ value = sizeof( test((C*)0) ) == sizeof( yes_ )
+ );
+
+ typedef ::boost::mpl::bool_<value> type;
+
+ };
+
+ template<typename C>
+ struct has_push_deduced_value : has_push<C>{};
+
+}// value_container_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_PUSH_ER_2010_HPP
Added: sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_value_type.hpp
==============================================================================
--- (empty file)
+++ sandbox/assign_v2/boost/assign/v2/detail/traits/value_container/has_value_type.hpp 2011-03-17 21:56:05 EDT (Thu, 17 Mar 2011)
@@ -0,0 +1,45 @@
+//////////////////////////////////////////////////////////////////////////////
+// Boost.Assign v2 //
+// //
+// Copyright (C) 2003-2004 Thorsten Ottosen //
+// Copyright (C) 2010 Erwann Rogard //
+// Use, modification and distribution are subject to 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) //
+//////////////////////////////////////////////////////////////////////////////
+#ifndef BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_VALUE_TYPE_ER_2010_HPP
+#define BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_VALUE_TYPE_ER_2010_HPP
+#include <boost/config.hpp>
+#include <boost/mpl/bool.hpp>
+#include <boost/type_traits/detail/yes_no_type.hpp>
+
+namespace boost{
+namespace assign{
+namespace v2{
+namespace value_container_aux{
+
+ template<typename T>
+ struct has_value_type{
+
+ typedef typename boost::type_traits::yes_type yes_;
+ typedef typename boost::type_traits::no_type no_;
+
+
+ template<typename U>
+ static yes_ test(U*, typename U::value_type* p = 0);
+ static no_ test(...);
+
+ BOOST_STATIC_CONSTANT(
+ bool,
+ value = sizeof( test((T*)0) ) == sizeof( yes_ )
+ );
+ typedef ::boost::mpl::bool_<value> type;
+ };
+
+
+}// value_container_aux
+}// v2
+}// assign
+}// boost
+
+#endif // BOOST_ASSIGN_V2_TRAITS_VALUE_CONTAINER_HAS_VALUE_TYPE_ER_2010_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