Boost logo

Boost-Commit :

From: chochlik_at_[hidden]
Date: 2008-07-07 08:46:47


Author: matus.chochlik
Date: 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
New Revision: 47183
URL: http://svn.boost.org/trac/boost/changeset/47183

Log:
- Fixed template name builders
- Added meta_type for ::std::less
- Template class names for std::map and ::std::set are now build also with the comparator argument

Added:
   sandbox/mirror/boost/mirror/detail/argument_type_list.hpp (contents, props changed)
   sandbox/mirror/boost/mirror/meta_types/std_less.hpp (contents, props changed)
Text files modified:
   sandbox/mirror/boost/mirror/detail/decorated_type_name.hpp | 31 +++---
   sandbox/mirror/boost/mirror/detail/function_type_name.hpp | 81 -----------------
   sandbox/mirror/boost/mirror/detail/meta_type_registering.hpp | 14 ++-
   sandbox/mirror/boost/mirror/detail/template_name.hpp | 176 +++++++++------------------------------
   sandbox/mirror/boost/mirror/detail/traversal.hpp | 4
   sandbox/mirror/boost/mirror/meta_classes/boost_tuple.hpp | 3
   sandbox/mirror/boost/mirror/meta_namespaces/boost_tuples.hpp | 2
   sandbox/mirror/boost/mirror/meta_types/boost_tuple.hpp | 13 +-
   sandbox/mirror/boost/mirror/meta_types/std_list.hpp | 9 -
   sandbox/mirror/boost/mirror/meta_types/std_map.hpp | 12 -
   sandbox/mirror/boost/mirror/meta_types/std_pair.hpp | 9 -
   sandbox/mirror/boost/mirror/meta_types/std_set.hpp | 12 -
   sandbox/mirror/boost/mirror/meta_types/std_slist.hpp | 10 -
   sandbox/mirror/boost/mirror/meta_types/std_vector.hpp | 9 -
   sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml | 3
   sandbox/mirror/libs/mirror/example/algorithms/begin_end.cpp | 2
   sandbox/mirror/libs/mirror/example/registering/virtual_bases.cpp | 22 ++--
   sandbox/mirror/libs/mirror/example/serialization/cube.cpp | 12 +-
   sandbox/mirror/libs/mirror/example/special/boost_tuple.cpp | 19 ++--
   sandbox/mirror/libs/mirror/example/special/std_pair.cpp | 5
   sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp | 20 ++--
   sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp | 22 ++--
   22 files changed, 147 insertions(+), 343 deletions(-)

Added: sandbox/mirror/boost/mirror/detail/argument_type_list.hpp
==============================================================================
--- (empty file)
+++ sandbox/mirror/boost/mirror/detail/argument_type_list.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -0,0 +1,145 @@
+/**
+ * \file boost/mirror/detail/argument_type_list.hpp
+ *
+ * Helpers for composing function and template arg lists
+ *
+ * Copyright 2008 Matus Chochlik. 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)
+ */
+
+#ifndef BOOST_MIRROR_META_DETAIL_ARGUMENT_TYPE_LIST_HPP
+#define BOOST_MIRROR_META_DETAIL_ARGUMENT_TYPE_LIST_HPP
+
+#include <boost/mpl/for_each.hpp>
+#include <boost/mpl/pop_back.hpp>
+#include <boost/mpl/back.hpp>
+#include <boost/mpl/transform.hpp>
+#include <boost/mpl/identity.hpp>
+#include <boost/mpl/remove_if.hpp>
+//
+#include <boost/mirror/meta_data_fwd.hpp>
+#include <boost/mirror/detail/decorated_type_name.hpp>
+
+namespace boost {
+namespace mirror {
+namespace detail {
+
+/** template meta-function that can be used to distinguish "null"
+ * template param types
+ */
+template <typename T>
+struct is_typelist_null_type : ::boost::false_type { };
+
+template <typename ArgTypeList>
+struct template_args_type_list_wo_nulls
+{
+ typedef typename ::boost::mpl::remove_if<
+ ArgTypeList,
+ is_typelist_null_type<::boost::mpl::_>
+ >::type type;
+};
+
+/** Helper class implementing a function that can be used
+ * to append the list of type names to the given string.
+ */
+struct argument_type_list_builder
+{
+private:
+ template <typename T>
+ struct to_identity
+ {
+ typedef mpl::identity<T> type;
+ };
+
+ template <class FullOrBase>
+ class append_arg_typename
+ {
+ public:
+ template <typename T>
+ inline void operator()(::boost::mpl::identity<T>)
+ {
+ static bstring comma(BOOST_STR_LIT(", "));
+ list.append(BOOST_MIRRORED_TYPE(T)::get_name(FullOrBase()));
+ list.append(comma);
+ }
+
+ inline append_arg_typename(bstring& _list)
+ : list(_list)
+ { }
+ private:
+ bstring& list;
+ };
+
+ template <typename ArgTypeList, class FullOrBase, class Size>
+ static void do_append_args(
+ ArgTypeList*,
+ bstring& str,
+ FullOrBase full_or_base,
+ Size
+ )
+ {
+ // append type names and a comma for all
+ // arguments bar the last
+ //
+ // transform the typelist
+ typedef typename mpl::transform<
+ typename mpl::pop_back<
+ ArgTypeList
+ >::type,
+ to_identity<mpl::_>
+ >:: type args_wo_last;
+ //
+ // call the functor
+ ::boost::mpl::for_each<
+ args_wo_last
+ >(append_arg_typename<FullOrBase>(str));
+ //
+ // append the last argument
+ typedef mpl::back<ArgTypeList>::type last_arg_type;
+ str.append(BOOST_MIRRORED_TYPE(last_arg_type)::get_name(full_or_base));
+ }
+
+ // overload for empty argument list
+ template <typename ArgTypeList, class FullOrBase>
+ inline static void do_append_args(
+ ArgTypeList*,
+ bstring& str,
+ FullOrBase,
+ mpl::int_<0>
+ )
+ { }
+protected:
+ template <typename ArgTypeList, class FullOrBase>
+ inline static void append_args(
+ ArgTypeList*,
+ bstring& str,
+ FullOrBase full_or_base
+ )
+ {
+ // remove "null" types from the typelist
+ typedef typename template_args_type_list_wo_nulls<
+ ArgTypeList
+ >::type arg_type_list;
+ arg_type_list* atlp(0);
+ //
+ // calculate the size
+ typename ::boost::mpl::int_<
+ ::boost::mpl::size<arg_type_list>::value
+ >::type size;
+ //
+ do_append_args(
+ atlp,
+ str,
+ full_or_base,
+ size
+ );
+ }
+};
+
+} // namespace detail
+} // namespace mirror
+} // namespace boost
+
+#endif //include guard
+

Modified: sandbox/mirror/boost/mirror/detail/decorated_type_name.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/decorated_type_name.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/decorated_type_name.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -22,22 +22,6 @@
 template <class MetaType, class Decorator>
 struct decorated_type_name_base
 {
-protected:
- template <bool FullName>
- inline static bstring init_name(mpl::bool_<FullName> full_or_base)
- {
- bstring left;
- bstring right;
- bstring ex;
- bstring arg;
- bstring temp(build_name(full_or_base, left, right, ex, arg));
- left.append(temp);
- left.append(right);
- left.append(ex);
- left.append(arg);
- return left;
- }
-
 public:
         template <bool FullName>
         inline static bstring build_name(
@@ -64,6 +48,21 @@
 template <class Base>
 struct decorated_type_name_finisher : public Base
 {
+protected:
+ template <bool FullName>
+ inline static bstring init_name(mpl::bool_<FullName> full_or_base)
+ {
+ bstring left;
+ bstring right;
+ bstring ex;
+ bstring arg;
+ bstring temp(build_name(full_or_base, left, right, ex, arg));
+ left.append(temp);
+ left.append(right);
+ left.append(ex);
+ left.append(arg);
+ return left;
+ }
 public:
         template <bool FullName>
         static const bstring& get_name(mpl::bool_<FullName> full_or_base)

Modified: sandbox/mirror/boost/mirror/detail/function_type_name.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/function_type_name.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/function_type_name.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -19,94 +19,21 @@
 //
 #include <boost/mirror/meta_data_fwd.hpp>
 #include <boost/mirror/detail/decorated_type_name.hpp>
+#include <boost/mirror/detail/argument_type_list.hpp>
 
 namespace boost {
 namespace mirror {
 namespace detail {
 
+/** Function type name builder
+ */
 template <
         typename RetValType,
         typename CallingConvention,
         typename ArgTypeList
>
-struct function_type_name_base
+struct function_type_name_base : argument_type_list_builder
 {
-private:
- template <class FullOrBase>
- class append_arg_typename
- {
- public:
- template <typename T>
- inline void operator()(::boost::mpl::identity<T>)
- {
- static bstring comma(BOOST_STR_LIT(", "));
- list.append(BOOST_MIRRORED_TYPE(T)::get_name(FullOrBase()));
- list.append(comma);
- }
-
- inline append_arg_typename(bstring& _list)
- : list(_list)
- { }
- private:
- bstring& list;
- };
-
- template <typename T>
- struct to_identity
- {
- typedef mpl::identity<T> type;
- };
-
- template <typename TypeList, class FullOrBase>
- inline static void append_args(
- TypeList*,
- bstring& str,
- FullOrBase full_or_base
- )
- {
- // append type names and a comma for all
- // arguments bar the last
- //
- // transform the typelist
- typedef typename mpl::transform<
- typename mpl::pop_back<
- ArgTypeList
- >::type,
- to_identity<mpl::_>
- >:: type args_wo_last;
- //
- // call the functor
- ::boost::mpl::for_each<
- args_wo_last
- >(append_arg_typename<FullOrBase>(str));
- //
- // append the last argument
- typedef mpl::back<TypeList>::type last_arg_type;
- str.append(BOOST_MIRRORED_TYPE(last_arg_type)::get_name(full_or_base));
- }
-
- // overload for empty argument list
- template <class FullOrBase>
- inline static void append_args(mpl::vector<>*, bstring& str, FullOrBase)
- {
- str.append(bstring(BOOST_STR_LIT("void")));
- }
-
-protected:
- template <bool FullName>
- inline static bstring init_name(mpl::bool_<FullName> full_or_base)
- {
- bstring left;
- bstring right;
- bstring ex;
- bstring arg;
- bstring temp(build_name(full_or_base, left, right, ex, arg));
- left.append(temp);
- left.append(right);
- left.append(ex);
- left.append(arg);
- return left;
- }
 public:
         template <bool FullName>
         inline static bstring build_name(

Modified: sandbox/mirror/boost/mirror/detail/meta_type_registering.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/meta_type_registering.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/meta_type_registering.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -43,16 +43,20 @@
         typedef typename base_info::reflected_type reflected_type;
 };
 
-/** Helper macro used to declare base-name getting functions
- * and base-name length static constants
- */
-#define BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME_HELPER(TYPE_NAME) \
+#define BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME(TYPE_NAME_STRING) \
         static const bstring& get_name(mpl::false_) \
         { \
- static bstring s_name(BOOST_STR_LIT(#TYPE_NAME)); \
+ static bstring s_name(BOOST_STR_LIT(TYPE_NAME_STRING)); \
                 return s_name; \
         }
 
+
+/** Helper macro used to declare base-name getting functions
+ * and base-name length static constants
+ */
+#define BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME_HELPER(TYPE_NAME) \
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME(#TYPE_NAME)
+
 /** Macro for registering global-scope types
  */
 #define BOOST_MIRROR_REG_TYPE_GLOBAL_SCOPE(BASE_NAME) \

Modified: sandbox/mirror/boost/mirror/detail/template_name.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/template_name.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/template_name.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -18,153 +18,59 @@
 #include <boost/mpl/at.hpp>
 #include <boost/mpl/remove_if.hpp>
 
-#include <boost/mirror/detail/nontrivial_type_name.hpp>
+#include <boost/mirror/detail/decorated_type_name.hpp>
+#include <boost/mirror/detail/argument_type_list.hpp>
 
 namespace boost {
 namespace mirror {
 namespace detail {
 
-/** The length is calculated assuming that the string is
- * going to be formatted like this:
- * template_name|< |T1|, |T2|, |...|Tn| > (without the
- * delimiting '|'s.
- */
-template <class TypeList, bool BaseName>
-struct static_template_name_length
-{
- template <typename Type>
- struct get_type_name_length_type
- {
- typedef BOOST_MIRROR_REFLECT_TYPE(Type) MetaType;
-
- typedef nontrivial_type_base_or_full_name<MetaType, BaseName>
- name_info;
-
- typedef typename mpl::int_<
- name_info::name_length
- > type;
- };
-
- typedef typename mpl::accumulate<
- TypeList,
- mpl::int_<2>,
- mpl::plus<
- mpl::_1,
- mpl::plus<
- get_type_name_length_type<mpl::_2>,
- mpl::int_<2>
- >
- >
- >::type type;
-};
-
-/** Specializations of this template
- */
-
-template <typename Type>
-struct is_typelist_null_type : ::boost::false_type { };
-
-template <class FullTypeList>
-struct template_with_null_args_type_list
+template <class Scope, class BaseMetaObject, class TplArgTypeList>
+struct static_template_name_base : argument_type_list_builder
 {
- /** A TypeList that contains all types from full_type_list
- * except those that are typelist_null_types
- */
- typedef typename mpl::remove_if<
- FullTypeList,
- is_typelist_null_type<mpl::_1>
- >::type type;
-};
-
-template <class MetaType, class FullTypeList, bool BaseName>
-struct static_template_name_base
-{
-protected:
- typedef typename template_with_null_args_type_list<
- FullTypeList
- >::type TypeList;
-
- /** The 'position' of the last type in the template
- * type list.
- */
- typedef typename mpl::int_<
- mpl::size< TypeList >::value - 1
- > last_type_pos;
-
- template <int I>
- static bchar* do_append_type_name(bchar* cur_pos, mpl::int_<I>)
+private:
+ typedef full_name_builder<
+ Scope,
+ BaseMetaObject
+ > base_meta_template;
+
+
+public:
+ template <bool FullName>
+ inline static bstring build_name(
+ mpl::bool_<FullName> full_or_base,
+ bstring& left,
+ bstring& right,
+ bstring& ex,
+ bstring& arg
+ )
         {
- typedef typename mpl::at<TypeList, mpl::int_<I> >::type type;
- typedef BOOST_MIRROR_REFLECT_TYPE(type) MetaType;
- typedef nontrivial_type_base_or_full_name<MetaType, BaseName>
- local_name_info;
- bstrcpy(cur_pos, local_name_info::name());
- cur_pos += local_name_info::name_length;
- return cur_pos;
- }
-
- static bchar* append_type_name(bchar* cur_pos, mpl::int_<0> type_pos)
- {
- return do_append_type_name(cur_pos, type_pos);
- }
-
- template <int I>
- static bchar* append_type_name(bchar* cur_pos, mpl::int_<I> type_pos)
- {
- cur_pos = append_type_name(cur_pos, mpl::int_<I - 1>());
- bstrcpy(cur_pos, BOOST_STR_LIT(", "));
- cur_pos += 2;
- return do_append_type_name(cur_pos, type_pos);
- }
-
- typedef nontrivial_type_base_or_full_name<MetaType, BaseName>
- name_info;
-
- typedef typename static_template_name_length<TypeList, BaseName>::type
- template_param_list_length_type;
-
- BOOST_STATIC_CONSTANT(
- size_t,
- difference =
- template_param_list_length_type::value
- );
-
- BOOST_STATIC_CONSTANT(
- size_t,
- name_length =
- name_info::name_length + difference
- );
-
- static void init_name(bchar* the_name)
- {
- bchar* cur_pos = the_name;
+ static bstring comma(BOOST_STR_LIT(", "));
+ static bstring l_angle(BOOST_STR_LIT("< "));
+ static bstring r_angle(BOOST_STR_LIT(" >"));
                 //
- // copy the name of the template
- bstrcpy(cur_pos, name_info::name());
- cur_pos += name_info::name_length;
+ // get the template name
+ bstring res(base_meta_template::get_name(full_or_base));
+ // argument list
+ res.append(l_angle);
+ append_args(((TplArgTypeList*)0), res, full_or_base);
+ res.append(r_angle);
                 //
- // append the leading "< "
- assert(cur_pos+2 < (the_name + name_length));
- bstrcpy(cur_pos, BOOST_STR_LIT("< "));
- cur_pos += 2;
- //
- // append the typenames
- cur_pos = append_type_name(cur_pos, last_type_pos());
- //
- // append the final " >"
- bstrcpy(cur_pos, BOOST_STR_LIT(" >"));
- cur_pos += 2;
- //
- // finalize the string
- assert(cur_pos == (the_name + name_length));
- *cur_pos = BOOST_STR_LIT('\0');
+ return res;
         }
+
 };
 
-template <class MetaType, class TypeList>
-struct static_template_name : static_nontrivial_type_name<
- MetaType, TypeList, static_template_name_base
->{ };
+/**
+ */
+template <class Scope, class BaseMetaObject, class TplArgTypeList>
+struct static_template_name
+: decorated_type_name_finisher<
+ static_template_name_base<Scope, BaseMetaObject, TplArgTypeList>
+>
+{
+ typedef Scope scope;
+};
 
 
 } // namespace detail

Modified: sandbox/mirror/boost/mirror/detail/traversal.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/detail/traversal.hpp (original)
+++ sandbox/mirror/boost/mirror/detail/traversal.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -121,7 +121,7 @@
                                 //
                                 // traverse the attribute
                                 TraversalType<
- BOOST_MIRROR_REFLECT_CLASS(attrib_type),
+ BOOST_MIRRORED_CLASS(attrib_type),
                                         typename mpl::push_back<
                                                 AttribsNodePath,
                                                 MetaAttribute
@@ -158,7 +158,7 @@
                                 // traverse the attributes
                                 typedef typename MetaAttribute::type attrib_type;
                                 TraversalType<
- BOOST_MIRROR_REFLECT_CLASS(attrib_type),
+ BOOST_MIRRORED_CLASS(attrib_type),
                                         typename mpl::push_back<
                                                 AttribsNodePath,
                                                 MetaAttribute

Modified: sandbox/mirror/boost/mirror/meta_classes/boost_tuple.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_classes/boost_tuple.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_classes/boost_tuple.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -24,8 +24,9 @@
         // the full list tuple template arguments
         // which is the list of types of it's member attributes
         typedef typename mpl::vector10< BOOST_PP_ENUM_PARAMS(10, T) > all_template_params;
+ //
         // the list of member attributes without the null types
- typedef typename detail::template_with_null_args_type_list<
+ typedef typename detail::template_args_type_list_wo_nulls<
                 all_template_params
>::type template_params;
         //

Modified: sandbox/mirror/boost/mirror/meta_namespaces/boost_tuples.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_namespaces/boost_tuples.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_namespaces/boost_tuples.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -15,7 +15,7 @@
 namespace boost {
 namespace mirror {
 
-BOOST_MIRROR_REG_NAMESPACE(_boost, tuples)
+BOOST_MIRROR_REG_NAMESPACE((boost)(tuples))
 
 } // namespace mirror
 } // namespace boost

Modified: sandbox/mirror/boost/mirror/meta_types/boost_tuple.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/boost_tuple.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/boost_tuple.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -13,6 +13,7 @@
 #include <boost/mirror/meta_type.hpp>
 #include <boost/mirror/detail/template_name.hpp>
 #include <boost/mirror/meta_namespaces/boost_tuples.hpp>
+//
 #include <boost/tuple/tuple.hpp>
 #include <boost/preprocessor/repetition/enum_params.hpp>
 
@@ -33,18 +34,14 @@
 BOOST_MIRROR_TMP_BOOST_TUPLE_TEMPL_DECL()
 struct meta_type_boost_tuple
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("tuple");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 5);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::boost::tuples::tuple");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 22);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("tuple")
 };
 
 
 // designate tuples::null_type as typelist null type
 template <>
-struct is_typelist_null_type< ::boost::tuples::null_type> : ::boost::true_type { };
+struct is_typelist_null_type< ::boost::tuples::null_type>
+ : ::boost::true_type { };
 
 
 } // namespace detail
@@ -55,6 +52,7 @@
         ::boost::tuples::tuple< BOOST_MIRROR_TMP_BOOST_TUPLE_TEMPL_ARG_NAMES() >
>
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::boost::tuples),
         detail::meta_type_boost_tuple<
                 BOOST_MIRROR_TMP_BOOST_TUPLE_TEMPL_ARG_NAMES()
>,
@@ -63,7 +61,6 @@
>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_boost_tuples) scope;
         typedef ::boost::tuples::tuple<
                 BOOST_MIRROR_TMP_BOOST_TUPLE_TEMPL_ARG_NAMES()
> reflected_type;

Added: sandbox/mirror/boost/mirror/meta_types/std_less.hpp
==============================================================================
--- (empty file)
+++ sandbox/mirror/boost/mirror/meta_types/std_less.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -0,0 +1,48 @@
+/**
+ * \file boost/mirror/meta_types/std_less.hpp
+ *
+ * Meta-type for std::less<T>
+ *
+ * Copyright 2008 Matus Chochlik. 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)
+ */
+
+#ifndef BOOST_MIRROR_META_TYPES_STD_LESS_HPP
+#define BOOST_MIRROR_META_TYPES_STD_LESS_HPP
+
+#include <boost/mirror/meta_type.hpp>
+#include <boost/mirror/detail/template_name.hpp>
+#include <functional>
+
+namespace boost {
+namespace mirror {
+
+namespace detail {
+
+template <typename >
+struct meta_type_std_less
+{
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("less")
+};
+
+} // namespace detail
+
+
+template <typename T>
+struct meta_type< ::std::less<T> >
+: detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
+ detail::meta_type_std_less<T> ,
+ mpl::vector1<T>
+>
+{
+ typedef ::std::less<T> reflected_type;
+};
+
+
+} // namespace mirror
+} // namespace boost
+
+#endif //include guard
+

Modified: sandbox/mirror/boost/mirror/meta_types/std_list.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_list.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_list.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -22,12 +22,7 @@
 template <typename T, class Allocator>
 struct meta_type_std_list
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("list");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 4);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::list");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 11);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("list")
 };
 
 } // namespace detail
@@ -36,11 +31,11 @@
 template <typename T, class Allocator>
 struct meta_type< ::std::list<T, Allocator> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_list<T, Allocator> ,
         mpl::vector1<T>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::list<T, Allocator> reflected_type;
 };
 

Modified: sandbox/mirror/boost/mirror/meta_types/std_map.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_map.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_map.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -12,6 +12,7 @@
 
 #include <boost/mirror/meta_type.hpp>
 #include <boost/mirror/detail/template_name.hpp>
+#include <boost/mirror/meta_types/std_less.hpp>
 #include <map>
 
 namespace boost {
@@ -22,12 +23,7 @@
 template <typename K, typename T, class Comp, class Allocator>
 struct meta_type_std_map
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("map");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 3);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::map");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 10);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("map")
 };
 
 } // namespace detail
@@ -36,11 +32,11 @@
 template <typename K, typename T, class Comp, class Allocator>
 struct meta_type< ::std::map<K, T, Comp, Allocator> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_map<K, T, Comp, Allocator> ,
- mpl::vector2<K, T> // TODO add Comp too
+ mpl::vector3<K, T, Comp>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::map<K, T, Comp, Allocator> reflected_type;
 };
 

Modified: sandbox/mirror/boost/mirror/meta_types/std_pair.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_pair.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_pair.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -23,12 +23,7 @@
 template <typename FirstType, typename SecondType>
 struct meta_type_std_pair
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("pair");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 4);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::pair");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 11);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("pair")
 };
 
 } // namespace detail
@@ -37,11 +32,11 @@
 template <typename FirstType, typename SecondType>
 struct meta_type< ::std::pair<FirstType, SecondType> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_pair<FirstType, SecondType> ,
         mpl::vector2<FirstType, SecondType>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::pair<FirstType, SecondType> reflected_type;
 };
 

Modified: sandbox/mirror/boost/mirror/meta_types/std_set.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_set.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_set.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -12,6 +12,7 @@
 
 #include <boost/mirror/meta_type.hpp>
 #include <boost/mirror/detail/template_name.hpp>
+#include <boost/mirror/meta_types/std_less.hpp>
 #include <set>
 
 namespace boost {
@@ -22,12 +23,7 @@
 template <typename K, class Comp, class Allocator>
 struct meta_type_std_set
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("set");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 3);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::set");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 10);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("set")
 };
 
 } // namespace detail
@@ -36,11 +32,11 @@
 template <typename K, class Comp, class Allocator>
 struct meta_type< ::std::set<K, Comp, Allocator> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_set<K, Comp, Allocator> ,
- mpl::vector1<K> // TODO add Comp too
+ mpl::vector2<K, Comp>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::set<K, Comp, Allocator> reflected_type;
 };
 

Modified: sandbox/mirror/boost/mirror/meta_types/std_slist.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_slist.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_slist.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -22,12 +22,7 @@
 template <typename T, class Allocator>
 struct meta_type_std_slist
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("slist");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 5);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::slist");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 12);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("slist")
 };
 
 } // namespace detail
@@ -36,15 +31,14 @@
 template <typename T, class Allocator>
 struct meta_type< ::std::slist<T, Allocator> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_slist<T, Allocator> ,
         mpl::vector1<T>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::slist<T, Allocator> reflected_type;
 };
 
-
 } // namespace mirror
 } // namespace boost
 

Modified: sandbox/mirror/boost/mirror/meta_types/std_vector.hpp
==============================================================================
--- sandbox/mirror/boost/mirror/meta_types/std_vector.hpp (original)
+++ sandbox/mirror/boost/mirror/meta_types/std_vector.hpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -22,12 +22,7 @@
 template <typename T, class Allocator>
 struct meta_type_std_vector
 {
-
- static const bchar* base_name(void){return BOOST_STR_LIT("vector");}
- BOOST_STATIC_CONSTANT(int, base_name_length = 6);
-
- static const bchar* full_name(void){return BOOST_STR_LIT("::std::vector");}
- BOOST_STATIC_CONSTANT(int, full_name_length = 13);
+ BOOST_MIRROR_REG_TYPE_DECLARE_BASE_NAME("vector")
 };
 
 } // namespace detail
@@ -36,11 +31,11 @@
 template <typename T, class Allocator>
 struct meta_type< ::std::vector<T, Allocator> >
 : detail::static_template_name<
+ BOOST_MIRRORED_NAMESPACE(::std),
         detail::meta_type_std_vector<T, Allocator> ,
         mpl::vector1<T>
>
 {
- typedef BOOST_MIRROR_REFLECT_NAMESPACE(_std) scope;
         typedef ::std::vector<T, Allocator> reflected_type;
 };
 

Modified: sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml
==============================================================================
--- sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml (original)
+++ sandbox/mirror/libs/mirror/doc/xml/mirror/_library.xml 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -262,6 +262,9 @@
                         - Added support for pointers to function pointers
                         - Added support for functions returning pointers to functions
                         - Added support for references to functions
+ - Fixed template name builders
+ - Added meta_type for ::std::less
+ - Template class names for std::map and ::std::set are now build also with the comparator argument
 
                         - Tested with MSVC++ 2008 EE On Vista
                 </revision>

Modified: sandbox/mirror/libs/mirror/example/algorithms/begin_end.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/algorithms/begin_end.cpp (original)
+++ sandbox/mirror/libs/mirror/example/algorithms/begin_end.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -65,7 +65,7 @@
         //
         typedef tuple<bool, unsigned char, char, wchar_t, short, int, long, float, double> T;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(T) meta_T;
+ typedef BOOST_MIRRORED_CLASS(T) meta_T;
         //
         //
         BOOST_STATIC_ASSERT((iterator_not_equal<

Modified: sandbox/mirror/libs/mirror/example/registering/virtual_bases.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/registering/virtual_bases.cpp (original)
+++ sandbox/mirror/libs/mirror/example/registering/virtual_bases.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -87,18 +87,18 @@
 
 /** Register the Test namespace
  */
-BOOST_MIRROR_REG_NAMESPACE_TOP_LEVEL(Test)
+BOOST_MIRROR_REG_NAMESPACE((Test))
 
 /** Register the types and classes
  */
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, A)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, B)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, C)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, D)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, E)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, F)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, G)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, H)
+BOOST_MIRROR_REG_TYPE(::Test, A)
+BOOST_MIRROR_REG_TYPE(::Test, B)
+BOOST_MIRROR_REG_TYPE(::Test, C)
+BOOST_MIRROR_REG_TYPE(::Test, D)
+BOOST_MIRROR_REG_TYPE(::Test, E)
+BOOST_MIRROR_REG_TYPE(::Test, F)
+BOOST_MIRROR_REG_TYPE(::Test, G)
+BOOST_MIRROR_REG_TYPE(::Test, H)
 
 
 BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::B)
@@ -180,7 +180,7 @@
                         using namespace ::std;
                         using namespace ::boost;
                         using namespace ::boost::mirror;
- typedef BOOST_MIRROR_REFLECT_TYPE(typename MetaAttribute::type) mt;
+ typedef BOOST_MIRRORED_TYPE(typename MetaAttribute::type) mt;
                         bcout <<
                                 " " <<
                                 MetaAttribute::position::value <<
@@ -203,7 +203,7 @@
         //
         typedef ::Test::H T;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(T) meta_T;
+ typedef BOOST_MIRRORED_CLASS(T) meta_T;
         //
         // Print some basic info about the reflected class
         //

Modified: sandbox/mirror/libs/mirror/example/serialization/cube.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/serialization/cube.cpp (original)
+++ sandbox/mirror/libs/mirror/example/serialization/cube.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -163,13 +163,13 @@
 
 /** Register the Graphics namespace
  */
-BOOST_MIRROR_REG_NAMESPACE_TOP_LEVEL(Graphics)
+BOOST_MIRROR_REG_NAMESPACE((Graphics))
 
 /** Register the types and classes
  */
-BOOST_MIRROR_REG_TYPE(_Graphics, ::Graphics, Coords)
-BOOST_MIRROR_REG_TYPE(_Graphics, ::Graphics, Vector)
-BOOST_MIRROR_REG_TYPE(_Graphics, ::Graphics, Cube)
+BOOST_MIRROR_REG_TYPE(::Graphics, Coords)
+BOOST_MIRROR_REG_TYPE(::Graphics, Vector)
+BOOST_MIRROR_REG_TYPE(::Graphics, Cube)
 
 
 BOOST_MIRROR_REG_SINGLE_BASE_CLASS(
@@ -309,7 +309,7 @@
 template<class Archive, class Class>
 void do_load(Archive & ar, Class & c)
 {
- typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
+ typedef BOOST_MIRRORED_CLASS(Class) meta_Class;
         typedef mpl::int_<meta_Class::all_attributes::size::value - 1> last;
         single_attrib_loader<meta_Class, last>(ar, c);
 }
@@ -373,7 +373,7 @@
 template<class Archive, class Class>
 void do_save(Archive & ar, Class & c)
 {
- typedef BOOST_MIRROR_REFLECT_CLASS(Class) meta_Class;
+ typedef BOOST_MIRRORED_CLASS(Class) meta_Class;
         typedef mpl::int_<meta_Class::all_attributes::size::value - 1> last;
         single_attrib_saver<meta_Class, last>(ar, c);
 }

Modified: sandbox/mirror/libs/mirror/example/special/boost_tuple.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/special/boost_tuple.cpp (original)
+++ sandbox/mirror/libs/mirror/example/special/boost_tuple.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -70,9 +70,12 @@
         using namespace ::boost;
         using namespace ::boost::mirror;
         //
- // hold on to yer butts ;)
- typedef tuple<int, double, const string*> T1;
- typedef tuple<const bool, volatile float, void * const, char> T2;
+ typedef int (*A)(double);
+ typedef A (*B)(string);
+ typedef B (C)(char, wchar_t);
+ typedef A D[2][3];
+ typedef tuple<int, double, const string *> T1;
+ typedef tuple<const A, volatile B, C&, D> T2;
         typedef pair<T1, T2> T3;
         typedef tuple<void*, const wstring& , const string&> T4;
         typedef tuple<char, wchar_t, short int const> T5;
@@ -80,21 +83,17 @@
         typedef vector<tuple<T1, T2, T3, T4, T5, T6> > T7;
         typedef set<map<list<T1>, T7> > T;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(T) meta_T;
+ typedef BOOST_MIRRORED_CLASS(T) meta_T;
         //
         //
- bcout << "The type name length = " << meta_T::base_name_length << " characters" << endl;
         bcout << "---------------------------------------------------" << endl;
         bcout << "The type name is: "<< meta_T::base_name() << endl;
         bcout << "---------------------------------------------------" << endl;
- bcout << "The full type name length = " << meta_T::full_name_length << " characters" << endl;
- bcout << "---------------------------------------------------" << endl;
         bcout << "The full type name is: "<< meta_T::full_name() << endl;
         bcout << "---------------------------------------------------" << endl;
         //
         T1 t1(12, 34.56, 0);
- typedef BOOST_MIRROR_REFLECT_CLASS(T1) meta_T1;
- bcout << "The full type name length = " << meta_T1::full_name_length << " characters" << endl;
+ typedef BOOST_MIRRORED_CLASS(T1) meta_T1;
         bcout << "---------------------------------------------------" << endl;
         bcout << "The full type name is: "<< meta_T1::full_name() << endl;
         bcout << "---------------------------------------------------" << endl;
@@ -116,7 +115,7 @@
         //
         //
         tuple<int, int, int, int, int, int, int, int, int, int> x(0,1,2,3,4,5,6,7,8,9);
- typedef BOOST_MIRROR_REFLECT_CLASS(BOOST_TYPEOF(x)) meta_X;
+ typedef BOOST_MIRRORED_CLASS(BOOST_TYPEOF(x)) meta_X;
         attrib_value_printer<meta_X::reflected_type> p(x);
         //
         bcout << "The type name is: "<< meta_X::base_name() << endl;

Modified: sandbox/mirror/libs/mirror/example/special/std_pair.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/special/std_pair.cpp (original)
+++ sandbox/mirror/libs/mirror/example/special/std_pair.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -33,14 +33,11 @@
         typedef pair<T2, T1 volatile> T4;
         typedef pair<T3 const * volatile *, const T4&> T;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(T) meta_T;
+ typedef BOOST_MIRRORED_CLASS(T) meta_T;
         //
- bcout << "The type name length = " << meta_T::base_name_length << " characters" << endl;
         bcout << "---------------------------------------------------" << endl;
         bcout << "The type name is: "<< meta_T::base_name() << endl;
         bcout << "---------------------------------------------------" << endl;
- bcout << "The full type name length = " << meta_T::full_name_length << " characters" << endl;
- bcout << "---------------------------------------------------" << endl;
         bcout << "The full type name is: "<< meta_T::full_name() << endl;
         bcout << "---------------------------------------------------" << endl;
         bcout << "The class has "<< meta_T::all_attributes::size::value << " members" << endl;

Modified: sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp (original)
+++ sandbox/mirror/libs/mirror/example/traversal/sample_meta_path.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -81,18 +81,18 @@
 
 /** Register the Test namespace
  */
-BOOST_MIRROR_REG_NAMESPACE_TOP_LEVEL(Test)
+BOOST_MIRROR_REG_NAMESPACE((Test))
 
 /** Register the types and classes
  */
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, A)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, B)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, C)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, D)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, E)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, F)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, G)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, H)
+BOOST_MIRROR_REG_TYPE(::Test, A)
+BOOST_MIRROR_REG_TYPE(::Test, B)
+BOOST_MIRROR_REG_TYPE(::Test, C)
+BOOST_MIRROR_REG_TYPE(::Test, D)
+BOOST_MIRROR_REG_TYPE(::Test, E)
+BOOST_MIRROR_REG_TYPE(::Test, F)
+BOOST_MIRROR_REG_TYPE(::Test, G)
+BOOST_MIRROR_REG_TYPE(::Test, H)
 
 
 BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::B)
@@ -173,7 +173,7 @@
         //
         using namespace ::Test;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(H) meta_H;
+ typedef BOOST_MIRRORED_CLASS(H) meta_H;
         //
         bcout << "--------------------------------------------" << endl;
         deep_traversal_of<meta_H>::accept(meta_path_sample_visitor());

Modified: sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp
==============================================================================
--- sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp (original)
+++ sandbox/mirror/libs/mirror/example/traversal/sample_visitor.cpp 2008-07-07 08:46:44 EDT (Mon, 07 Jul 2008)
@@ -81,18 +81,18 @@
 
 /** Register the Test namespace
  */
-BOOST_MIRROR_REG_NAMESPACE_TOP_LEVEL(Test)
+BOOST_MIRROR_REG_NAMESPACE((Test))
 
 /** Register the types and classes
  */
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, A)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, B)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, C)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, D)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, E)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, F)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, G)
-BOOST_MIRROR_REG_TYPE(_Test, ::Test, H)
+BOOST_MIRROR_REG_TYPE(::Test, A)
+BOOST_MIRROR_REG_TYPE(::Test, B)
+BOOST_MIRROR_REG_TYPE(::Test, C)
+BOOST_MIRROR_REG_TYPE(::Test, D)
+BOOST_MIRROR_REG_TYPE(::Test, E)
+BOOST_MIRROR_REG_TYPE(::Test, F)
+BOOST_MIRROR_REG_TYPE(::Test, G)
+BOOST_MIRROR_REG_TYPE(::Test, H)
 
 
 BOOST_MIRROR_REG_BASE_CLASSES_BEGIN(::Test::B)
@@ -173,7 +173,7 @@
         //
         using namespace ::Test;
         //
- typedef BOOST_MIRROR_REFLECT_CLASS(H) meta_H;
+ typedef BOOST_MIRRORED_CLASS(H) meta_H;
         H h;
         h.l = 1234567890;
         h.i = 123;
@@ -199,7 +199,7 @@
         typedef pair<T3, T4> T6;
         typedef pair<T5, T6> T7;
         typedef tuple<T1, T2, T3, T4, T5, T6, T7> T;
- typedef BOOST_MIRROR_REFLECT_CLASS(T) meta_T;
+ typedef BOOST_MIRRORED_CLASS(T) meta_T;
         //
         //
         bcout << "--------------------------------------------" << endl;


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