[pkg-boost-commits] r14044 - in boost/trunk: . boost boost/date_time boost/date_time/gregorian boost/date_time/posix_time boost/iterator boost/multi_index boost/multi_index/detail boost/numeric/interval boost/numeric/interval/detail boost/optional boost/preprocessor/config boost/regex boost/regex/v4 boost/test boost/wave boost/xpressive/detail/utility debian libs/compatibility libs/config libs/date_time/test/posix_time libs/date_time/xmldoc libs/functional/hash/test libs/graph/doc libs/integer/test libs/iostreams/build libs/iterator/test libs/multi_array/test libs/multi_index/doc/tutorial libs/numeric/conversion/doc libs/optional/doc libs/optional/test libs/parameter/test libs/python/build libs/python/src libs/python/test libs/range/test libs/regex/test/c_compiler_checks libs/regex/test/regress libs/spirit/fusion/test libs/test/example libs/wave/doc more/whos_using status tools/build/v2 tools/build/v2/build tools/build/v2/doc tools/build/v2/tools tools/build/v2/util

Domenico Andreoli cavok at alioth.debian.org
Mon Mar 26 22:47:37 CET 2007


Author: cavok
Date: 2007-03-26 21:47:29 +0000 (Mon, 26 Mar 2007)
New Revision: 14044

Added:
   boost/trunk/libs/python/test/import_.cpp
   boost/trunk/libs/python/test/import_.py
Removed:
   boost/trunk/boost/none_t.hpp
   boost/trunk/libs/optional/test/optional_test_ref_fail2.cpp
Modified:
   boost/trunk/boost/date_time/dst_rules.hpp
   boost/trunk/boost/date_time/gregorian/greg_serialize.hpp
   boost/trunk/boost/date_time/local_timezone_defs.hpp
   boost/trunk/boost/date_time/posix_time/time_serialize.hpp
   boost/trunk/boost/date_time/time_zone_base.hpp
   boost/trunk/boost/foreach.hpp
   boost/trunk/boost/iterator/new_iterator_tests.hpp
   boost/trunk/boost/multi_index/detail/ord_index_node.hpp
   boost/trunk/boost/multi_index/hashed_index.hpp
   boost/trunk/boost/multi_index/ordered_index.hpp
   boost/trunk/boost/multi_index/random_access_index.hpp
   boost/trunk/boost/multi_index/sequenced_index.hpp
   boost/trunk/boost/multi_index_container.hpp
   boost/trunk/boost/none.hpp
   boost/trunk/boost/numeric/interval/detail/msvc_rounding_control.hpp
   boost/trunk/boost/numeric/interval/hw_rounding.hpp
   boost/trunk/boost/optional/optional.hpp
   boost/trunk/boost/preprocessor/config/config.hpp
   boost/trunk/boost/regex/concepts.hpp
   boost/trunk/boost/regex/v4/regex_traits.hpp
   boost/trunk/boost/test/test_tools.hpp
   boost/trunk/boost/wave/cpp_context.hpp
   boost/trunk/boost/xpressive/detail/utility/boyer_moore.hpp
   boost/trunk/debian/changelog
   boost/trunk/index.htm
   boost/trunk/libs/compatibility/index.html
   boost/trunk/libs/config/config.htm
   boost/trunk/libs/date_time/test/posix_time/testdst_rules.cpp
   boost/trunk/libs/date_time/test/posix_time/testlocal_adjustor.cpp
   boost/trunk/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
   boost/trunk/libs/date_time/xmldoc/changes.xml
   boost/trunk/libs/functional/hash/test/hash_float_test.cpp
   boost/trunk/libs/graph/doc/eg1-iso.cpp
   boost/trunk/libs/integer/test/integer_mask_test.cpp
   boost/trunk/libs/integer/test/static_log2_test.cpp
   boost/trunk/libs/integer/test/static_min_max_test.cpp
   boost/trunk/libs/iostreams/build/Jamfile.v2
   boost/trunk/libs/iterator/test/filter_iterator_test.cpp
   boost/trunk/libs/iterator/test/iterator_facade.cpp
   boost/trunk/libs/iterator/test/reverse_iterator_test.cpp
   boost/trunk/libs/iterator/test/transform_iterator_test.cpp
   boost/trunk/libs/multi_array/test/storage_order_convert.cpp
   boost/trunk/libs/multi_index/doc/tutorial/creation.html
   boost/trunk/libs/numeric/conversion/doc/conversion_traits.html
   boost/trunk/libs/numeric/conversion/doc/converter.html
   boost/trunk/libs/numeric/conversion/doc/numeric_cast.html
   boost/trunk/libs/optional/doc/optional.html
   boost/trunk/libs/optional/test/Jamfile.v2
   boost/trunk/libs/optional/test/optional_test.cpp
   boost/trunk/libs/optional/test/optional_test_ref.cpp
   boost/trunk/libs/parameter/test/sfinae.cpp
   boost/trunk/libs/python/build/Jamfile.v2
   boost/trunk/libs/python/src/import.cpp
   boost/trunk/libs/python/test/Jamfile.v2
   boost/trunk/libs/python/test/dict.cpp
   boost/trunk/libs/python/test/str.cpp
   boost/trunk/libs/python/test/test_builtin_converters.cpp
   boost/trunk/libs/python/test/test_builtin_converters.py
   boost/trunk/libs/python/test/virtual_functions.cpp
   boost/trunk/libs/range/test/sub_range.cpp
   boost/trunk/libs/regex/test/c_compiler_checks/posix_api_check.cpp
   boost/trunk/libs/regex/test/regress/main.cpp
   boost/trunk/libs/spirit/fusion/test/pair_tests.cpp
   boost/trunk/libs/test/example/unit_test_example_01.cpp
   boost/trunk/libs/wave/doc/class_reference_context.html
   boost/trunk/more/whos_using/using.qbk
   boost/trunk/status/explicit-failures-markup.xml
   boost/trunk/tools/build/v2/build-system.jam
   boost/trunk/tools/build/v2/build/feature.jam
   boost/trunk/tools/build/v2/build/generators.jam
   boost/trunk/tools/build/v2/build/property-set.jam
   boost/trunk/tools/build/v2/build/type.jam
   boost/trunk/tools/build/v2/doc/tools.html
   boost/trunk/tools/build/v2/tools/builtin.jam
   boost/trunk/tools/build/v2/tools/common.jam
   boost/trunk/tools/build/v2/tools/darwin.jam
   boost/trunk/tools/build/v2/tools/gcc.jam
   boost/trunk/tools/build/v2/tools/msvc.jam
   boost/trunk/tools/build/v2/tools/python.jam
   boost/trunk/tools/build/v2/tools/testing.jam
   boost/trunk/tools/build/v2/util/os.jam
   boost/trunk/tools/build/v2/util/sequence.jam
Log:
successfully merged with upstream cvs snapshot 20070326

Modified: boost/trunk/boost/date_time/dst_rules.hpp
===================================================================
--- boost/trunk/boost/date_time/dst_rules.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/date_time/dst_rules.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,12 +1,12 @@
 #ifndef DATE_TIME_DST_RULES_HPP__
 #define DATE_TIME_DST_RULES_HPP__
 
-/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
+/* Copyright (c) 2002,2003, 2007 CrystalClear Software, Inc.
  * Use, modification and distribution is subject to the 
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2004/10/02 18:49:16 $
+ * $Date: 2007/03/02 01:54:49 $
  */
 
 /*! @file dst_rules.hpp
@@ -251,18 +251,12 @@
 
       static date_type local_dst_start_day(year_type year)
       {
-        typedef typename dst_traits::start_rule_functor start_rule;
-        start_rule start(dst_traits::start_day(), 
-                         dst_traits::start_month());
-        return start.get_date(year);      
+        return dst_traits::local_dst_start_day(year);      
       }
 
       static date_type local_dst_end_day(year_type year)
       {
-        typedef typename dst_traits::end_rule_functor end_rule;
-        end_rule end(dst_traits::end_day(), 
-                     dst_traits::end_month());
-        return end.get_date(year);      
+        return dst_traits::local_dst_end_day(year);
       }
 
 
@@ -270,6 +264,8 @@
 
     //! Depricated: Class to calculate dst boundaries for US time zones
     /* Use dst_calc_engine instead.
+     * In 2007 US/Canada DST rules changed
+     * (http://en.wikipedia.org/wiki/Energy_Policy_Act_of_2005#Change_to_daylight_saving_time).
      */
     template<class date_type_, 
              class time_duration_type_,
@@ -284,6 +280,7 @@
       typedef typename date_type::calendar_type calendar_type;
       typedef date_time::last_kday_of_month<date_type> lkday;
       typedef date_time::first_kday_of_month<date_type> fkday;
+      typedef date_time::nth_kday_of_month<date_type> nkday;
       typedef dst_calculator<date_type, time_duration_type> dstcalc;
 
       //! Calculates if the given local time is dst or not
@@ -315,16 +312,28 @@
 
       static date_type local_dst_start_day(year_type year)
       {
-        //first sunday in april
-        fkday fsia(Sunday, gregorian::Apr);
-        return fsia.get_date(year);      
+        if (year >= year_type(2007)) {
+          //second sunday in march
+          nkday ssim(nkday::second, Sunday, gregorian::Mar);
+          return ssim.get_date(year);      
+        } else {
+          //first sunday in april
+          fkday fsia(Sunday, gregorian::Apr);
+          return fsia.get_date(year);      
+        }
       }
 
       static date_type local_dst_end_day(year_type year)
       {
-        //last sunday in october
-        lkday lsio(Sunday, gregorian::Oct);
-        return lsio.get_date(year);
+        if (year >= year_type(2007)) {
+          //first sunday in november
+          fkday fsin(Sunday, gregorian::Nov);
+          return fsin.get_date(year);      
+        } else {
+          //last sunday in october
+          lkday lsio(Sunday, gregorian::Oct);
+          return lsio.get_date(year);
+        }
       }
 
       static time_duration_type dst_offset()
@@ -332,7 +341,9 @@
         return time_duration_type(0,dst_length_minutes,0);
       }
 
+     private:
 
+
     };
 
     //! Used for local time adjustments in places that don't use dst

Modified: boost/trunk/boost/date_time/gregorian/greg_serialize.hpp
===================================================================
--- boost/trunk/boost/date_time/gregorian/greg_serialize.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/date_time/gregorian/greg_serialize.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2005/06/21 03:33:14 $
+ * $Date: 2007/03/02 02:45:57 $
  */
 
 #include "boost/date_time/gregorian/gregorian_types.hpp"
@@ -52,7 +52,7 @@
 template<class Archive>
 void save(Archive & ar, 
           const ::boost::gregorian::date & d, 
-          unsigned int version)
+          unsigned int /* version */)
 {
   std::string ds = to_iso_string(d);
   ar & make_nvp("date", ds);
@@ -66,7 +66,7 @@
 template<class Archive>
 void load(Archive & ar, 
           ::boost::gregorian::date & d, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   std::string ds;
   ar & make_nvp("date", ds);
@@ -88,7 +88,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 ::boost::gregorian::date* dp, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // retrieve data from archive required to construct new 
   // invoke inplace constructor to initialize instance of date
@@ -100,14 +100,14 @@
 //! Function to save gregorian::date_duration objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::date_duration & dd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::date_duration::duration_rep dr = dd.get_rep();
   ar & make_nvp("date_duration", dr);
 }
 //! Function to load gregorian::date_duration objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::date_duration & dd, unsigned int version)
+void load(Archive & ar, gregorian::date_duration & dd, unsigned int /*version*/)
 {
   typename gregorian::date_duration::duration_rep dr(0);
   ar & make_nvp("date_duration", dr);
@@ -116,7 +116,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::date_duration* dd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   ::new(dd) gregorian::date_duration(gregorian::not_a_date_time);
 }
@@ -126,14 +126,14 @@
 //! helper unction to save date_duration objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::date_duration::duration_rep & dr, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::date_duration::duration_rep::int_type it = dr.as_number();
   ar & make_nvp("date_duration_duration_rep", it);
 }
 //! helper function to load date_duration objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::date_duration::duration_rep & dr, unsigned int version)
+void load(Archive & ar, gregorian::date_duration::duration_rep & dr, unsigned int /*version*/)
 {
   typename gregorian::date_duration::duration_rep::int_type it(0);
   ar & make_nvp("date_duration_duration_rep", it);
@@ -142,7 +142,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::date_duration::duration_rep* dr, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   ::new(dr) gregorian::date_duration::duration_rep(0);
 }
@@ -155,7 +155,7 @@
  */
 template<class Archive>
 void save(Archive & ar, const gregorian::date_period& dp, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   gregorian::date d1 = dp.begin();
   gregorian::date d2 = dp.end();
@@ -167,7 +167,7 @@
  * the begining date object and the end date object
  */
 template<class Archive>
-void load(Archive & ar, gregorian::date_period& dp, unsigned int version)
+void load(Archive & ar, gregorian::date_period& dp, unsigned int /*version*/)
 {
   gregorian::date d1(gregorian::not_a_date_time);
   gregorian::date d2(gregorian::not_a_date_time);
@@ -178,7 +178,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::date_period* dp, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   gregorian::date d(gregorian::not_a_date_time);
   gregorian::date_duration dd(1);
@@ -190,14 +190,14 @@
 //! Function to save gregorian::greg_month objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::greg_month& gm, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   unsigned short us = gm.as_number();
   ar & make_nvp("greg_month", us);
 }
 //! Function to load gregorian::greg_month objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::greg_month& gm, unsigned int version)
+void load(Archive & ar, gregorian::greg_month& gm, unsigned int /*version*/)
 {
   unsigned short us;
   ar & make_nvp("greg_month", us);
@@ -206,7 +206,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::greg_month* gm, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   ::new(gm) gregorian::greg_month(1);
 }
@@ -216,14 +216,14 @@
 //! Function to save gregorian::greg_day objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::greg_day& gd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   unsigned short us = gd.as_number();
   ar & make_nvp("greg_day", us);
 }
 //! Function to load gregorian::greg_day objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::greg_day& gd, unsigned int version)
+void load(Archive & ar, gregorian::greg_day& gd, unsigned int /*version*/)
 {
   unsigned short us;
   ar & make_nvp("greg_day", us);
@@ -232,7 +232,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::greg_day* gd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   ::new(gd) gregorian::greg_day(1);
 }
@@ -242,14 +242,14 @@
 //! Function to save gregorian::greg_weekday objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::greg_weekday& gd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   unsigned short us = gd.as_number();
   ar & make_nvp("greg_weekday", us);
 }
 //! Function to load gregorian::greg_weekday objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::greg_weekday& gd, unsigned int version)
+void load(Archive & ar, gregorian::greg_weekday& gd, unsigned int /*version*/)
 {
   unsigned short us;
   ar & make_nvp("greg_weekday", us);
@@ -258,7 +258,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::greg_weekday* gd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   ::new(gd) gregorian::greg_weekday(1);
 }
@@ -273,7 +273,7 @@
  */
 template<class Archive>
 void save(Archive & ar, const gregorian::partial_date& pd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   gregorian::greg_day gd(pd.day());
   gregorian::greg_month gm(pd.month().as_number());
@@ -285,7 +285,7 @@
  * the day (greg_day) and month (greg_month) objects
  */
 template<class Archive>
-void load(Archive & ar, gregorian::partial_date& pd, unsigned int version)
+void load(Archive & ar, gregorian::partial_date& pd, unsigned int /*version*/)
 {
   gregorian::greg_day gd(1);
   gregorian::greg_month gm(1);
@@ -296,7 +296,7 @@
 //!override needed b/c no default constructor
 template<class Archive>
 inline void load_construct_data(Archive & ar, gregorian::partial_date* pd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   gregorian::greg_month gm(1);
   gregorian::greg_day gd(1);
@@ -311,7 +311,7 @@
  */
 template<class Archive>
 void save(Archive & ar, const gregorian::nth_kday_of_month& nkd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::nth_kday_of_month::week_num wn(nkd.nth_week());
   typename gregorian::nth_kday_of_month::day_of_week_type d(nkd.day_of_week().as_number());
@@ -325,7 +325,7 @@
  * serialization: the week number, the day of the week, and the month
  */
 template<class Archive>
-void load(Archive & ar, gregorian::nth_kday_of_month& nkd, unsigned int version)
+void load(Archive & ar, gregorian::nth_kday_of_month& nkd, unsigned int /*version*/)
 {
   typename gregorian::nth_kday_of_month::week_num wn(gregorian::nth_kday_of_month::first);
   typename gregorian::nth_kday_of_month::day_of_week_type d(gregorian::Monday);
@@ -340,7 +340,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 gregorian::nth_kday_of_month* nkd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // values used are not significant
   ::new(nkd) gregorian::nth_kday_of_month(gregorian::nth_kday_of_month::first,
@@ -355,7 +355,7 @@
  */
 template<class Archive>
 void save(Archive & ar, const gregorian::first_kday_of_month& fkd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::first_kday_of_month::day_of_week_type d(fkd.day_of_week().as_number());
   typename gregorian::first_kday_of_month::month_type m(fkd.month().as_number());
@@ -367,7 +367,7 @@
  * serialization: the day of the week, and the month
  */
 template<class Archive>
-void load(Archive & ar, gregorian::first_kday_of_month& fkd, unsigned int version)
+void load(Archive & ar, gregorian::first_kday_of_month& fkd, unsigned int /*version*/)
 {
   typename gregorian::first_kday_of_month::day_of_week_type d(gregorian::Monday);
   typename gregorian::first_kday_of_month::month_type m(gregorian::Jan);
@@ -380,7 +380,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 gregorian::first_kday_of_month* fkd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // values used are not significant
   ::new(fkd) gregorian::first_kday_of_month(gregorian::Monday,gregorian::Jan);
@@ -394,7 +394,7 @@
  */
 template<class Archive>
 void save(Archive & ar, const gregorian::last_kday_of_month& lkd, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::last_kday_of_month::day_of_week_type d(lkd.day_of_week().as_number());
   typename gregorian::last_kday_of_month::month_type m(lkd.month().as_number());
@@ -406,7 +406,7 @@
  * serialization: the day of the week, and the month
  */
 template<class Archive>
-void load(Archive & ar, gregorian::last_kday_of_month& lkd, unsigned int version)
+void load(Archive & ar, gregorian::last_kday_of_month& lkd, unsigned int /*version*/)
 {
   typename gregorian::last_kday_of_month::day_of_week_type d(gregorian::Monday);
   typename gregorian::last_kday_of_month::month_type m(gregorian::Jan);
@@ -419,7 +419,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 gregorian::last_kday_of_month* lkd, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // values used are not significant
   ::new(lkd) gregorian::last_kday_of_month(gregorian::Monday,gregorian::Jan);
@@ -430,14 +430,14 @@
 //! Function to save first_day_of_the_week_before objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::first_kday_before& fkdb, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::first_kday_before::day_of_week_type d(fkdb.day_of_week().as_number());
   ar & make_nvp("first_kday_before_day_of_week", d);
 }
 //! Function to load first_day_of_the_week_before objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::first_kday_before& fkdb, unsigned int version)
+void load(Archive & ar, gregorian::first_kday_before& fkdb, unsigned int /*version*/)
 {
   typename gregorian::first_kday_before::day_of_week_type d(gregorian::Monday);
   ar & make_nvp("first_kday_before_day_of_week", d);
@@ -448,7 +448,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 gregorian::first_kday_before* fkdb, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // values used are not significant
   ::new(fkdb) gregorian::first_kday_before(gregorian::Monday);
@@ -459,14 +459,14 @@
 //! Function to save first_day_of_the_week_after objects using serialization lib
 template<class Archive>
 void save(Archive & ar, const gregorian::first_kday_after& fkda, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   typename gregorian::first_kday_after::day_of_week_type d(fkda.day_of_week().as_number());
   ar & make_nvp("first_kday_after_day_of_week", d);
 }
 //! Function to load first_day_of_the_week_after objects using serialization lib
 template<class Archive>
-void load(Archive & ar, gregorian::first_kday_after& fkda, unsigned int version)
+void load(Archive & ar, gregorian::first_kday_after& fkda, unsigned int /*version*/)
 {
   typename gregorian::first_kday_after::day_of_week_type d(gregorian::Monday);
   ar & make_nvp("first_kday_after_day_of_week", d);
@@ -477,7 +477,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 gregorian::first_kday_after* fkda, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // values used are not significant
   ::new(fkda) gregorian::first_kday_after(gregorian::Monday);

Modified: boost/trunk/boost/date_time/local_timezone_defs.hpp
===================================================================
--- boost/trunk/boost/date_time/local_timezone_defs.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/date_time/local_timezone_defs.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
  * Author: Jeff Garland 
- * $Date: 2003/11/23 03:29:56 $
+ * $Date: 2007/03/02 05:16:59 $
  */
 
 #include "boost/date_time/dst_rules.hpp"
@@ -55,12 +55,47 @@
      {
        typedef typename date_type::day_of_week_type day_of_week_type;
        typedef typename date_type::month_type month_type;
-       typedef date_time::first_kday_of_month<date_type> start_rule_functor;
-       typedef date_time::last_kday_of_month<date_type> end_rule_functor;
-       static day_of_week_type start_day() {return Sunday;}
-       static month_type start_month() {return Apr;}
-       static day_of_week_type end_day() {return Sunday;}
-       static month_type end_month() {return Oct;}
+       typedef typename date_type::year_type year_type;
+       typedef date_time::nth_kday_of_month<date_type> start_rule_functor;
+       typedef date_time::first_kday_of_month<date_type> end_rule_functor;
+       typedef date_time::first_kday_of_month<date_type> start_rule_functor_pre2007;
+       typedef date_time::last_kday_of_month<date_type> end_rule_functor_pre2007;
+       static day_of_week_type start_day(year_type) {return Sunday;}
+       static month_type start_month(year_type y) 
+       {
+         if (y < 2007) return Apr;
+         return Mar;
+       }
+       static day_of_week_type end_day(year_type y) {return Sunday;}
+       static month_type end_month(year_type y) 
+       {
+         if (y < 2007) return Oct;
+         return Nov;
+       }
+       static date_type local_dst_start_day(year_type year)
+       {
+         if (year < 2007) {
+           start_rule_functor_pre2007 start1(start_day(year), 
+                                             start_month(year));
+           return start1.get_date(year);
+         }
+         start_rule_functor start(start_rule_functor::second,
+                                  start_day(year), 
+                                  start_month(year));
+         return start.get_date(year);
+          
+       }
+       static date_type local_dst_end_day(year_type year)
+       {
+         if (year < 2007) {
+           end_rule_functor_pre2007 end_rule(end_day(year), 
+                                             end_month(year));
+           return end_rule.get_date(year);
+         }
+         end_rule_functor end(end_day(year), 
+                              end_month(year));
+         return end.get_date(year);      
+       }
        static int dst_start_offset_minutes() { return 120;}
        static int dst_end_offset_minutes() { return 120; }
        static int dst_shift_length_minutes() { return 60; }
@@ -79,15 +114,28 @@
     {
       typedef typename date_type::day_of_week_type day_of_week_type;
       typedef typename date_type::month_type month_type;
+      typedef typename date_type::year_type year_type;
       typedef date_time::last_kday_of_month<date_type> start_rule_functor;
       typedef date_time::last_kday_of_month<date_type> end_rule_functor;
-      static day_of_week_type start_day() {return Sunday;}
-      static month_type start_month() {return Mar;}
-      static day_of_week_type end_day() {return Sunday;}
-      static month_type end_month() {return Oct;}
+      static day_of_week_type start_day(year_type) {return Sunday;}
+      static month_type start_month(year_type) {return Mar;}
+      static day_of_week_type end_day(year_type) {return Sunday;}
+      static month_type end_month(year_type) {return Oct;}
       static int dst_start_offset_minutes() { return 120;}
       static int dst_end_offset_minutes() { return 180; }
       static int dst_shift_length_minutes() { return 60; }
+      static date_type local_dst_start_day(year_type year)
+      {
+        start_rule_functor start(start_day(year), 
+                                 start_month(year));
+        return start.get_date(year);      
+      }
+      static date_type local_dst_end_day(year_type year)
+      {
+        end_rule_functor end(end_day(year), 
+                             end_month(year));
+        return end.get_date(year);      
+      }
     };
 
     //! Alternative dst traits for some parts of the United Kingdom
@@ -110,15 +158,28 @@
     {
       typedef typename date_type::day_of_week_type day_of_week_type;
       typedef typename date_type::month_type month_type;
+      typedef typename date_type::year_type year_type;
       typedef date_time::last_kday_of_month<date_type> start_rule_functor;
       typedef date_time::last_kday_of_month<date_type> end_rule_functor;
-      static day_of_week_type start_day() {return Sunday;}
-      static month_type start_month() {return Oct;}
-      static day_of_week_type end_day() {return Sunday;}
-      static month_type end_month() {return Mar;}
+      static day_of_week_type start_day(year_type) {return Sunday;}
+      static month_type start_month(year_type) {return Oct;}
+      static day_of_week_type end_day(year_type) {return Sunday;}
+      static month_type end_month(year_type) {return Mar;}
       static int dst_start_offset_minutes() { return 120;}
-      static int dst_end_offset_minutes() { return 120; }
+      static int dst_end_offset_minutes() { return 180; }
       static int dst_shift_length_minutes() { return 60; }
+      static date_type local_dst_start_day(year_type year)
+      {
+        start_rule_functor start(start_day(year), 
+                                 start_month(year));
+        return start.get_date(year);      
+      }
+      static date_type local_dst_end_day(year_type year)
+      {
+        end_rule_functor end(end_day(year), 
+                             end_month(year));
+        return end.get_date(year);      
+      }
     };
     
     

Modified: boost/trunk/boost/date_time/posix_time/time_serialize.hpp
===================================================================
--- boost/trunk/boost/date_time/posix_time/time_serialize.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/date_time/posix_time/time_serialize.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -6,7 +6,7 @@
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2005/06/21 03:33:15 $
+ * $Date: 2007/03/02 02:45:57 $
  */
 
 #include "boost/date_time/posix_time/posix_time.hpp"
@@ -35,7 +35,7 @@
 template<class Archive>
 void save(Archive & ar, 
           const posix_time::time_duration& td, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   // serialize a bool so we know how to read this back in later
   bool is_special = td.is_special();
@@ -64,7 +64,7 @@
 template<class Archive>
 void load(Archive & ar, 
           posix_time::time_duration & td, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   bool is_special = false;
   ar & make_nvp("is_special", is_special);
@@ -99,7 +99,7 @@
 template<class Archive>
 void save(Archive & ar, 
           const posix_time::ptime& pt, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   // from_iso_string does not include fractional seconds
   // therefore date and time_duration are used
@@ -118,7 +118,7 @@
 template<class Archive>
 void load(Archive & ar, 
           posix_time::ptime & pt, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   // from_iso_string does not include fractional seconds
   // therefore date and time_duration are used
@@ -139,7 +139,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 posix_time::ptime* pt, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   // retrieve data from archive required to construct new 
   // invoke inplace constructor to initialize instance of date
@@ -155,7 +155,7 @@
 template<class Archive>
 void save(Archive & ar, 
           const posix_time::time_period& tp, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   posix_time::ptime beg(tp.begin().date(), tp.begin().time_of_day());
   posix_time::ptime end(tp.end().date(), tp.end().time_of_day());
@@ -170,7 +170,7 @@
 template<class Archive>
 void load(Archive & ar, 
           boost::posix_time::time_period & tp, 
-          unsigned int version)
+          unsigned int /*version*/)
 {
   posix_time::time_duration td(1,0,0);
   gregorian::date d(gregorian::not_a_date_time);
@@ -185,7 +185,7 @@
 template<class Archive>
 inline void load_construct_data(Archive & ar, 
                                 boost::posix_time::time_period* tp, 
-                                const unsigned int file_version)
+                                const unsigned int /*file_version*/)
 {
   posix_time::time_duration td(1,0,0);
   gregorian::date d(gregorian::not_a_date_time);

Modified: boost/trunk/boost/date_time/time_zone_base.hpp
===================================================================
--- boost/trunk/boost/date_time/time_zone_base.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/date_time/time_zone_base.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -5,11 +5,12 @@
  * Subject to the Boost Software License, Version 1.0. 
  * (See accompanying file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
  * Author: Jeff Garland, Bart Garst
- * $Date: 2006/02/18 20:58:01 $
+ * $Date: 2007/02/23 15:29:16 $
  */
 
 
 #include <string>
+#include <sstream>
 
 namespace boost {
 namespace date_time {

Modified: boost/trunk/boost/foreach.hpp
===================================================================
--- boost/trunk/boost/foreach.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/foreach.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -29,8 +29,8 @@
 
 // Some compilers let us detect even const-qualified rvalues at compile-time
 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1310)                                                       \
- || BOOST_WORKAROUND(__GNUC__, >= 4)                                                            \
- || (BOOST_WORKAROUND(__GNUC__, == 3) && (__GNUC_MINOR__ >= 4))
+ || (BOOST_WORKAROUND(__GNUC__, >= 4) && !defined(BOOST_INTEL))                                 \
+ || (BOOST_WORKAROUND(__GNUC__, == 3) && (__GNUC_MINOR__ >= 4) && !defined(BOOST_INTEL))
 # define BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION
 #else
 // Some compilers allow temporaries to be bound to non-const references.

Modified: boost/trunk/boost/iterator/new_iterator_tests.hpp
===================================================================
--- boost/trunk/boost/iterator/new_iterator_tests.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/iterator/new_iterator_tests.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -29,7 +29,6 @@
 //              (David Abrahams)
 
 # include <iterator>
-# include <assert.h>
 # include <boost/type_traits.hpp>
 # include <boost/static_assert.hpp>
 # include <boost/concept_archetype.hpp> // for detail::dummy_constructor
@@ -40,6 +39,7 @@
 
 # include <boost/iterator/detail/config_def.hpp>
 # include <boost/detail/is_incrementable.hpp>
+# include <boost/detail/lightweight_test.hpp>
 
 namespace boost {
 
@@ -50,7 +50,7 @@
 void readable_iterator_traversal_test(Iterator i1, T v, mpl::true_)
 {
     T v2(*i1++);
-    assert(v == v2);
+    BOOST_TEST(v == v2);
 }
 
 template <class Iterator, class T>
@@ -81,8 +81,8 @@
   ref_t r2 = *i2;
   T v1 = r1;
   T v2 = r2;
-  assert(v1 == v);
-  assert(v2 == v);
+  BOOST_TEST(v1 == v);
+  BOOST_TEST(v2 == v);
 
 # if !BOOST_WORKAROUND(__MWERKS__, <= 0x2407)
   readable_iterator_traversal_test(i1, v, detail::is_postfix_incrementable<Iterator>());
@@ -115,7 +115,7 @@
   typename detail::iterator_traits<Iterator>::value_type bi = *i, bj = *j;
   iter_swap(i2, j2);
   typename detail::iterator_traits<Iterator>::value_type ai = *i, aj = *j;
-  assert(bi == aj && bj == ai);
+  BOOST_TEST(bi == aj && bj == ai);
 }
 
 template <class Iterator, class T>
@@ -126,7 +126,7 @@
   typedef typename detail::iterator_traits<Iterator>::reference reference;
   BOOST_STATIC_ASSERT((is_same<const value_type&, reference>::value));
   const T& v2 = *i2;
-  assert(v1 == v2);
+  BOOST_TEST(v1 == v2);
 # ifndef BOOST_NO_LVALUE_RETURN_DETECTION
   BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);
   BOOST_STATIC_ASSERT(!is_non_const_lvalue_iterator<Iterator>::value);
@@ -141,14 +141,14 @@
   typedef typename detail::iterator_traits<Iterator>::reference reference;
   BOOST_STATIC_ASSERT((is_same<value_type&, reference>::value));
   T& v3 = *i2;
-  assert(v1 == v3);
+  BOOST_TEST(v1 == v3);
   
   // A non-const lvalue iterator is not neccessarily writable, but we
   // are assuming the value_type is assignable here
   *i = v2;
   
   T& v4 = *i2;
-  assert(v2 == v4);
+  BOOST_TEST(v2 == v4);
 # ifndef BOOST_NO_LVALUE_RETURN_DETECTION
   BOOST_STATIC_ASSERT(is_lvalue_iterator<Iterator>::value);
   BOOST_STATIC_ASSERT(is_non_const_lvalue_iterator<Iterator>::value);
@@ -161,15 +161,15 @@
   Iterator i2;
   Iterator i3(i);
   i2 = i;
-  assert(i2 == i3);
-  assert(i != j);
-  assert(i2 != j);
+  BOOST_TEST(i2 == i3);
+  BOOST_TEST(i != j);
+  BOOST_TEST(i2 != j);
   readable_iterator_test(i, val1);
   readable_iterator_test(i2, val1);
   readable_iterator_test(i3, val1);
 
-  assert(i == i2++);
-  assert(i != ++i3);
+  BOOST_TEST(i == i2++);
+  BOOST_TEST(i != ++i3);
 
   readable_iterator_test(i2, val2);
   readable_iterator_test(i3, val2);
@@ -198,16 +198,16 @@
 
   Iterator i1 = i, i2 = i;
 
-  assert(i == i1--);
-  assert(i != --i2);
+  BOOST_TEST(i == i1--);
+  BOOST_TEST(i != --i2);
 
   readable_iterator_test(i, v2);
   readable_iterator_test(i1, v1);
   readable_iterator_test(i2, v1);
 
   --i;
-  assert(i == i1);
-  assert(i == i2);
+  BOOST_TEST(i == i1);
+  BOOST_TEST(i == i2);
   ++i1;
   ++i2;
 
@@ -227,32 +227,32 @@
 
   for (c = 0; c < N-1; ++c)
   {
-    assert(i == j + c);
-    assert(*i == vals[c]);
+    BOOST_TEST(i == j + c);
+    BOOST_TEST(*i == vals[c]);
     typename detail::iterator_traits<Iterator>::value_type x = j[c];
-    assert(*i == x);
-    assert(*i == *(j + c));
-    assert(*i == *(c + j));
+    BOOST_TEST(*i == x);
+    BOOST_TEST(*i == *(j + c));
+    BOOST_TEST(*i == *(c + j));
     ++i;
-    assert(i > j);
-    assert(i >= j);
-    assert(j <= i);
-    assert(j < i);
+    BOOST_TEST(i > j);
+    BOOST_TEST(i >= j);
+    BOOST_TEST(j <= i);
+    BOOST_TEST(j < i);
   }
 
   Iterator k = j + N - 1;
   for (c = 0; c < N-1; ++c)
   {
-    assert(i == k - c);
-    assert(*i == vals[N - 1 - c]);
+    BOOST_TEST(i == k - c);
+    BOOST_TEST(*i == vals[N - 1 - c]);
     typename detail::iterator_traits<Iterator>::value_type x = j[N - 1 - c];
-    assert(*i == x);
+    BOOST_TEST(*i == x);
     Iterator q = k - c; 
-    assert(*i == *q);
-    assert(i > j);
-    assert(i >= j);
-    assert(j <= i);
-    assert(j < i);
+    BOOST_TEST(*i == *q);
+    BOOST_TEST(i > j);
+    BOOST_TEST(i >= j);
+    BOOST_TEST(j <= i);
+    BOOST_TEST(j < i);
     --i;
   }
 }

Modified: boost/trunk/boost/multi_index/detail/ord_index_node.hpp
===================================================================
--- boost/trunk/boost/multi_index/detail/ord_index_node.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index/detail/ord_index_node.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2006 Joaquín M López Muñoz.
+/* Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -91,6 +91,17 @@
  * ordered_index_node_impl by 25%.
  */
 
+#if defined(BOOST_MSVC)
+/* This code casts pointers to an integer type that has been computed
+ * to be large enough to hold the pointer, however the metaprogramming
+ * logic is not always spotted by the VC++ code analyser that issues a
+ * long list of warnings.
+ */
+
+#pragma warning(push)
+#pragma warning(disable:4312 4311)
+#endif
+
 struct ordered_index_node_compressed_base
 {
   struct color_ref
@@ -169,7 +180,10 @@
   ordered_index_node_impl* left_;
   ordered_index_node_impl* right_;
 };
+#if defined(BOOST_MSVC)
+#pragma warning(pop)
 #endif
+#endif
 
 struct ordered_index_node_impl:
 

Modified: boost/trunk/boost/multi_index/hashed_index.hpp
===================================================================
--- boost/trunk/boost/multi_index/hashed_index.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index/hashed_index.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2006 Joaquín M López Muñoz.
+/* Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -550,6 +550,11 @@
   hashed_index(
     const hashed_index<KeyFromValue,Hash,Pred,SuperMeta,TagList,Category>& x):
     super(x),
+
+#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
+    safe_super(),
+#endif
+
     key(x.key),
     hash(x.hash),
     eq(x.eq),

Modified: boost/trunk/boost/multi_index/ordered_index.hpp
===================================================================
--- boost/trunk/boost/multi_index/ordered_index.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index/ordered_index.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2006 Joaquín M López Muñoz.
+/* Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -467,6 +467,11 @@
   ordered_index(
     const ordered_index<KeyFromValue,Compare,SuperMeta,TagList,Category>& x):
     super(x),
+
+#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
+    safe_super(),
+#endif
+
     key(x.key),
     comp(x.comp)
   {

Modified: boost/trunk/boost/multi_index/random_access_index.hpp
===================================================================
--- boost/trunk/boost/multi_index/random_access_index.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index/random_access_index.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2006 Joaquín M López Muñoz.
+/* Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -596,6 +596,11 @@
 
   random_access_index(const random_access_index<SuperMeta,TagList>& x):
     super(x),
+
+#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
+    safe_super(),
+#endif
+
     ptrs(x.get_allocator(),header()->impl(),x.size())
   {
     /* The actual copying takes place in subsequent call to copy_().

Modified: boost/trunk/boost/multi_index/sequenced_index.hpp
===================================================================
--- boost/trunk/boost/multi_index/sequenced_index.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index/sequenced_index.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright 2003-2006 Joaquín M López Muñoz.
+/* Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -502,6 +502,11 @@
 
   sequenced_index(const sequenced_index<SuperMeta,TagList>& x):
     super(x)
+
+#if defined(BOOST_MULTI_INDEX_ENABLE_SAFE_MODE)
+    ,safe_super()
+#endif
+
   {
     /* The actual copying takes place in subsequent call to copy_().
      */

Modified: boost/trunk/boost/multi_index_container.hpp
===================================================================
--- boost/trunk/boost/multi_index_container.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/multi_index_container.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,6 +1,6 @@
 /* Multiply indexed container.
  *
- * Copyright 2003-2006 Joaquín M López Muñoz.
+ * Copyright 2003-2007 Joaquín M López Muñoz.
  * 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)
@@ -230,6 +230,7 @@
   multi_index_container(
     const multi_index_container<Value,IndexSpecifierList,Allocator>& x):
     bfm_allocator(x.bfm_allocator::member),
+    bfm_header(),
     super(x),
     node_count(0)
   {

Modified: boost/trunk/boost/none.hpp
===================================================================
--- boost/trunk/boost/none.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/none.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -12,17 +12,12 @@
 #ifndef BOOST_NONE_17SEP2003_HPP
 #define BOOST_NONE_17SEP2003_HPP
 
-#include "boost/none_t.hpp"
-
-// NOTE: Borland users have to include this header outside any precompiled headers
-// (bcc<=5.64 cannot include instance data in a precompiled header)
-//  -- * To be verified, now that there's no unnamed namespace
-
 namespace boost {
 
-none_t const none = ((none_t)0) ;
+enum none_t {none = 0};
 
 } // namespace boost
 
+
 #endif
 

Deleted: boost/trunk/boost/none_t.hpp
===================================================================
--- boost/trunk/boost/none_t.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/none_t.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,24 +0,0 @@
-// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
-//
-// Use, modification, and distribution is 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)
-//
-// See http://www.boost.org/lib/optional for documentation.
-//
-// You are welcome to contact the author at:
-//  fernando_cacciola at hotmail.com
-//
-#ifndef BOOST_NONE_T_17SEP2003_HPP
-#define BOOST_NONE_T_17SEP2003_HPP
-
-namespace boost {
-
-namespace detail { struct none_helper{}; }
-
-typedef int detail::none_helper::*none_t ;
-
-} // namespace boost
-
-#endif
-

Modified: boost/trunk/boost/numeric/interval/detail/msvc_rounding_control.hpp
===================================================================
--- boost/trunk/boost/numeric/interval/detail/msvc_rounding_control.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/numeric/interval/detail/msvc_rounding_control.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -17,6 +17,9 @@
 
 #include <float.h>      // MSVC rounding control
 
+// Although the function is called _control87, it seems to work for
+// other FPUs too, so it does not have to be changed to _controlfp.
+
 namespace boost {
 namespace numeric {
 namespace interval_lib {

Modified: boost/trunk/boost/numeric/interval/hw_rounding.hpp
===================================================================
--- boost/trunk/boost/numeric/interval/hw_rounding.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/numeric/interval/hw_rounding.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -17,7 +17,7 @@
 #define BOOST_NUMERIC_INTERVAL_NO_HARDWARE
 
 // define appropriate specialization of rounding_control for built-in types
-#if defined(__i386__) || defined(_M_IX86) || defined(__BORLANDC__)
+#if defined(__i386__) || defined(_M_IX86) || defined(__BORLANDC__) || defined(_M_X64)
 #  include <boost/numeric/interval/detail/x86_rounding_control.hpp>
 #elif defined(powerpc) || defined(__powerpc__) || defined(__ppc__)
 #  include <boost/numeric/interval/detail/ppc_rounding_control.hpp>

Modified: boost/trunk/boost/optional/optional.hpp
===================================================================
--- boost/trunk/boost/optional/optional.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/optional/optional.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -26,7 +26,7 @@
 #include "boost/mpl/bool.hpp"
 #include "boost/mpl/not.hpp"
 #include "boost/detail/reference_content.hpp"
-#include "boost/none_t.hpp"
+#include "boost/none.hpp"
 #include "boost/utility/compare_pointees.hpp"
 
 #include "boost/optional/optional_fwd.hpp"
@@ -76,7 +76,20 @@
 #define BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION
 #endif
 
+// Daniel Wallin discovered that bind/apply.hpp badly interacts with the apply<>
+// member template of a factory as used in the optional<> implementation.
+// He proposed this simple fix which is to move the call to apply<> outside
+// namespace boost.
+namespace boost_optional_detail
+{
+  template <class T, class Factory>
+  void construct(Factory const& factory, void* address)
+  {
+    factory.BOOST_NESTED_TEMPLATE apply<T>(address);
+  }
+}
 
+
 namespace boost {
 
 class in_place_factory_base ;
@@ -173,7 +186,7 @@
 
     // Creates an optional<T> uninitialized.
     // No-throw
-    optional_base ( none_t const& )
+    optional_base ( none_t )
       :
       m_initialized(false) {}
 
@@ -185,6 +198,16 @@
     {
       construct(val);
     }
+    
+    // Creates an optional<T> initialized with 'val' IFF cond is true, otherwise creates an uninitialzed optional<T>.
+    // Can throw if T::T(T const&) does
+    optional_base ( bool cond, argument_type val )
+      :
+      m_initialized(false)
+    {
+      if ( cond )
+        construct(val);
+    }
 
     // Creates a deep copy of another optional<T>
     // Can throw if T::T(T const&) does
@@ -256,7 +279,7 @@
 
     // Assigns from "none", destroying the current value, if any, leaving this UNINITIALIZED
     // No-throw (assuming T::~T() doesn't)
-    void assign ( none_t const& ) { destroy(); }
+    void assign ( none_t ) { destroy(); }
 
 #ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
     template<class Expr>
@@ -299,7 +322,7 @@
     void construct ( Expr const& factory, in_place_factory_base const* )
      {
        BOOST_STATIC_ASSERT ( ::boost::mpl::not_<is_reference_predicate>::value ) ;
-       factory.BOOST_NESTED_TEMPLATE apply<value_type>(m_storage.address()) ;
+       boost_optional_detail::construct<value_type>(factory, m_storage.address());
        m_initialized = true ;
      }
 
@@ -418,6 +441,8 @@
     // the following olverloads are used to filter out the case and guarantee an error in case of T being a reference.
     pointer_const_type cast_ptr( internal_type const* p, is_not_reference_tag ) const { return p ; }
     pointer_type       cast_ptr( internal_type *      p, is_not_reference_tag )       { return p ; }
+    pointer_const_type cast_ptr( internal_type const* p, is_reference_tag     ) const { return &p->get() ; }
+    pointer_type       cast_ptr( internal_type *      p, is_reference_tag     )       { return &p->get() ; }
 
     bool m_initialized ;
     storage_type m_storage ;
@@ -449,12 +474,15 @@
 
     // Creates an optional<T> uninitialized.
     // No-throw
-    optional( none_t const& none_ ) : base(none_) {}
+    optional( none_t none_ ) : base(none_) {}
 
     // Creates an optional<T> initialized with 'val'.
     // Can throw if T::T(T const&) does
     optional ( argument_type val ) : base(val) {}
 
+    // Creates an optional<T> initialized with 'val' IFF cond is true, otherwise creates an uninitialized optional.
+    // Can throw if T::T(T const&) does
+    optional ( bool cond, argument_type val ) : base(cond,val) {}
 
 #ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
     // NOTE: MSVC needs templated versions first
@@ -537,7 +565,7 @@
     // Assigns from a "none"
     // Which destroys the current value, if any, leaving this UNINITIALIZED
     // No-throw (assuming T::~T() doesn't)
-    optional& operator= ( none_t const& none_ )
+    optional& operator= ( none_t none_ )
       {
         this->assign( none_ ) ;
         return *this ;
@@ -549,6 +577,10 @@
     reference_const_type get() const { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }
     reference_type       get()       { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }
 
+    // Returns a copy of the value if this is initialized, 'v' otherwise
+    reference_const_type get_value_or ( reference_const_type v ) const { return this->is_initialized() ? get() : v ; }
+    reference_type       get_value_or ( reference_type       v )       { return this->is_initialized() ? get() : v ; }
+    
     // Returns a pointer to the value if this is initialized, otherwise,
     // the behaviour is UNDEFINED
     // No-throw
@@ -570,6 +602,22 @@
        bool operator!() const { return !this->is_initialized() ; }
 } ;
 
+// Returns optional<T>(v)
+template<class T> 
+inline 
+optional<T> make_optional ( T const& v  )
+{
+  return optional<T>(v);
+}
+
+// Returns optional<T>(cond,v)
+template<class T> 
+inline 
+optional<T> make_optional ( bool cond, T const& v )
+{
+  return optional<T>(cond,v);
+}
+
 // Returns a reference to the value if this is initialized, otherwise, the behaviour is UNDEFINED.
 // No-throw
 template<class T>
@@ -606,6 +654,24 @@
   return opt->get_ptr() ;
 }
 
+// Returns a reference to the value if this is initialized, otherwise, the behaviour is UNDEFINED.
+// No-throw
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_const_type
+get_optional_value_or ( optional<T> const& opt, BOOST_DEDUCED_TYPENAME optional<T>::reference_const_type v )
+{
+  return opt.get_value_or(v) ;
+}
+
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_type
+get_optional_value_or ( optional<T>& opt, BOOST_DEDUCED_TYPENAME optional<T>::reference_type v )
+{
+  return opt.get_value_or(v) ;
+}
+
 // Returns a pointer to the value if this is initialized, otherwise, returns NULL.
 // No-throw
 template<class T>
@@ -627,6 +693,11 @@
 // optional's relational operators ( ==, !=, <, >, <=, >= ) have deep-semantics (compare values).
 // WARNING: This is UNLIKE pointers. Use equal_pointees()/less_pointess() in generic code instead.
 
+
+//
+// optional<T> vs optional<T> cases
+//
+
 template<class T>
 inline
 bool operator == ( optional<T> const& x, optional<T> const& y )
@@ -657,64 +728,141 @@
 bool operator >= ( optional<T> const& x, optional<T> const& y )
 { return !( x < y ) ; }
 
+
+//
+// optional<T> vs T cases
+//
 template<class T>
 inline
-bool operator == ( optional<T> const& x, none_t const& )
+bool operator == ( optional<T> const& x, T const& y )
+{ return equal_pointees(x, optional<T>(y)); }
+
+template<class T>
+inline
+bool operator < ( optional<T> const& x, T const& y )
+{ return less_pointees(x, optional<T>(y)); }
+
+template<class T>
+inline
+bool operator != ( optional<T> const& x, T const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( optional<T> const& x, T const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( optional<T> const& x, T const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( optional<T> const& x, T const& y )
+{ return !( x < y ) ; }
+
+//
+// T vs optional<T> cases
+//
+
+template<class T>
+inline
+bool operator == ( T const& x, optional<T> const& y )
+{ return equal_pointees( optional<T>(x), y ); }
+
+template<class T>
+inline
+bool operator < ( T const& x, optional<T> const& y )
+{ return less_pointees( optional<T>(x), y ); }
+
+template<class T>
+inline
+bool operator != ( T const& x, optional<T> const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( T const& x, optional<T> const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( T const& x, optional<T> const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( T const& x, optional<T> const& y )
+{ return !( x < y ) ; }
+
+
+//
+// optional<T> vs none cases
+//
+
+template<class T>
+inline
+bool operator == ( optional<T> const& x, none_t )
 { return equal_pointees(x, optional<T>() ); }
 
 template<class T>
 inline
-bool operator < ( optional<T> const& x, none_t const& )
+bool operator < ( optional<T> const& x, none_t )
 { return less_pointees(x,optional<T>() ); }
 
 template<class T>
 inline
-bool operator != ( optional<T> const& x, none_t const& y )
+bool operator != ( optional<T> const& x, none_t y )
 { return !( x == y ) ; }
 
 template<class T>
 inline
-bool operator > ( optional<T> const& x, none_t const& y )
+bool operator > ( optional<T> const& x, none_t y )
 { return y < x ; }
 
 template<class T>
 inline
-bool operator <= ( optional<T> const& x, none_t const& y )
+bool operator <= ( optional<T> const& x, none_t y )
 { return !( y < x ) ; }
 
 template<class T>
 inline
-bool operator >= ( optional<T> const& x, none_t const& y )
+bool operator >= ( optional<T> const& x, none_t y )
 { return !( x < y ) ; }
 
+//
+// none vs optional<T> cases
+//
+
 template<class T>
 inline
-bool operator == ( none_t const& x, optional<T> const& y )
+bool operator == ( none_t x, optional<T> const& y )
 { return equal_pointees(optional<T>() ,y); }
 
 template<class T>
 inline
-bool operator < ( none_t const& x, optional<T> const& y )
+bool operator < ( none_t x, optional<T> const& y )
 { return less_pointees(optional<T>() ,y); }
 
 template<class T>
 inline
-bool operator != ( none_t const& x, optional<T> const& y )
+bool operator != ( none_t x, optional<T> const& y )
 { return !( x == y ) ; }
 
 template<class T>
 inline
-bool operator > ( none_t const& x, optional<T> const& y )
+bool operator > ( none_t x, optional<T> const& y )
 { return y < x ; }
 
 template<class T>
 inline
-bool operator <= ( none_t const& x, optional<T> const& y )
+bool operator <= ( none_t x, optional<T> const& y )
 { return !( y < x ) ; }
 
 template<class T>
 inline
-bool operator >= ( none_t const& x, optional<T> const& y )
+bool operator >= ( none_t x, optional<T> const& y )
 { return !( x < y ) ; }
 
 //
@@ -767,10 +915,6 @@
   optional_detail::optional_swap(x,y);
 }
 
-template<class T> inline optional<T> make_optional ( T const& v )
-{
-  return optional<T>(v);
-}
 
 } // namespace boost
 

Modified: boost/trunk/boost/preprocessor/config/config.hpp
===================================================================
--- boost/trunk/boost/preprocessor/config/config.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/preprocessor/config/config.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -31,7 +31,11 @@
 #    elif defined(__MWERKS__) && __MWERKS__ >= 0x3200
 #        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_STRICT())
 #    elif defined(__EDG__) || defined(__EDG_VERSION__)
-#        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())
+#        if defined(_MSC_VER) && __EDG_VERSION__ >= 308
+#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MSVC())
+#        else
+#            define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_EDG() | BOOST_PP_CONFIG_STRICT())
+#        endif
 #    elif defined(__MWERKS__)
 #        define BOOST_PP_CONFIG_FLAGS() (BOOST_PP_CONFIG_MWCC())
 #    elif defined(__DMC__)

Modified: boost/trunk/boost/regex/concepts.hpp
===================================================================
--- boost/trunk/boost/regex/concepts.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/regex/concepts.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -68,7 +68,13 @@
 //
 } // namespace boost
 namespace std{
-   template<> struct char_traits<boost::char_architype>{};
+   template<> struct char_traits<boost::char_architype>
+   {
+      // The intent is that this template is not instantiated,
+      // but this typedef gives us a chance of compilation in
+      // case it is:
+      typedef boost::char_architype char_type;
+   };
 }
 namespace boost{
 //

Modified: boost/trunk/boost/regex/v4/regex_traits.hpp
===================================================================
--- boost/trunk/boost/regex/v4/regex_traits.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/regex/v4/regex_traits.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -76,7 +76,7 @@
 // required "standard" ones:
 //
 namespace re_detail{
-#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, BOOST_TESTED_AT(55500))
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, < 60000)
 BOOST_MPL_HAS_XXX_TRAIT_DEF(boost_extensions_tag)
 #else
 template<class T>
@@ -129,7 +129,7 @@
 {
    typedef BaseT type;
 };
-#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, BOOST_TESTED_AT(55500))
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, < 60000)
 template <class BaseT>
 struct compute_wrapper_base<BaseT, false>
 {

Modified: boost/trunk/boost/test/test_tools.hpp
===================================================================
--- boost/trunk/boost/test/test_tools.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/test/test_tools.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -7,7 +7,7 @@
 //
 //  File        : $RCSfile: test_tools.hpp,v $
 //
-//  Version     : $Revision: 1.60.2.6 $
+//  Version     : $Revision: 1.60.2.7 $
 //
 //  Description : contains definition for all test tools in test toolbox
 // ***************************************************************************
@@ -156,7 +156,7 @@
 
 // The argument version of the following macros are causing "Internal Compiler Errors"
 // on MSVC 6.5 when inlining is turned on (i.e. usually in release builds)
-#if BOOST_WORKAROUND(BOOST_MSVC, <=1200)
+#if BOOST_WORKAROUND(BOOST_MSVC, <=1200) && defined(NDEBUG)
 #define BOOST_WARN_EQUAL( L, R ) BOOST_WARN( (L) == (R) )
 #define BOOST_CHECK_EQUAL( L, R ) BOOST_CHECK( (L) == (R) )
 #define BOOST_REQUIRE_EQUAL( L, R ) BOOST_REQUIRE( (L) == (R) )
@@ -609,6 +609,9 @@
 //  Revision History :
 //
 //  $Log: test_tools.hpp,v $
+//  Revision 1.60.2.7  2007/02/22 17:57:29  speedsnail
+//  Make the msvc-6.5 hack even more specific, i.e. apply only in release builds.
+//
 //  Revision 1.60.2.6  2006/12/16 15:02:16  speedsnail
 //  Merged from HEAD
 //

Modified: boost/trunk/boost/wave/cpp_context.hpp
===================================================================
--- boost/trunk/boost/wave/cpp_context.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/wave/cpp_context.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -214,12 +214,13 @@
     void reset_macro_definitions() 
         { macros.reset_macromap(); macros.init_predefined_macros(); }
 
-// get the pp-iterator version information 
+// get the Wave version information 
     static std::string get_version()  
         { return boost::wave::util::predefined_macros::get_fullversion(false); }
     static std::string get_version_string()  
         { return boost::wave::util::predefined_macros::get_versionstr(false); }
 
+// access current language options
     void set_language(boost::wave::language_support language_,
                       bool reset_macros = true) 
     { 
@@ -285,7 +286,7 @@
 //  expand_tokensequence(): 
 //      expands all macros contained in a given token sequence, handles '##' 
 //      and '#' pp operators and re-scans the resulting sequence 
-//      (essentially preprocesses the token sequence).
+//      (essentially pre-processes the token sequence).
 //
 //      The expand_undefined parameter is true during macro expansion inside
 //      a C++ expression given for a #if or #elif statement. 

Modified: boost/trunk/boost/xpressive/detail/utility/boyer_moore.hpp
===================================================================
--- boost/trunk/boost/xpressive/detail/utility/boyer_moore.hpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/boost/xpressive/detail/utility/boyer_moore.hpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -61,7 +61,7 @@
         std::ptrdiff_t const uchar_max = UCHAR_MAX;
         std::ptrdiff_t diff = std::distance(begin, end);
         this->length_  = static_cast<unsigned char>((std::min)(diff, uchar_max));
-        std::fill_n(this->offsets_, uchar_max + 1, this->length_);
+        std::fill_n(static_cast<unsigned char *>(this->offsets_), uchar_max + 1, this->length_);
         --this->length_;
 
         icase ? this->init_(traits, case_fold()) : this->init_(traits, mpl::false_());

Modified: boost/trunk/debian/changelog
===================================================================
--- boost/trunk/debian/changelog	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/debian/changelog	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,3 +1,9 @@
+boost (1.33.1+1.34.0-cvs20070326-1) experimental; urgency=low
+
+  * New upstream snapshot version.
+
+ -- Domenico Andreoli <cavok at debian.org>  Tue, 27 Mar 2007 00:47:14 +0200
+
 boost (1.33.1+1.34.0-cvs20070221-1) experimental; urgency=low
 
   * New upstream snapshot version.

Modified: boost/trunk/index.htm
===================================================================
--- boost/trunk/index.htm	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/index.htm	2007-03-26 21:47:29 UTC (rev 14044)
@@ -196,6 +196,7 @@
                         <h4>Updated Libraries</h4>
 
                         <ul>
+
                           <li>
                             <span class="library"><a href=
                             "libs/assign/index.html">Assign
@@ -215,6 +216,18 @@
 
                           <li>
                             <span class="library"><a href=
+                            "doc/hmtl/date_time.html">Date_time library</a>:</span>
+                            <ul>
+                              <li>Support for new US/Canada timezone rules and
+                                  other bug fixes.  See 
+                                  <a href="doc/hmtl/date_time/details.html#changes">Change History</a>
+                                  for details.
+                              </li>
+                            </ul>
+                          </li>
+
+                          <li>
+                            <span class="library"><a href=
                             "libs/filesystem/doc/index.htm">Filesystem
                             Library</a>:</span> Major upgrade in preparation
                             for submission to the C++ Standards Committee for
@@ -867,7 +880,7 @@
                           <div class="sidecell" id="footer">
                             <div class="sidecell-0">
                               <div id="revised">
-                                <p>Revised $Date: 2007/02/18 14:26:12 $</p>
+                                <p>Revised $Date: 2007/02/23 02:20:33 $</p>
                               </div>
 
                               <div id="copyright">

Modified: boost/trunk/libs/compatibility/index.html
===================================================================
--- boost/trunk/libs/compatibility/index.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/compatibility/index.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -49,7 +49,7 @@
     </ul>
 
     <p>There are more powerful alternatives to using the Boost.Compatibility
-    library CXX headers, e.g. <a href="http://www.stlport.org/">STLport</a>
+    library CXX headers, e.g. <a href="http://stlport.sourceforge.net">STLport</a>
     or <a href=
     "http://www.fnal.gov/docs/working-groups/fpcltf/Pkg/ISOcxx/doc/0ISOcxx.html">
     ISOCXX</a>. However, in contrast to these alternatives, the

Modified: boost/trunk/libs/config/config.htm
===================================================================
--- boost/trunk/libs/config/config.htm	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/config/config.htm	2007-03-26 21:47:29 UTC (rev 14044)
@@ -34,7 +34,7 @@
          should be able to use boost "as is". Since the compiler is configured 
          separately from the standard library, the default configuration should work 
          even if you replace the compiler's standard library with a third-party standard 
-         library (like <a href="http://www.stlport.org">STLport</a>).
+         library (like <a href="http://stlport.sourceforge.net">STLport</a>).
       </p>
       <p>Using boost "as is" without trying to reconfigure is the recommended method for 
          using boost. You can, however, run the configure script if you want to, and 

Modified: boost/trunk/libs/date_time/test/posix_time/testdst_rules.cpp
===================================================================
--- boost/trunk/libs/date_time/test/posix_time/testdst_rules.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/date_time/test/posix_time/testdst_rules.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -13,18 +13,33 @@
 // back Mar 1
 
 struct paraguay_dst_traits { 
+  typedef boost::gregorian::date           date_type;
   typedef boost::gregorian::date::day_type day_type;
   typedef boost::gregorian::date::month_type month_type;
+  typedef boost::gregorian::date::year_type year_type;
   typedef boost::date_time::partial_date<boost::gregorian::date> start_rule_functor;
   typedef boost::date_time::partial_date<boost::gregorian::date> end_rule_functor;
-  static day_type start_day() {return 1;}
-  static month_type start_month() {return boost::date_time::Oct;}
-  static day_type end_day() {return 1;}
-  static month_type end_month() {return boost::date_time::Mar;}
+  static day_type start_day(year_type) {return 1;}
+  static month_type start_month(year_type) {return boost::date_time::Oct;}
+  static day_type end_day(year_type) {return 1;}
+  static month_type end_month(year_type) {return boost::date_time::Mar;}
   static int dst_start_offset_minutes() { return 120;}
   static int dst_end_offset_minutes() { return 120; }
   static int dst_shift_length_minutes() { return 60; }
+  static date_type local_dst_start_day(year_type year)
+  {
+    start_rule_functor start(start_day(year), 
+                             start_month(year));
+    return start.get_date(year);      
+  }
+  static date_type local_dst_end_day(year_type year)
+  {
+    end_rule_functor end(end_day(year), 
+                         end_month(year));
+    return end.get_date(year);      
+  }
 
+
 };
 
 
@@ -105,7 +120,7 @@
   boost::date_time::time_is_dst_result a1 =
     dstcalc::local_is_dst(date(2002,May,1),hours(3),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
 
   check("check southern not dst",  a1==boost::date_time::is_not_in_dst);
@@ -113,7 +128,7 @@
   boost::date_time::time_is_dst_result a2 =
     dstcalc::local_is_dst(date(2002,Jan,1),hours(3),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
 
   check("check southern is dst",  a2==boost::date_time::is_in_dst);
@@ -121,50 +136,50 @@
   boost::date_time::time_is_dst_result a3 =
     dstcalc::local_is_dst(date(2002,Oct,28),hours(3),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
 
   check("check southern is dst",  a3==boost::date_time::is_in_dst);
   boost::date_time::time_is_dst_result a4 =
     dstcalc::local_is_dst(date(2002,Oct,27),time_duration(1,59,59),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-not dst",  a4==boost::date_time::is_not_in_dst);
   boost::date_time::time_is_dst_result a5 =
     dstcalc::local_is_dst(date(2002,Oct,27),hours(3),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-is dst",  a5==boost::date_time::is_in_dst);
   boost::date_time::time_is_dst_result a6 =
     dstcalc::local_is_dst(date(2002,Oct,27),hours(2),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-invalid time",  a6==boost::date_time::invalid_time_label);
   boost::date_time::time_is_dst_result a7 =
-    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(0,59,59),
+    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(1,59,59),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-is dst",  a7==boost::date_time::is_in_dst);
   boost::date_time::time_is_dst_result a8 =
-    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(1,0,0),
+    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,0,0),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-ambiguous",  a8==boost::date_time::ambiguous);
   boost::date_time::time_is_dst_result a9 =
-    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(1,59,59),
+    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,59,59),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-ambiguous",  a9==boost::date_time::ambiguous);
   boost::date_time::time_is_dst_result a10 =
-    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(2,0,0),
+    dstcalc::local_is_dst(date(2002,Mar,31),time_duration(3,0,0),
                           dst_start2, 120,
-                          dst_end2, 120,
+                          dst_end2, 180,
                           60);
   check("check southern boundary-not",  a10==boost::date_time::is_not_in_dst);
 
@@ -174,34 +189,64 @@
   typedef boost::date_time::dst_calc_engine<date, time_duration, us_dst_traits>
     us_dst_calc2;
     
-  //  us_dst_calc2
-  check("dst start", us_dst_calc2::local_dst_start_day(2002) == dst_start);
-  check("dst end",   us_dst_calc2::local_dst_end_day(2002) == dst_end);
-  //  std::cout << us_dst_calc2::local_dst_end_day(2002) << std::endl;
-  check("dst boundary",   us_dst_calc2::is_dst_boundary_day(dst_start));
-  check("dst boundary",   us_dst_calc2::is_dst_boundary_day(dst_end));
+  {
+    //  us_dst_calc2
+    check("dst start", us_dst_calc2::local_dst_start_day(2002) == dst_start);
+    check("dst end",   us_dst_calc2::local_dst_end_day(2002) == dst_end);
+    //  std::cout << us_dst_calc2::local_dst_end_day(2002) << std::endl;
+    check("dst boundary",   us_dst_calc2::is_dst_boundary_day(dst_start));
+    check("dst boundary",   us_dst_calc2::is_dst_boundary_day(dst_end));
+    
+    check("check if time is dst -- not",   
+          us_dst_calc2::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
+    check("label on dst boundary invalid", 
+          us_dst_calc2::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
+    check("label on dst boundary invalid",   
+          us_dst_calc2::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
+    check("check if time is dst -- not",   
+          us_dst_calc2::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
+    check("check if time is dst -- yes",   
+          us_dst_calc2::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
 
-  check("check if time is dst -- not",   
-        us_dst_calc2::local_is_dst(t.date(), t.time_of_day())==boost::date_time::is_not_in_dst);
-  check("label on dst boundary invalid", 
-        us_dst_calc2::local_is_dst(t3a.date(),t3a.time_of_day())==boost::date_time::invalid_time_label);
-  check("label on dst boundary invalid",   
-        us_dst_calc2::local_is_dst(t3b.date(),t3b.time_of_day())==boost::date_time::invalid_time_label);
-   check("check if time is dst -- not",   
-         us_dst_calc2::local_is_dst(t4.date(),t4.time_of_day())==boost::date_time::is_not_in_dst);
-   check("check if time is dst -- yes",   
-         us_dst_calc2::local_is_dst(t5.date(),t5.time_of_day())==boost::date_time::is_in_dst);
+    check("check if time is dst -- not",   
+          us_dst_calc2::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
+    check("check if time is dst -- ambig", 
+          us_dst_calc2::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
+    check("check if time is dst -- ambig", 
+          us_dst_calc2::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
+    check("check if time is dst -- not",   
+          us_dst_calc2::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+  }
+  {
+    //some new checks for the new 2007 us dst rules
+    date dst_start07(2007,Mar, 11);
+    date dst_end07(2007,Nov, 4);
 
-   check("check if time is dst -- not",   
-         us_dst_calc2::local_is_dst(t6.date(),t6.time_of_day())==boost::date_time::is_in_dst);
-   check("check if time is dst -- ambig", 
-         us_dst_calc2::local_is_dst(t7.date(),t7.time_of_day())==boost::date_time::ambiguous);
-   check("check if time is dst -- ambig", 
-         us_dst_calc2::local_is_dst(t8.date(),t8.time_of_day())==boost::date_time::ambiguous);
-   check("check if time is dst -- not",   
-         us_dst_calc2::local_is_dst(t9.date(),t9.time_of_day())==boost::date_time::is_not_in_dst);
+    check("dst start07", us_dst_calc2::local_dst_start_day(2007) == dst_start07);
+    check("dst end07",   us_dst_calc2::local_dst_end_day(2007) == dst_end07);
+    check("dst boundary07",   us_dst_calc2::is_dst_boundary_day(dst_start07));
+    check("dst boundary07",   us_dst_calc2::is_dst_boundary_day(dst_end07));
 
+    date dst_start08(2008,Mar, 9);
+    date dst_end08(2008,Nov, 2);
 
+    check("dst start08", us_dst_calc2::local_dst_start_day(2008) == dst_start08);
+    check("dst end08",   us_dst_calc2::local_dst_end_day(2008) == dst_end08);
+    check("dst boundary08",   us_dst_calc2::is_dst_boundary_day(dst_start08));
+    check("dst boundary08",   us_dst_calc2::is_dst_boundary_day(dst_end08));
+
+    date dst_start09(2009,Mar, 8);
+    date dst_end09(2009,Nov, 1);
+
+    check("dst start09", us_dst_calc2::local_dst_start_day(2009) == dst_start09);
+    check("dst end09",   us_dst_calc2::local_dst_end_day(2009) == dst_end09);
+    check("dst boundary09",   us_dst_calc2::is_dst_boundary_day(dst_start09));
+    check("dst boundary09",   us_dst_calc2::is_dst_boundary_day(dst_end09));
+    
+  }
+
+
+
   /******************** post release 1 -- new dst calc engine - eu dst ********/
   
 
@@ -361,10 +406,10 @@
     ptime acst_invalid2(acst_dst_start, time_duration(2,59,59)); //invalid time label
     ptime acst_notdst1(acst_dst_start, time_duration(1,59,59));   //not ds 
     ptime acst_isdst1(acst_dst_start, time_duration(3,0,0));   //always dst
-    ptime acst_isdst2(acst_dst_end, time_duration(0,59,59)); //is dst
-    ptime acst_amgbig1(acst_dst_end, time_duration(1,0,0));   //ambiguous
-    ptime acst_amgbig2(acst_dst_end, time_duration(1,59,59));   //ambiguous 
-    ptime acst_notdst2(acst_dst_end, time_duration(2,0,0));   //always not dst
+    ptime acst_isdst2(acst_dst_end, time_duration(1,59,59)); //is dst
+    ptime acst_amgbig1(acst_dst_end, time_duration(2,0,0));   //ambiguous
+    ptime acst_amgbig2(acst_dst_end, time_duration(2,59,59));   //ambiguous 
+    ptime acst_notdst2(acst_dst_end, time_duration(3,0,0));   //always not dst
     
 //     std::cout << "acst dst_start: " << acst_dst_calc::local_dst_start_day(2002)
 //               << std::endl;

Modified: boost/trunk/libs/date_time/test/posix_time/testlocal_adjustor.cpp
===================================================================
--- boost/trunk/libs/date_time/test/posix_time/testlocal_adjustor.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/date_time/test/posix_time/testlocal_adjustor.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2002,2003 CrystalClear Software, Inc.
+/* Copyright (c) 2002,2003, 2007 CrystalClear Software, Inc.
  * Use, modification and distribution is subject to the 
  * Boost Software License, Version 1.0. (See accompanying
  * file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
@@ -141,10 +141,21 @@
     check("check us_local_adjustor3", t7c == t7a);
   }
 
-//   std::cout << to_simple_string(t7) << " in Arizona is " 
-//             << to_simple_string(t8) << " UTC time "
-//             << std::endl;
+  {
+    ptime t7a(date(2007,Mar,11), hours(4)); 
+    ptime t7b = us_eastern3::local_to_utc(t7a);
+    ptime t7c = us_eastern3::utc_to_local(t7b);
+    //converted to local then back ot utc
+    check("check us_local_adjustor3 2007", t7c == t7a);
+  }
 
+  {
+    ptime t7a(date(2007,Mar,11), hours(3)); 
+    ptime t7b = us_eastern3::local_to_utc(t7a);
+    ptime t7c = us_eastern3::utc_to_local(t7b);
+    //converted to local then back ot utc
+    check("check us_local_adjustor3 2007 a", t7c == t7a);
+  }
 
   //still experimental
   typedef boost::date_time::dynamic_local_time_adjustor<ptime, us_dst> lta;
@@ -157,6 +168,9 @@
 //   check("check dst offset",   adjustor.utc_offset(true)==hours(-6));
   
 
+  check("dst start", lta::local_dst_start_day(2007) == date(2007,Mar,11));
+  check("dst end",   lta::local_dst_end_day(2007) == date(2007,Nov,4));
+
   return printTestStats();
 
 }

Modified: boost/trunk/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp
===================================================================
--- boost/trunk/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/date_time/test/posix_time/testmicrosec_time_clock.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -50,7 +50,7 @@
     check("seconds match", 
           t1.time_of_day().minutes() == t2.time_of_day().minutes());
     check("hours date", t1.date() == t2.date());
-    if( !check("last is less", last < t2) ) {
+    if( !check("last is less", last <= t2) ) {
       std::cout << to_simple_string(last) << " < " 
         << to_simple_string(t2) << std::endl;
     }
@@ -91,8 +91,8 @@
     check("seconds match", 
           t1.time_of_day().minutes() == t2.time_of_day().minutes());
     check("hours date", t1.date() == t2.date());
-    //check("last is less", last < t2);
-    if( !check("last is less", last < t2) ) {
+    //following check might be equal on a really fast machine
+    if( !check("last is less", last <= t2) ) {
       std::cout << to_simple_string(last) << " < " 
         << to_simple_string(t2) << std::endl;
     }

Modified: boost/trunk/libs/date_time/xmldoc/changes.xml
===================================================================
--- boost/trunk/libs/date_time/xmldoc/changes.xml	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/date_time/xmldoc/changes.xml	2007-03-26 21:47:29 UTC (rev 14044)
@@ -23,14 +23,58 @@
       </thead>
       <tbody>
         <row>
+          <entry>Feature</entry>
+          <entry>
+             Updated the data in the date_time_zonespec.csv file to reflect new US/Canada 
+             daylight savings time rules for 2007.  If you upgrade to the new file, be aware
+             that the library will only give correct answers for current/future date
+             conversions.  So if you are converting dates from earlier years the answers 
+             will reflect current time zone rules not past rules.  The library doesn't support 
+             historic timezone rules presently. 
+          </entry>
+        </row>
+        <row>
+          <entry>Feature</entry>
+          <entry>
+              Two other dst calculation features have also been update to reflect the new
+              US/Canada timzone rules. This is the boost::date_time::us_dst_rules and
+              dst_calc_engine.  While the us_dst_rules is officially deprecated, a patch
+              by Graham Bennett has been applied which allows this class to work correctly
+              for both historical and future dates.  The dst_calc_engine was updated to also
+              work for historical and future times.  This allows the various local_adjustor
+              classes to work correctly.  There was an interface change for classes using the
+              dst_calc_engine with custom dst traits classes.  The traits classes signatures
+              changed to take a 'year' parameter on most of the methods such as end_month.
+              In addition,  2 new functions are needed on the traits classes:
+                   <code>static date_type local_dst_start_day(year_type year)</code> and
+                   <code>static date_type local_dst_end_day(year_type year)</code>.
+              Implementers should see <code>date_time/local_timezone_defs.hpp</code> for
+              examples.
+          </entry>
+        </row>
+
+        <row>
           <entry>Bug Fix</entry>
+          <entry>Fix DST traits for Austrialia (sf# 1672139) to set end of DST at 3:00 am instead of 2:00 am.
+                
+          </entry>
+        </row>
+
+        <row>
+          <entry>Bug Fix</entry>
           <entry>Fix a problem with potential linking error with multiple definitions due
                  to I/O code.
           </entry>
         </row>
-
         <row>
           <entry>Bug Fix</entry>
+          <entry>Changed serialization code in both greg_serialize.hpp and time_serialize.hpp
+                 to eliminate warnings due to unused variables for version and file_version.
+                 Thanks to Caleb Epstein for the patch suggestion.
+          </entry>
+        </row>
+        <row>
+          <entry>Bug Fix</entry>
           <entry>Fix regression errors that showed up under FreeBSD with GCC and the 
                  LANG environment set to russian -- changed parser to use classic 
                  locale instead of blank locale.
@@ -59,11 +103,6 @@
           </entry>
         </row>
 
-        <row>
-          <entry>Bug Fix</entry>
-          <entry>
-          </entry>
-        </row>
 
         <row>
           <entry>Bug Fix</entry>

Modified: boost/trunk/libs/functional/hash/test/hash_float_test.cpp
===================================================================
--- boost/trunk/libs/functional/hash/test/hash_float_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/functional/hash/test/hash_float_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -125,12 +125,17 @@
     BOOST_TEST(x1(half_max) != x1(three_quarter_max));
     BOOST_TEST(x1(three_quarter_max) == x1(three_quarter_max));
 
+// Intel with gcc stdlib sometimes segfaults on calls to asin and acos.
+#if !((defined(__INTEL_COMPILER) || defined(__ICL) || \
+        defined(__ICC) || defined(__ECC)) && \
+    (defined(__GLIBCPP__) || defined(__GLIBCXX__)))
     T v1 = asin((T) 1);
     T v2 = acos((T) 0);
     if(v1 == v2)
         BOOST_TEST(x1(v1) == x1(v2));
     BOOST_TEST(x1(v1) == HASH_NAMESPACE::hash_value(v1));
     BOOST_TEST(x1(v2) == HASH_NAMESPACE::hash_value(v2));
+#endif
 
     BOOST_TEST(x1(std::numeric_limits<T>::epsilon()) ==
             HASH_NAMESPACE::hash_value(std::numeric_limits<T>::epsilon()));

Modified: boost/trunk/libs/graph/doc/eg1-iso.cpp
===================================================================
--- boost/trunk/libs/graph/doc/eg1-iso.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/graph/doc/eg1-iso.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -102,5 +102,5 @@
 int test_main(int, char* [])
 {
   test_isomorphism();
-  return EXIT_SUCCESS;
+  return boost::report_errors();
 }

Modified: boost/trunk/libs/integer/test/integer_mask_test.cpp
===================================================================
--- boost/trunk/libs/integer/test/integer_mask_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/integer/test/integer_mask_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -19,16 +19,16 @@
 #include <iostream>  // for std::cout (std::endl indirectly)
 
 
-#define PRIVATE_HIGH_BIT_SLOW_TEST(v)  BOOST_TEST( ::boost::high_bit_mask_t< \
+#define PRIVATE_HIGH_BIT_SLOW_TEST(v)  BOOST_CHECK( ::boost::high_bit_mask_t< \
  (v) >::high_bit == (1ul << (v)) );
-#define PRIVATE_HIGH_BIT_FAST_TEST(v)  BOOST_TEST( ::boost::high_bit_mask_t< \
+#define PRIVATE_HIGH_BIT_FAST_TEST(v)  BOOST_CHECK( ::boost::high_bit_mask_t< \
  (v) >::high_bit_fast == (1ul << (v)) );
 #define PRIVATE_HIGH_BIT_TEST(v)  do { PRIVATE_HIGH_BIT_SLOW_TEST(v); \
  PRIVATE_HIGH_BIT_FAST_TEST(v); } while (false)
 
-#define PRIVATE_LOW_BITS_SLOW_TEST(v)  BOOST_TEST( ::boost::low_bits_mask_t< \
+#define PRIVATE_LOW_BITS_SLOW_TEST(v)  BOOST_CHECK( ::boost::low_bits_mask_t< \
  (v) >::sig_bits == ((1ul << (v)) - 1) );
-#define PRIVATE_LOW_BITS_FAST_TEST(v)  BOOST_TEST( ::boost::low_bits_mask_t< \
+#define PRIVATE_LOW_BITS_FAST_TEST(v)  BOOST_CHECK( ::boost::low_bits_mask_t< \
  (v) >::sig_bits_fast == ((1ul << (v)) - 1) );
 #define PRIVATE_LOW_BITS_TEST(v)  do { PRIVATE_LOW_BITS_SLOW_TEST(v); \
  PRIVATE_LOW_BITS_FAST_TEST(v); } while (false)

Modified: boost/trunk/libs/integer/test/static_log2_test.cpp
===================================================================
--- boost/trunk/libs/integer/test/static_log2_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/integer/test/static_log2_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -20,7 +20,7 @@
 
 
 // Macros to compact code
-#define PRIVATE_LB_TEST( v, e )  BOOST_TEST( ::boost::static_log2<v>::value == e )
+#define PRIVATE_LB_TEST( v, e )  BOOST_CHECK( ::boost::static_log2<v>::value == e )
 
 #define PRIVATE_PRINT_LB( v )    ::std::cout << "boost::static_log2<" << (v) \
  << "> = " << ::boost::static_log2< (v) >::value << '.' << ::std::endl

Modified: boost/trunk/libs/integer/test/static_min_max_test.cpp
===================================================================
--- boost/trunk/libs/integer/test/static_min_max_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/integer/test/static_min_max_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -11,7 +11,7 @@
 //  23 Sep 2001  Initial version (Daryle Walker)
 
 #define  BOOST_INCLUDE_MAIN
-#include <boost/test/test_tools.hpp>  // for main, BOOST_TEST
+#include <boost/test/test_tools.hpp>  // for main, BOOST_CHECK
 
 #include <boost/cstdlib.hpp>                 // for boost::exit_success
 #include <boost/integer/static_min_max.hpp>  // for boost::static_signed_min, etc.
@@ -37,57 +37,57 @@
     // Two positives
     cout << "Doing tests with two positive values." << endl;
 
-    BOOST_TEST( (static_signed_min< 9, 14>::value) ==  9 );
-    BOOST_TEST( (static_signed_max< 9, 14>::value) == 14 );
-    BOOST_TEST( (static_signed_min<14,  9>::value) ==  9 );
-    BOOST_TEST( (static_signed_max<14,  9>::value) == 14 );
+    BOOST_CHECK( (static_signed_min< 9, 14>::value) ==  9 );
+    BOOST_CHECK( (static_signed_max< 9, 14>::value) == 14 );
+    BOOST_CHECK( (static_signed_min<14,  9>::value) ==  9 );
+    BOOST_CHECK( (static_signed_max<14,  9>::value) == 14 );
 
-    BOOST_TEST( (static_unsigned_min< 9, 14>::value) ==  9 );
-    BOOST_TEST( (static_unsigned_max< 9, 14>::value) == 14 );
-    BOOST_TEST( (static_unsigned_min<14,  9>::value) ==  9 );
-    BOOST_TEST( (static_unsigned_max<14,  9>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_min< 9, 14>::value) ==  9 );
+    BOOST_CHECK( (static_unsigned_max< 9, 14>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_min<14,  9>::value) ==  9 );
+    BOOST_CHECK( (static_unsigned_max<14,  9>::value) == 14 );
 
     // Two negatives
     cout << "Doing tests with two negative values." << endl;
 
-    BOOST_TEST( (static_signed_min<  -8, -101>::value) == -101 );
-    BOOST_TEST( (static_signed_max<  -8, -101>::value) ==   -8 );
-    BOOST_TEST( (static_signed_min<-101,   -8>::value) == -101 );
-    BOOST_TEST( (static_signed_max<-101,   -8>::value) ==   -8 );
+    BOOST_CHECK( (static_signed_min<  -8, -101>::value) == -101 );
+    BOOST_CHECK( (static_signed_max<  -8, -101>::value) ==   -8 );
+    BOOST_CHECK( (static_signed_min<-101,   -8>::value) == -101 );
+    BOOST_CHECK( (static_signed_max<-101,   -8>::value) ==   -8 );
 
     // With zero
     cout << "Doing tests with zero and a positive or negative value." << endl;
 
-    BOOST_TEST( (static_signed_min< 0, 14>::value) ==  0 );
-    BOOST_TEST( (static_signed_max< 0, 14>::value) == 14 );
-    BOOST_TEST( (static_signed_min<14,  0>::value) ==  0 );
-    BOOST_TEST( (static_signed_max<14,  0>::value) == 14 );
+    BOOST_CHECK( (static_signed_min< 0, 14>::value) ==  0 );
+    BOOST_CHECK( (static_signed_max< 0, 14>::value) == 14 );
+    BOOST_CHECK( (static_signed_min<14,  0>::value) ==  0 );
+    BOOST_CHECK( (static_signed_max<14,  0>::value) == 14 );
 
-    BOOST_TEST( (static_unsigned_min< 0, 14>::value) ==  0 );
-    BOOST_TEST( (static_unsigned_max< 0, 14>::value) == 14 );
-    BOOST_TEST( (static_unsigned_min<14,  0>::value) ==  0 );
-    BOOST_TEST( (static_unsigned_max<14,  0>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_min< 0, 14>::value) ==  0 );
+    BOOST_CHECK( (static_unsigned_max< 0, 14>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_min<14,  0>::value) ==  0 );
+    BOOST_CHECK( (static_unsigned_max<14,  0>::value) == 14 );
 
-    BOOST_TEST( (static_signed_min<   0, -101>::value) == -101 );
-    BOOST_TEST( (static_signed_max<   0, -101>::value) ==    0 );
-    BOOST_TEST( (static_signed_min<-101,    0>::value) == -101 );
-    BOOST_TEST( (static_signed_max<-101,    0>::value) ==    0 );
+    BOOST_CHECK( (static_signed_min<   0, -101>::value) == -101 );
+    BOOST_CHECK( (static_signed_max<   0, -101>::value) ==    0 );
+    BOOST_CHECK( (static_signed_min<-101,    0>::value) == -101 );
+    BOOST_CHECK( (static_signed_max<-101,    0>::value) ==    0 );
 
     // With identical
     cout << "Doing tests with two identical values." << endl;
 
-    BOOST_TEST( (static_signed_min<0, 0>::value) == 0 );
-    BOOST_TEST( (static_signed_max<0, 0>::value) == 0 );
-    BOOST_TEST( (static_unsigned_min<0, 0>::value) == 0 );
-    BOOST_TEST( (static_unsigned_max<0, 0>::value) == 0 );
+    BOOST_CHECK( (static_signed_min<0, 0>::value) == 0 );
+    BOOST_CHECK( (static_signed_max<0, 0>::value) == 0 );
+    BOOST_CHECK( (static_unsigned_min<0, 0>::value) == 0 );
+    BOOST_CHECK( (static_unsigned_max<0, 0>::value) == 0 );
 
-    BOOST_TEST( (static_signed_min<14, 14>::value) == 14 );
-    BOOST_TEST( (static_signed_max<14, 14>::value) == 14 );
-    BOOST_TEST( (static_unsigned_min<14, 14>::value) == 14 );
-    BOOST_TEST( (static_unsigned_max<14, 14>::value) == 14 );
+    BOOST_CHECK( (static_signed_min<14, 14>::value) == 14 );
+    BOOST_CHECK( (static_signed_max<14, 14>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_min<14, 14>::value) == 14 );
+    BOOST_CHECK( (static_unsigned_max<14, 14>::value) == 14 );
 
-    BOOST_TEST( (static_signed_min< -101, -101>::value) == -101 );
-    BOOST_TEST( (static_signed_max< -101, -101>::value) == -101 );
+    BOOST_CHECK( (static_signed_min< -101, -101>::value) == -101 );
+    BOOST_CHECK( (static_signed_max< -101, -101>::value) == -101 );
 
     return boost::exit_success;
 }

Modified: boost/trunk/libs/iostreams/build/Jamfile.v2
===================================================================
--- boost/trunk/libs/iostreams/build/Jamfile.v2	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/iostreams/build/Jamfile.v2	2007-03-26 21:47:29 UTC (rev 14044)
@@ -32,7 +32,7 @@
 # main target and returns it. If compression is disabled, returns nothing.
 # The 'sources' argument is the list of sources names for the library,
 # which will be used if building the library.
-rule create-library ( library-name : windows-name unix-name : sources + )
+rule create-library ( library-name : windows-name unix-name : sources + : requirements * )
 {
     local LIB = $(library-name:U) ;
     if ! $(library-name) in zlib bzip2
@@ -68,13 +68,14 @@
             $(LIB)_INCLUDE = $($(LIB)_SOURCE) ;
         }
         
-        # Should be use prebuilt library or built it owselfs?        
+        # Should we use prebuilt library or build it ourselves?        
         if $($(LIB)_SOURCE)
         {
             return [ lib boost_$(library-name) 
               : $($(LIB)_SOURCE)/$(sources).c
               : <include>$($(LIB)_INCLUDE)
 	        <location-prefix>$(LIB:L)
+	        $(requirements)
               :
               : <include>$($(LIB)_INCLUDE)
               ] ;                        
@@ -115,7 +116,8 @@
 
 local sources ;
 local z = [ create-library zlib : zll z : adler32 compress 
-     crc32 deflate gzio infback inffast inflate inftrees trees uncompr zutil ] ;
+     crc32 deflate gzio infback inffast inflate inftrees trees uncompr zutil :
+     <link>shared:<define>ZLIB_DLL ] ;
 
 if $(z)
 {
@@ -124,7 +126,8 @@
 
 local bz2 = [ create-library bzip2 : libbz2 bz2 : 
     blocksort bzlib compress crctable decompress huffman 
-    mk251 randtable ] ;
+    mk251 randtable :
+    <link>shared:<def-file>$(BZIP2_SOURCE)/libbz2.def ] ;
 
 if $(bz2)
 {

Modified: boost/trunk/libs/iterator/test/filter_iterator_test.cpp
===================================================================
--- boost/trunk/libs/iterator/test/filter_iterator_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/iterator/test/filter_iterator_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -268,6 +268,5 @@
         dummyT(1), dummyT(4));
 
 
-  std::cout << "test successful " << std::endl;
-  return boost::exit_success;
+    return boost::report_errors();
 }

Modified: boost/trunk/libs/iterator/test/iterator_facade.cpp
===================================================================
--- boost/trunk/libs/iterator/test/iterator_facade.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/iterator/test/iterator_facade.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -6,7 +6,6 @@
 
 #include <boost/iterator/iterator_facade.hpp>
 #include <boost/iterator/new_iterator_tests.hpp>
-#include <boost/assert.hpp>
 
 // This is a really, really limited test so far.  All we're doing
 // right now is checking that the postfix++ proxy for single-pass
@@ -95,7 +94,7 @@
     state = 3;
     boost::readable_iterator_test(counter_iterator<proxy>(&state), 3);
     boost::writable_iterator_test(counter_iterator<proxy>(&state), 9, 7);
-    BOOST_ASSERT(state == 8);
+    BOOST_TEST(state == 8);
 
     // test for a fix to http://tinyurl.com/zuohe
     // These two lines should be equivalent (and both compile)
@@ -103,5 +102,5 @@
     (*p).mutator();
     p->mutator();
     
-    return 0;
+    return boost::report_errors();
 }

Modified: boost/trunk/libs/iterator/test/reverse_iterator_test.cpp
===================================================================
--- boost/trunk/libs/iterator/test/reverse_iterator_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/iterator/test/reverse_iterator_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -170,6 +170,5 @@
 #endif
   }
 
-  std::cout << "test successful " << std::endl;
-  return boost::exit_success;
+  return boost::report_errors();
 }

Modified: boost/trunk/libs/iterator/test/transform_iterator_test.cpp
===================================================================
--- boost/trunk/libs/iterator/test/transform_iterator_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/iterator/test/transform_iterator_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -244,5 +244,5 @@
     );
   }
 
-  return 0;
+  return boost::report_errors();
 }

Modified: boost/trunk/libs/multi_array/test/storage_order_convert.cpp
===================================================================
--- boost/trunk/libs/multi_array/test/storage_order_convert.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/multi_array/test/storage_order_convert.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -35,5 +35,5 @@
   BOOST_TEST(fortran_storage ==
              (general_storage_order<5>) fortran_storage_order());
 
-  return boost::exit_success;
+  return boost::report_errors();
 }

Modified: boost/trunk/libs/multi_index/doc/tutorial/creation.html
===================================================================
--- boost/trunk/libs/multi_index/doc/tutorial/creation.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/multi_index/doc/tutorial/creation.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -263,7 +263,7 @@
 <p>
 Iterators to indices of a <code>multi_index_container</code> can also be
 serialized. Serialization of iterators must be done only after serializing
-its corresponding container.
+their corresponding container.
 </p>
 
 <p>
@@ -285,9 +285,9 @@
 
 <br>
 
-<p>Revised February 6th 2006</p>
+<p>Revised February 27th 2007</p>
 
-<p>&copy; Copyright 2003-2006 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
+<p>&copy; Copyright 2003-2007 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
 Distributed under the Boost Software 
 License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
 LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">

Modified: boost/trunk/libs/numeric/conversion/doc/conversion_traits.html
===================================================================
--- boost/trunk/libs/numeric/conversion/doc/conversion_traits.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/numeric/conversion/doc/conversion_traits.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -297,9 +297,12 @@
 
 <H2><A NAME="examples">Examples</A></H2>
 <BLOCKQUOTE>
-  <PRE>#include &lt;boost/numeric/conversion_traits.hpp&gt;
+  <PRE>#include &lt;cassert&gt;
+#include &lt;typeinfo&gt;
+#include &lt;boost/numeric/conversion/conversion_traits.hpp&gt;
 
-int main() {
+int main()
+{
 
   // A trivial conversion.
   typedef boost::numeric::conversion_traits&lt;short,short&gt; Short2Short_Traits ;
@@ -307,24 +310,24 @@
 
   // A subranged conversion.
   typedef boost::numeric::conversion_traits&lt;double,unsigned int&gt; UInt2Double_Traits ;
-  assert (  UInt2Double_Traits::mixture::value == boost::numeric::integral_to_float ) ;
+  assert (  UInt2Double_Traits::int_float_mixture::value == boost::numeric::integral_to_float ) ;
   assert (  UInt2Double_Traits::sign_mixture::value == boost::numeric::unsigned_to_signed ) ;
   assert ( !UInt2Double_Traits::subranged::value ) ;
   assert ( typeid(UInt2Double_Traits::supertype) == typeid(double) ) ;
   assert ( typeid(UInt2Double_Traits::subtype) == typeid(unsigned int) ) ;
 
   // A doubly subranged conversion.
-  assert (    boost::numeric::conversion_traits&lt;short, unsigned short&gt;::subranged::value
-           &amp;&amp; boost::numeric::conversion_traits&lt;unsigned short, short&gt;::subranged::value
-         )
+  assert ( (boost::numeric::conversion_traits&lt;short, unsigned short&gt;::subranged::value) );
+  assert ( (boost::numeric::conversion_traits&lt;unsigned short, short&gt;::subranged::value) );
 
   return 0;
-}</PRE>
+}
+</PRE>
    </BLOCKQUOTE>
 <HR>
 <P>Back to <A HREF="index.html">Numeric Conversion library index</A></P>
 <HR>
-<P>Revised 16 May 2005</P>
+<P>Revised 23 November 2006</P>
 <p>© Copyright Fernando Luis Cacciola Carballal, 2004</p>
 <p> Use, modification, and distribution are subject to the Boost Software
 License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">

Modified: boost/trunk/libs/numeric/conversion/doc/converter.html
===================================================================
--- boost/trunk/libs/numeric/conversion/doc/converter.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/numeric/conversion/doc/converter.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -241,11 +241,12 @@
 <HR>
 <H2><A NAME="examples">Examples</A></H2>
 <BLOCKQUOTE>
-  <PRE>#include &lt;boost/numeric/conversion/converter.hpp&gt;
+  <PRE>  #include &lt;cassert&gt;
+  #include &lt;boost/numeric/conversion/converter.hpp&gt;
 
-int main() {
+  int main() {
 
-  typedef boost::numeric::converter&lt;int,doublegt; Double2Int ;
+  typedef boost::numeric::converter&lt;int,double&gt; Double2Int ;
 
   int x = Double2Int::convert(2.0);
   assert ( x == 2 );

Modified: boost/trunk/libs/numeric/conversion/doc/numeric_cast.html
===================================================================
--- boost/trunk/libs/numeric/conversion/doc/numeric_cast.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/numeric/conversion/doc/numeric_cast.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -52,10 +52,10 @@
 	 <H2><A NAME="numeric_cast"><CODE>numeric_cast</CODE></A></H2>
 	 <BLOCKQUOTE>
 		<PRE>template&lt;typename Target, typename Source&gt; inline
-typename boost::numeric::converter&lt;Traget,Source&gt;::result_type
+typename boost::numeric::converter&lt;Target,Source&gt;::result_type
 numeric_cast ( Source arg )
 {
-   return boost::numeric::converter&lt;Traget,Source&gt;::convert(arg);
+   return boost::numeric::converter&lt;Target,Source&gt;::convert(arg);
 }
 </PRE> </BLOCKQUOTE>
 	 <P>numeric_cast returns the result of converting a value of type Source to a value of type
@@ -67,18 +67,21 @@
 	 <P>The following example performs some typical conversions between numeric
 		types: </P>
 	 <BLOCKQUOTE>
-		<PRE>#include &lt;boost/numeric_cast.hpp&gt;
+		<PRE>#include &lt;boost/numeric/conversion/cast.hpp&gt;
 #include &lt;iostream&gt;
 
 int main()
 {
    using boost::numeric_cast;
-   using boost::bad_numeric_cast;
-   using boost::positive_overflow;
-   using boost::negative_overflow;
-      try {
+   
+   using boost::numeric::bad_numeric_cast;
+   using boost::numeric::positive_overflow;
+   using boost::numeric::negative_overflow;
+   
+   try 
+   {
       int i=42;
-      short s=numeric_cast&lt;short&gt;(i);
+      short s=numeric_cast&lt;short&gt;(i); // This conversion succeeds (is in range)
    }
    catch(negative_overflow&amp; e) {
       std::cout &lt;&lt; e.what();
@@ -87,32 +90,40 @@
       std::cout &lt;&lt; e.what();
    }
 
-   try {
+   try 
+   {
       float f=-42.1234;
-      // This will cause a boost::negative_underflow exception to be thrown
+      
+      // This will cause a boost::numeric::negative_overflow exception to be thrown
       unsigned int i=numeric_cast&lt;unsigned int&gt;(f);
+   }
+   catch(bad_numeric_cast&amp; e) {
+      std::cout &lt;&lt; e.what();
+   }
 
-      double d=f+numeric_cast&lt;double&gt;(i);
+   double d= f + numeric_cast&lt;double&gt;(123); // int -> double
 
-      unsigned long l=std::numeric_limits&lt;unsigned long&gt;::max();
-      // This works, because unsigned integral types cannot cause overflow.
-      unsigned char c=numeric_cast&lt;unsigned char&gt;(l);
-
-      unsigned short us=std::numeric_limits&lt;unsigned short&gt;::max();
-      // This will cause an positive_overflow exception to be thrown
-      short s=numeric_cast&lt;short&gt;(us);
-
+   unsigned long l=std::numeric_limits&lt;unsigned long&gt;::max();
+      
+   try 
+   {
+     // This will cause a boost::numeric::positive_overflow exception to be thrown
+     // NOTE: *operations* on unsigned integral types cannot cause overflow
+     // but *conversions* to a signed type ARE range checked by numeric_cast.
+     
+     unsigned char c=numeric_cast&lt;unsigned char&gt;(l);
    }
-   catch(bad_numeric_cast&amp; e) {
+   catch(positive_overflow&amp; e) {
       std::cout &lt;&lt; e.what();
    }
 
+
    return 0;
 }</PRE> </BLOCKQUOTE> <BR> <BR> <HR>
 <HR>
 <P>Back to <A HREF="index.html">Numeric Conversion library index</A></P>
 <HR>
-<P>Revised 23 June 2004</P>
+<P>Revised 20 May 2006</P>
 <p>© Copyright Boost 1999</p>
 <p>© Copyright Fernando Luis Cacciola Carballal, 1999,2004</p>
 <p> Use, modification, and distribution are subject to the Boost Software

Modified: boost/trunk/libs/optional/doc/optional.html
===================================================================
--- boost/trunk/libs/optional/doc/optional.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/optional/doc/optional.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -24,6 +24,7 @@
   <DT><A HREF="#examples">Examples</A></DT>
   <DT><A HREF="#ref">Optional references</A></DT>
   <DT><A HREF="#refassign">Rebinding semantics for assignment of optional references</A></DT>
+  <DT><A HREF="#none">none_t</A></DT>
   <DT><A HREF="#inplace">In-Place Factories</A></DT>
   <DT><A HREF="#bool">A note about optional&lt;bool&gt;</A></DT>
   <DT><A HREF="#exsafety">Exception Safety Guarantees</A></DT>
@@ -139,7 +140,7 @@
 <u>purpose</u> of optional&lt;T&gt; suggests
 an alternative model: a <i>container</i> that either has a value of T or nothing.
 </p>
-<p>As of this writing I don't know of any precedence for a variable-size fixed-capacity (of 1)
+<p>As of this writing I don't know of any precedent for a variable-size fixed-capacity (of 1)
 stack-based container model for optional values, yet I believe this is the consequence of
 the lack of practical implementations of such a container rather than an inherent shortcoming
 of the container model.</p>
@@ -324,6 +325,8 @@
 
     optional ( T const&amp; v ) ;
 
+    optional ( bool condition, T const&amp; v ) ;  <u><i>[new in 1.34]</u></i>
+    
     optional ( optional const&amp; rhs ) ;
 
     template&lt;class U&gt; explicit optional ( optional&lt;U&gt; const&amp; rhs ) ;
@@ -347,6 +350,8 @@
     T const& get() const ;
     T&       get() ;
 
+    T const&amp; get_value_or( T const&amp; default ) const ;  <u><i>[new in 1.34]</u></i>
+    
     T const* operator -&gt;() const ;
     T*       operator -&gt;() ;
 
@@ -380,6 +385,36 @@
 
 template&lt;class T&gt; inline bool operator >= ( optional&lt;T&gt; const& x, optional&lt;T&gt; const& y ) ;
 
+template&lt;class T&gt; inline bool operator == ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator != ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator <  ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator >  ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator <= ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator >= ( optional&lt;T&gt; const& x, none_t n ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator == ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator != ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator <  ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator >  ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator <= ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline bool operator >= ( none_t n, optional&lt;T&gt; const& y ) ; <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline optional&lt;T&gt; make_optional ( T const& v ) ;  <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline optional&lt;T&gt; make_optional ( bool condition, T const& v ) ;  <u><i>[new in 1.34]</u></i>
+
+template&lt;class T&gt; inline T const&amp; get_optional_value_or ( optional&lt;T&gt; const& opt, T const& default ) ;  <u><i>[new in 1.34]</u></i>
+
 template&lt;class T&gt; inline T const& get ( optional&lt;T&gt; const& opt ) ;
 
 template&lt;class T&gt; inline T& get ( optional&lt;T&gt; & opt ) ;
@@ -436,7 +471,7 @@
 
 <pre>optional&lt;T&gt;::optional( none_t );</pre>
 <blockquote>
-<p><b>Effect:</b> Constructs an <b>optional </b>uninitialized.</p>
+<p><b>Effect:</b> Constructs an <b>optional</b> uninitialized.</p>
 <p><b>Postconditions:</b> <b>*this</b> is <u>uninitialized</u>.</p>
 <p><b>Throws:</b> Nothing.</p>
 <p><b>Notes:</b></p>
@@ -448,9 +483,11 @@
 </blockquote>
 <p><b>Example:</b></p>
   <blockquote>
-    <pre>#include &lt;boost/none.hpp&gt;</pre>
-    <pre>optional&lt;T&gt; n(none) ;
-assert ( !n ) ;</pre>
+<pre>
+#include &lt;boost/none.hpp&gt;
+optional&lt;int&gt; n(boost::none) ;
+assert ( !n ) ;
+</pre>
 </blockquote>
 </blockquote>
 
@@ -459,7 +496,6 @@
 <pre>optional&lt;T <i>(not a ref)</i>&gt;::optional( T const&amp; v )</pre>
 <blockquote>
 <p><b>Effect:</b> Directly-Constructs an <b>optional</b>.</p>
-<!-- TemplateName: general/sy_footer_inc.isml -->
 <p><b>Postconditions:</b> <b>*this</b> is <u>initialized</u> and its value is a <i>copy</i> of 'v'.</p>
 <p><b>Throws:</b> Whatever T::T( T const&amp; ) throws.</p>
 <p><b>Notes: </b> T::T( T const&amp; ) is called.</p>
@@ -468,9 +504,11 @@
 </p>
 <p><b>Example:</b></p>
 <blockquote>
-<pre>T v;
+<pre>
+T v;
 optional&lt;T&gt; opt(v);
-assert ( *opt == v ) ;</pre>
+assert ( *opt == v ) ;
+</pre>
 </blockquote>
 </blockquote>
 
@@ -484,17 +522,37 @@
 <p><b>Throws:</b> Nothing.</p>
 <p><b>Example:</b></p>
 <blockquote>
-<pre>T v;
+<pre>
+T v;
 T&amp; vref = v ;
 optional&lt;T&amp;&gt; opt(vref);
 assert ( *opt == v ) ;
 ++ v ; // mutate referee
-assert (*opt == v); </pre>
+assert (*opt == v); 
+</pre>
 </blockquote>
 </blockquote>
 
 <HR>
 
+<pre>optional&lt;T <i>(not a ref)</i>&gt;::optional( bool condition, T const&amp; v ) ;
+optional&lt;T&amp;&gt;           ::optional( bool condition, T&amp;       v ) ;
+</pre>
+
+<blockquote>
+<p>If <i>condition</i> is <code>true</code>, same as:</p>
+<pre>optional&lt;T <i>(not a ref)</i>&gt;::optional( T const&amp; v )
+optional&lt;T&amp;&gt;           ::optional( T&amp;       v )
+</pre>
+<p>otherwise, same as:</p>
+<pre>
+optional&lt;T <i>(not a ref)</i>&gt;::optional()
+optional&lt;T&amp;&gt;           ::optional()
+</pre>
+</blockquote>
+
+<HR>
+
 <pre>optional&lt;T <i>(not a ref)</i>&gt;::optional( optional const&amp; rhs );</pre>
 <blockquote>
 <p><b>Effect:</b> Copy-Constructs an <b>optional</b>.</p>
@@ -508,7 +566,8 @@
 </p>
 <p><b>Example:</b></p>
 <blockquote>
-        <pre>optional&lt;T&gt; uninit ;
+<pre>
+optional&lt;T&gt; uninit ;
 assert (!uninit);
 
 optional&lt;T&gt; uinit2 ( uninit ) ;
@@ -537,7 +596,8 @@
 reefer to the same object<b> </b>(they alias).</p>
 <p><b>Example:</b></p>
 <blockquote>
-        <pre>optional&lt;T&amp;&gt; uninit ;
+<pre>
+optional&lt;T&amp;&gt; uninit ;
 assert (!uninit);
 
 optional&lt;T&amp;&gt; uinit2 ( uninit ) ;
@@ -580,7 +640,8 @@
 <p><b>Example:</b></p>
 <blockquote>
 
-<pre>optional&lt;double&gt; x(123.4);
+<pre>
+optional&lt;double&gt; x(123.4);
 assert ( *x == 123.4 ) ;
 
 optional&lt;int&gt; y(x) ;
@@ -608,7 +669,8 @@
 <p><b>Example:</b></p>
 <blockquote>
 
-<pre>class C { C ( char, double, std::string ) ; } ;
+<pre>
+class C { C ( char, double, std::string ) ; } ;
 
 C v('A',123.4,&quot;hello&quot;);
 
@@ -624,6 +686,27 @@
 
 <HR>
 
+<pre>optional&amp; optional&lt;T</i>&gt;::operator= ( none_t n ) ;</pre>
+<blockquote>
+<p><b>Effect:</b> Same as opeator=(optional const&amp; rhs), when rhs is default-constructed (uninitialized).</p>
+<p><b>Postconditions:</b> <b>*this</b> is uninitialized</p>
+<p><b>Example:</b></p>
+<blockquote>
+<pre>
+#include &lt;boost/none.hpp&gt;
+
+optional&lt;int&gt; def ;
+optional&lt;int&gt; opt(123) ;
+
+opt = boost::none ;
+
+assert ( opt == def ) ;
+</pre>
+</blockquote>
+</blockquote>
+
+<HR>
+
 <pre>optional&amp; optional&lt;T <i>(not a ref)</i>&gt;::operator= ( T const&amp; rhs ) ;</pre>
 <blockquote>
 <p><b>Effect:</b> Assigns the value 'rhs' to an <b>optional</b>.</p>
@@ -639,7 +722,8 @@
 properly uninitialized]</p>
 <p><b>Example:</b></p>
 <blockquote>
-    <pre>T x;
+<pre>
+T x;
 optional&lt;T&gt; def ;
 optional&lt;T&gt; opt(x) ;
 
@@ -662,7 +746,8 @@
 new object. See <A HREF="#refassign">here</a> for details on this behavior.</p>
 <p><b>Example:</b></p>
 <blockquote>
-    <pre>int a = 1 ;
+<pre>
+int a = 1 ;
 int b = 2 ;
 T&amp; ra = a ;
 T&amp; rb = b ;
@@ -792,12 +877,11 @@
 <HR>
 <pre>void optional&lt;T&gt;::reset() ;</pre>
 <blockquote>
-<p><b>Deprecated: </b>Same as operator=( detail::none_t );</p>
+<p><b>Deprecated: </b>Same as operator=( none_t n);</p>
 </blockquote>
 
 <HR>
 
-
 <pre>T const&amp; optional&lt;T <i>(not a ref)</i>&gt;::operator*() const ;
 T&amp;       optional&lt;T<i> (not a ref)</i>&gt;::operator*();</pre>
 
@@ -828,7 +912,33 @@
 
 <HR>
 
+<pre>T const&amp; optional&lt;T <i>(not a ref)</i>&gt;::get_value_or( T const&amp; default) const ;
+T&amp;       optional&lt;T <i>(not a ref)</i>&gt;::get_value_or( T&amp;       default ) ;
 
+inline T const&amp; get_optional_value_or ( optional&lt;T<i> (not a ref)</i>&gt; const&amp; o, T const&amp; default ) ;
+inline T&amp;       get_optional_value_or ( optional&lt;T <i>(not a ref)</i>&gt;&amp;       o, T&amp;       default ) ;
+</pre>
+<blockquote>
+<p><b>Returns:</b> A reference to the contained value, if any, or <code>default</code></p>
+<p><b>Throws:</b> Nothing.</p>
+<p><b>Example:</b></p>
+<blockquote>
+    <pre>T v, z ;
+optional&lt;T&gt; def;
+T const&amp; y = def.get_value_or(z);
+assert ( y == z ) ;
+
+optional&lt;T&gt; opt ( v );
+T const&amp; u = get_optional_value_or(opt,z);
+assert ( u == v ) ;
+assert ( u != z ) ;
+</pre>
+  </blockquote>
+    <pre></pre>
+</blockquote>
+<HR>
+
+
 <pre>T const&amp; optional&lt;T&amp;&gt;::operator*() const ;
 T      &amp; optional&lt;T<i>&amp;</i>&gt;::operator*();</pre>
 
@@ -857,29 +967,39 @@
 
 <HR>
 
-<pre>T const* optional&lt;T <i>(not a ref)</i>&gt;::get_ptr() const ;
-T*       optional&lt;T <i>(not a ref)</i>&gt;::get_ptr() ;
+<pre>T const* optional&lt;T&gt;::get_ptr() const ;
+T*       optional&lt;T&gt;::get_ptr() ;
 
-inline T const* get_pointer ( optional&lt;T <i>(not a ref)</i>&gt; const&amp; ) ;
-inline T*       get_pointer ( optional&lt;T <i>(not a ref)</i>&gt; &amp;) ;
+inline T const* get_pointer ( optional&lt;T&gt; const&amp; ) ;
+inline T*       get_pointer ( optional&lt;T&gt; &amp;) ;
 </pre>
 <blockquote>
 <p><b>Returns:</b> If <b>*this</b> is initialized, a pointer to the contained
 value; else 0 (<i>null</i>).
 </p>
 <p><b>Throws:</b> Nothing.</p>
+<p><b>Notes:</b> If T is a reference type, the pointer is to the referenced object</p>
 <p><b>Notes:</b> The contained value is permanently stored within *this, so
-you should not hold nor delete this pointer
+you should not hold nor delete this pointer.
 </p>
 <p><b>Example:</b></p>
 <blockquote>
-    <pre>T v;
-optional&lt;T&gt; opt(v);
-optional&lt;T&gt; const copt(v);
-T* p = opt.get_ptr() ;
-T const* cp = copt.get_ptr();
+    <pre>int v=123;
+optional&lt;int&gt; opt(v);
+optional&lt;int&gt; const copt(v);
+int* p = opt.get_ptr() ;
+int const* cp = copt.get_ptr();
 assert ( p == get_pointer(opt) );
 assert ( cp == get_pointer(copt) ) ;
+
+int& rv = v ;
+optional&lt;int&amp;&gt; optr(rv);
+
+*(optr.get_ptr()) = 456 ;
+
+assert ( v == 456 );
+
+
 </pre>
 </blockquote>
 </blockquote>
@@ -888,13 +1008,14 @@
 <HR>
 
 
-<pre>T const* optional&lt;T <i>(not a ref)</i>&gt;::operator -&gt;() const ;
-T*       optional&lt;T <i>(not a ref)</i>&gt;::operator -&gt;()       ;
+<pre>T const* optional&lt;T&gt;::operator -&gt;() const ;
+T*       optional&lt;T&gt;::operator -&gt;()       ;
 </pre>
 <blockquote>
 <p><b>Requirements: *this</b> is initialized.</p>
 <p><b>Returns:</b> A pointer to the contained value.</p>
 <p><b>Throws:</b> Nothing.</p>
+<p><b>Notes:</b> If T is a reference type, the pointer is to the referenced object</p>
 <p><b>Notes:</b> The requirement is asserted via BOOST_ASSERT().</p>
 <p><b>Example:</b></p>
 <blockquote>
@@ -902,6 +1023,14 @@
 X x ;
 optional&lt;X&gt; opt (x);
 opt-&gt;mdata = 2 ;
+
+X& rx = x ;
+
+optional&lt;X&amp;&gt; optr (rx);
+optr-&gt;mdata = 4 ;
+
+assert ( x.mdata = 4 ) 
+
 </pre>
 </blockquote>
 </blockquote>
@@ -965,18 +1094,47 @@
 
 <HR>
 
+<pre>optional&lt;T <i>(not a ref)</i>&gt; make_optional( T const&amp; v )</pre>
+<blockquote>
+<p><b>Returns:</b> optional&lt;T&gt;(v) for the <i>deduced</i> type <code>T</code> of <code>v</code>.</p>
+<p><b>Example:</b></p>
+<blockquote>
+<pre>template&lt;class T&gt; void foo ( optional&lt;T&gt; const& opt ) ;
 
+foo ( make_optional(1+1) ) ; // Creates an optional&lt;int&gt;
+</blockquote>
+</blockquote>
+<HR>
+
+<pre>optional&lt;T <i>(not a ref)</i>&gt; make_optional( bool condition, T const&amp; v )</pre>
+<blockquote>
+<p><b>Returns:</b> optional&lt;T&gt;(condition,v) for the <i>deduced</i> type <code>T</code> of <code>v</code>.</p>
+<p><b>Example:</b></p>
+<blockquote>
+<pre>optional&lt;double&gt; calculate_foo()
+{
+  double val = compute_foo();
+  return make_optional(is_not_nan_and_finite(val),val);
+}
+
+optional&lt;double&gt; v = calculate_foo();
+if ( !v )
+  error("foo wasn't computed");
+</blockquote>
+</blockquote>
+
+<HR>
+
+
 <pre>bool operator == ( optional&lt;T&gt; const&amp x, optional&lt;T&gt const&amp y );</pre>
 <blockquote>
 <p><b>Returns:</b> If both <b>x</b> and <b>y</b> are initialied, <code>(*x == *y)</code>.
-If only x or y is initialized, <code>false</code>. If both are uninitialized, <code>true</code>.
-</p>
+If only x or y is initialized, <code>false</code>. If both are uninitialized, <code>true</code>. </p>
 <p><b>Throws:</b> Nothing.</p>
 <p><b>Notes:</b> Pointers have shallow relational operators while <b>optional</b> has
 deep relational operators. Do not use operator == directly in generic code
 which expect to be given either an optional&lt;T&gt; or a pointer;
-use <a href="../../utility/OptionalPointee.html#equal">equal_pointees()</a> instead
-</p>
+use <a href="../../utility/OptionalPointee.html#equal">equal_pointees()</a> instead </p>
 <p><b>Example:</b></p>
 <blockquote>
     <pre>T x(12);
@@ -1012,14 +1170,12 @@
 <blockquote>
 <p><b>Returns:</b> If <b>y</b> is not initialized, <code>false</code>.
 If <b>y</b> is initialized and <b>x</b> is not initialized, <code>true</code>.
-If both <b>x</b> and <b>y</b> are initialized, <code>(*x &lt; *y)</code>.
-</p>
+If both <b>x</b> and <b>y</b> are initialized, <code>(*x &lt; *y)</code>. </p>
 <p><b>Throws:</b> Nothing.</p>
 <p><b>Notes:</b> Pointers have shallow relational operators while <b>optional</b> has
 deep relational operators. Do not use operator &lt; directly in generic code
 which expect to be given either an optional&lt;T&gt; or a pointer;
-use <a href="../../utility/OptionalPointee.html#less">less_pointees()</a> instead
-</p>
+use <a href="../../utility/OptionalPointee.html#less">less_pointees()</a> instead </p>
 <p><b>Example:</b></p>
 <blockquote>
     <pre>T x(12);
@@ -1078,27 +1234,39 @@
 </blockquote>
 
 <HR>
+<pre>
+bool operator == ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator != ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator &lt;  ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator &gt;  ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator &lt;= ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator &gt;= ( optional&lt;T&gt; const&amp x, none_t n );
+bool operator == ( none_t n, optional&lt;T&gt; const&amp y );
+bool operator != ( none_t n, optional&lt;T&gt; const&amp y );
+bool operator &lt;  ( none_t n, optional&lt;T&gt; const&amp y );
+bool operator &gt;  ( none_t n, optional&lt;T&gt; const&amp y );
+bool operator &lt;= ( none_t n, optional&lt;T&gt; const&amp y );
+bool operator &gt;= ( none_t n, optional&lt;T&gt; const&amp y );
+</pre>
+<blockquote>
+  <p><b>Returns:</b> The result obtained by replacing the argument 'n' by optional&lt;T&gt;().</p>
+</blockquote>
+<HR>
 
 <pre>void swap ( optional&lt;T&gt;&amp x, optional&lt;T&gt&amp y );</pre>
 
 <blockquote>
-<p><b>Effect:</b> If both <b>x</b> and <b>y</b> are initialized, calls <code>swap(*x,*y)</code>
-using std::swap.<br>
-If only one is initialized, say x, calls: <code>y.reset(*x); x.reset();</code><br>
-If none is initialized, does nothing.
-</p>
+<p><b>Effect:</b> If both <b>x</b> and <b>y</b> are initialized, calls <code>swap(*x,*y)</code> using std::swap.<br>
+If only one is initialized, say x, calls: <code>y = *x; x = boost:none;</code><br>
+If none is initialized, does nothing. </p>
 <p><b>Postconditions:</b> The states of x and y interchanged.</p>
 <p><b>Throws:</b> If both are initialized, whatever swap(T&amp;,T&amp;) throws.
-If only one is initialized, whatever T::T ( T const&amp; ) throws.
-</p>
-<p><b>Notes:</b> If both are initialized, swap(T&amp;,T&amp;) is used <i>unqualified</i>
-but with std::swap introduced in scope.<br>
-If only one is initialized, T::~T() and T::T( T const& ) is called.
-</p>
+If only one is initialized, whatever T::T ( T const&amp; ) throws. </p>
+<p><b>Notes:</b> If both are initialized, swap(T&amp;,T&amp;) is used <i>unqualified</i> but with std::swap introduced in scope.<br>
+If only one is initialized, T::~T() and T::T( T const& ) is called. </p>
 <p><b>Exception Safety:</b> If both are initialized, this operation has the exception
 safety guarantees of swap(T&,T&).<br>
-If only one is initialized, it has the same <b>basic</b> guarantee as optional&lt;T&gt;::reset( T const& ).
-</p>
+If only one is initialized, it has the same <b>basic</b> guarantee as optional&lt;T&gt;::operator=( T const& ). </p>
 <p><b>Example:</b></p>
 <blockquote>
       <pre>T x(12);
@@ -1148,12 +1316,12 @@
 <pre>optional&lt;string&gt; name ;
 if ( database.open() )
 {
-&nbsp; name.reset ( database.lookup(employer_name) ) ;
+&nbsp; name = database.lookup(employer_name) ;
 }
 else
 {
 &nbsp; if ( can_ask_user )
-&nbsp;&nbsp;&nbsp; name.reset ( user.ask(employer_name) ) ;
+&nbsp;&nbsp;&nbsp; name = user.ask(employer_name) ;
 }
 
 if ( name )
@@ -1174,7 +1342,7 @@
 &nbsp;&nbsp;&nbsp; void clip_in_rect ( rect const&amp; rect )
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ....
-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_clipping_rect.reset ( rect ) ; // initialized here.
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_clipping_rect = rect ; // initialized here.
 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }
 
 &nbsp;&nbsp;&nbsp; void draw ( canvas& cvs )
@@ -1218,16 +1386,17 @@
   <li>Converting assignment</li>
   <li>InPlace construction</li>
   <li>InPlace assignment</li>
-  <li>Value-access via pointer</li>
 </ul>
 <p>Also, even though optional&lt;T&amp;&gt; treats it wrapped pseudo-object much as a real
 value, a true real reference is stored so aliasing will ocurr: </p>
 
 <ul>
-  <li>Copies of optional&lt;T&amp;&gt; will copy the references but all these references
+  <li>Copies of optional&lt;T&amp;&gt; copies the reference, but all copied references
   will nonetheless reefer to the same object.</li>
-  <li>Value-access will actually provide access to the referenced object rather
+  <li>Value-access provides access to the referenced object rather
   than the reference itself.</li>
+  <li>Pointer-access provides a pointer to the referenced object rather
+  than the reference itself.</li>
 </ul>
 
 <HR>
@@ -1254,8 +1423,7 @@
 b = 3 ;
 assert(ra!=b); // 'ra' is not rebound to 'b'
 </pre>
-<p>Now, if you assign to an <i>initialized</i> optional&lt;T&amp;&gt;, the effect is to <b>
-rebind</b> to the new object instead of assigning the referee. This is unlike 
+<p>Now, if you assign to an <i>initialized</i> optional&lt;T&amp;&gt;, the effect is to <b>rebind</b> to the new object instead of assigning the referee. This is unlike 
 bare C++ references.</p>
 <pre>int a = 1 ;
 int b = 2 ;
@@ -1311,6 +1479,13 @@
 
 <HR>
 
+<H2><A NAME="none">none_t</A></H2>
+<p>
+</p>
+
+
+<HR>
+
 <H2><A NAME="inplace">In-Place Factories</A></H2>
 <p>
 One of the typical problems with wrappers and containers is that their
@@ -1358,8 +1533,7 @@
 </pre>
 <p>A limitation of this method is that it doesn't scale well to wrapped objects with multiple
 constructors nor to generic code were the constructor overloads are unknown.</p>
-<p>The solution presented in this library is the family of <b>InPlaceFactories</b> and
-<b>TypedInPlaceFactories</b>.<br>
+<p>The solution presented in this library is the family of <b>InPlaceFactories</b> and <b>TypedInPlaceFactories</b>.<br>
 These factories are a family of classes which encapsulate an increasing number of arbitrary
 constructor parameters and supply a method to construct an object of a given type using those
 parameters at an address specified by the user via placement new.</p>
@@ -1427,10 +1601,7 @@
   W ( in_place(123,"hello") ) ;
 }
 </pre>
-<p>The factories are implemented in the headers:
-<a href="../../../boost/utility/in_place_factory.hpp">in_place_factory.hpp</a> and
-<a href="../../../boost/utility/typed_in_place_factory.hpp">typed_in_place_factory.hpp</a>
-</p>
+<p>The factories are implemented in the headers: <a href="../../../boost/utility/in_place_factory.hpp">in_place_factory.hpp</a> and <a href="../../../boost/utility/typed_in_place_factory.hpp">typed_in_place_factory.hpp</a> </p>
 
 <HR>
 
@@ -1440,9 +1611,8 @@
 the <i>maybe</i> state <u>represents a valid value</u>, unlike the corresponding state
 of an uninitialized optional&lt;bool&gt;.<br>
 It should be carefully considered if an optional&lt;bool&gt; instead of a tribool is really needed</p>
-<p>Second, optional&lt;&gt; provides an implicit conversion to bool. This conversion
-  refers to the initialization state and not to the contained value.<br>
-Using optional&lt;bool&gt; can lead to subtle errors due to the implicit bool conversion:</p>
+<p>Second, optional&lt;&gt; provides a simple way to test initialization state: an implicit conversion to a type that evaluates as a 'bool' in a boolean context.<br>
+Using optional&lt;bool&gt; can lead to subtle errors due to this implicit conversion:</p>
 <pre>void foo ( bool v ) ;
 void bar()
 {
@@ -1458,7 +1628,9 @@
 integral promotions don't apply (i.e. if foo() takes an 'int' instead, it won't compile). <HR>
 
 <H2><A NAME="exsafety">Exception Safety Guarantees</A></H2>
-<H3><u>Assignment and Reset:</u></H3>
+
+<H3><u>Assignment:</u></H3>
+<p><i>IMPORTANT NOTE: This changed in 1.33.1 with respect to previous versions</i></p>
 <p>Because of the current implementation (see <A HREF="#impl">Implementation Notes</A>), all
 of the assignment methods:</p>
 <ul>
@@ -1471,61 +1643,17 @@
   InPlaceFactory const&amp; ) </code></li>
   <li> <code>template&lt;class TypedInPlaceFactory&gt; optional&lt;T&gt;::operator= (
   TypedInPlaceFactory const&amp; ) </code></li>
-  <li> <code>optional&lt;T&gt;:::reset ( T const&amp;)</code></li>
 </ul>
-<p>Can only <i>guarantee</i> the <u>basic exception safety</u>: The lvalue optional is left <u>uninitialized</u>
-if an exception is thrown (any previous value is <i>first</i> destroyed using T::~T())</p>
+<p>cannot offer any <i>exception safety guarantee</i> beyond that provided by <code>T::operator=( T const&amp; )</code></p>
 <p>On the other hand, the <i>uninitializing</i> methods:</p>
 <ul>
   <li><code>optional&lt;T&gt;::operator= ( detail::none_t ) </code></li>
-  <li><code>optional&lt;T&gt;::reset()</code></li>
 </ul>
-<p>Provide the no-throw guarantee (assuming a no-throw T::~T())</p>
-<p>However, since <code>optional&lt&gt</code> itself doesn't throw any exceptions,
-the only source for exceptions here are T's constructor, so if you know the exception guarantees
-for T::T ( T const&amp; ), you know that optional's assignment and reset has the same guarantees.</p>
-<pre>//
-// Case 1: Exception thrown during assignment.
-//
-T v0(123);
-optional&ltT&gt opt0(v0);
-try
-{
-&nbsp; T v1(456);
-&nbsp; optional&ltT&gt opt1(v1);
-&nbsp; opt0 = opt1 ;
+<p>Provides the no-throw guarantee (assuming a no-throw T::~T()) becuse it only destroys the stored object.</p>
 
-&nbsp; // If no exception was thrown, assignment succeeded.
-&nbsp; assert( *opt0 == v1 ) ;
-}
-catch(...)
-{
-&nbsp; // If any exception was thrown, 'opt0' is reset to uninitialized.
-&nbsp; assert( !opt0 ) ;
-}
-
-//
-// Case 2: Exception thrown during reset(v)
-//
-T v0(123);
-optional&ltT&gt opt(v0);
-try
-{
-&nbsp; T v1(456);
-&nbsp; opt.reset ( v1 ) ;
-
-&nbsp; // If no exception was thrown, reset succeeded.
-&nbsp; assert( *opt == v1 ) ;
-}
-catch(...)
-{
-&nbsp; // If any exception was thrown, 'opt' is reset to uninitialized.
-&nbsp; assert( !opt ) ;
-}
-</pre>
 <H3><u>Swap:</u></H3>
 <p><code>void swap( optional&lt;T&gt;&amp;, optional&lt;T&gt;&amp; )</code> has the same exception guarantee as <code>swap(T&amp;,T&amp;)</code> when both optionals are initialized.<br>
-If only one of the optionals is initialized, it gives the same <i>basic</i> exception guarantee as <code>optional&lt;T&gt;::reset( T const&amp; )</code> (since <code>optional&lt;T&gt;::reset()</code> doesn't throw).<br>
+If only one of the optionals is initialized, it gives the same exception guarantee as <code>T::operator=( T const&amp; )</code> (since <code>optional&lt;T&gt;::operator=( none_t )</code> doesn't throw).<br>
 If none of the optionals is initialized, it has no-throw guarantee since it is a no-op. </p>
 
 <HR>
@@ -1539,14 +1667,11 @@
 
 <H2><A NAME="impl">Implementation Notes</A></H2>
 <p>optional&lt;T&gt; is currently implemented
-  using a custom aligned storage facility built from <code>alignment_of</code> and <code>type_with_alignment</code> (both from Type Traits).
-  It uses a separate boolean flag to indicate the initialization state.<br>
-  Placement new with T's copy constructor and T's destructor
-  are explicitly used to initialize,copy and destroy optional values.<br>
-  As a result, T's default constructor is effectively by-passed, but the exception
-  guarantees are basic.<br>
-  It is planned to replace the current implementation with another with
-  stronger exception safety, such as a future boost::variant<T,nil_t>. </p>
+  using a custom aligned storage facility built from <code>alignment_of</code> and <code>type_with_alignment</code> (both from Type Traits). 
+  It uses a separate boolean flag to indicate the initialization state.</p>
+<p>Placement new with T's copy constructor and T's destructor
+  is explicitly used to initialize and destroy optional values. This allows T's default constructor to be effectively by-passed.</p>
+<p>If assignment is used and the lvalue optional is uninitialized, T's copy constructor is used. However, if it is already initialized, T's assignment operator is used. This prevents optional from offering any exception guarantee stronger than the one offered by the type T itself</p>
 
 <HR>
 
@@ -1600,15 +1725,12 @@
 </blockquote>
 <HR>
 
-<P>Revised April 21, 2005</P>
-<p>© Copyright Fernando Luis Cacciola Carballal, 2003,2004,2005</p>
+<P>Revised March 1, 2007</P>
+<p>© Copyright Fernando Luis Cacciola Carballal, 2003-2007</p>
 <p> Use, modification, and distribution are subject to the Boost Software
-License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">
-LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
-www.boost.org/LICENSE_1_0.txt</a>)</p>
+License, Version 1.0. (See accompanying file <a href="../../../LICENSE_1_0.txt">LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">www.boost.org/LICENSE_1_0.txt</a>)</p>
 <P>Developed by <A HREF="mailto:fernando_cacciola at hotmail.com">Fernando Cacciola</A>,
 the latest version of this file can be found at <A
-HREF="http://www.boost.org">www.boost.org</A>, and the boost
-<A HREF="http://www.boost.org/more/mailing_lists.htm#main">discussion lists</A></P>
-</BODY>
-</HTML>
+HREF="http://www.boost.org">www.boost.org</A>, and the boost <A HREF="http://www.boost.org/more/mailing_lists.htm#main">discussion lists</A></P>
+</pre></BODY>
+</HTML>
\ No newline at end of file

Modified: boost/trunk/libs/optional/test/Jamfile.v2
===================================================================
--- boost/trunk/libs/optional/test/Jamfile.v2	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/optional/test/Jamfile.v2	2007-03-26 21:47:29 UTC (rev 14044)
@@ -22,11 +22,9 @@
     [ run optional_test_inplace.cpp ]
     [ run optional_test_io.cpp ]
     [ compile-fail optional_test_fail1.cpp ]
-    [ compile-fail optional_test_fail2.cpp ]
     [ compile-fail optional_test_fail3a.cpp ]
     [ compile-fail optional_test_fail3b.cpp ]
     [ compile-fail optional_test_ref_fail1.cpp ]
-    [ compile-fail optional_test_ref_fail2.cpp ]
     [ compile-fail optional_test_ref_fail3.cpp ]
     [ compile-fail optional_test_ref_fail4.cpp ]
     [ compile-fail optional_test_inplace_fail.cpp ]

Modified: boost/trunk/libs/optional/test/optional_test.cpp
===================================================================
--- boost/trunk/libs/optional/test/optional_test.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/optional/test/optional_test.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -15,8 +15,10 @@
 
 #define BOOST_ENABLE_ASSERT_HANDLER
 
-#include "boost/optional.hpp"
+#include "boost/bind/apply.hpp" // Included just to test proper interaction with boost::apply<> as reported by Daniel Wallin
 
+#include "boost/optional/optional.hpp"
+
 #ifdef __BORLANDC__
 #pragma hdrstop
 #endif
@@ -151,8 +153,97 @@
   ob.reset();
   check_is_pending_dtor( ARG(T) ) ;
   check_uninitialized(ob);
+  
 }
 
+template<class T>
+void test_conditional_ctor_and_get_valur_or ( T const* )
+{
+  TRACE( std::endl << BOOST_CURRENT_FUNCTION  );
+  
+  T a(321);
+  
+  T z(123);
+  
+  optional<T> const cdef0(false,a);
+  
+  optional<T> def0(false,a);
+  optional<T> def1 = boost::make_optional(false,a); //  T is not within boost so ADL won't find make_optional unqualified
+  check_uninitialized(def0);
+  check_uninitialized(def1);
+
+  optional<T> const co0(true,a);
+  
+  optional<T> o0(true,a);
+  optional<T> o1 = boost::make_optional(true,a); //  T is not within boost so ADL won't find make_optional unqualified
+
+  check_initialized(o0);
+  check_initialized(o1);
+  check_value(o0,a,z);
+  check_value(o1,a,z);
+  
+  T b = def0.get_value_or(z);
+  BOOST_CHECK( b == z ) ;
+  
+  b = get_optional_value_or(def0,z);
+  BOOST_CHECK( b == z ) ;
+  
+  b = o0.get_value_or(z);
+  BOOST_CHECK( b == a ) ;
+
+  b = get_optional_value_or(o0,z);
+  BOOST_CHECK( b == a ) ;
+  
+  
+  T const& crz = z ;
+  T&        rz = z ;
+  
+  T const& crzz = def0.get_value_or(crz);
+  BOOST_CHECK( crzz == crz ) ;
+  
+  T& rzz = def0.get_value_or(rz);
+  BOOST_CHECK( rzz == rz ) ;
+  
+  T const& crzzz = get_optional_value_or(cdef0,crz);
+  BOOST_CHECK( crzzz == crz ) ;
+  
+  T& rzzz = get_optional_value_or(def0,rz);
+  BOOST_CHECK( rzzz == rz ) ;
+  
+  T const& crb = o0.get_value_or(crz);
+  BOOST_CHECK( crb == a ) ;
+  
+  T& rb = o0.get_value_or(rz);
+  BOOST_CHECK( rb == b ) ;
+  
+  T const& crbb = get_optional_value_or(co0,crz);
+  BOOST_CHECK( crbb == b ) ;
+  
+  T const& crbbb = get_optional_value_or(o0,crz);
+  BOOST_CHECK( crbbb == b ) ;
+  
+  T& rbb = get_optional_value_or(o0,rz);
+  BOOST_CHECK( rbb == b ) ;
+  
+  T& ra = a ;
+  
+  optional<T&> defref(false,ra);
+  BOOST_CHECK(!defref);
+  
+  optional<T&> ref(true,ra);
+  BOOST_CHECK(!!ref);
+  
+  a = T(432);
+  
+  BOOST_CHECK( *ref == a ) ;
+  
+  T& r1 = defref.get_value_or(z);
+  BOOST_CHECK( r1 == z ) ;
+  
+  T& r2 = ref.get_value_or(z);
+  BOOST_CHECK( r2 == a ) ;
+}
+
 //
 // Test Direct Value Manipulation
 //
@@ -613,16 +704,16 @@
 {
   TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
 
-  T v0(18);
-  T v1(19);
-  T v2(19);
+  T v0(0);
+  T v1(1);
+  T v2(1);
 
   optional<T> def0 ;
   optional<T> def1 ;
   optional<T> opt0(v0);
   optional<T> opt1(v1);
   optional<T> opt2(v2);
-
+  
   // Check identity
   BOOST_CHECK ( def0 == def0 ) ;
   BOOST_CHECK ( opt0 == opt0 ) ;
@@ -660,6 +751,33 @@
   BOOST_CHECK ( opt1 >  opt0 ) ;
   BOOST_CHECK ( opt1 <= opt2 ) ;
   BOOST_CHECK ( opt1 >= opt0 ) ;
+  
+  // Compare against a value directly
+  BOOST_CHECK ( opt0 == v0 ) ;
+  BOOST_CHECK ( opt0 != v1 ) ;
+  BOOST_CHECK ( opt1 == v2 ) ;
+  BOOST_CHECK ( opt0 <  v1 ) ;
+  BOOST_CHECK ( opt1 >  v0 ) ;
+  BOOST_CHECK ( opt1 <= v2 ) ;
+  BOOST_CHECK ( opt1 >= v0 ) ;
+  BOOST_CHECK ( v0 != opt1 ) ;
+  BOOST_CHECK ( v1 == opt2 ) ;
+  BOOST_CHECK ( v0 <  opt1 ) ;
+  BOOST_CHECK ( v1 >  opt0 ) ;
+  BOOST_CHECK ( v1 <= opt2 ) ;
+  BOOST_CHECK ( v1 >= opt0 ) ;
+  BOOST_CHECK (   def0 != v0  ) ;
+  BOOST_CHECK ( !(def0 == v0) ) ;
+  BOOST_CHECK (   def0 <  v0  ) ;
+  BOOST_CHECK ( !(def0 >  v0) ) ;
+  BOOST_CHECK (   def0 <= v0  ) ;
+  BOOST_CHECK ( !(def0 >= v0) ) ;
+  BOOST_CHECK (   v0 != def0  ) ;
+  BOOST_CHECK ( !(v0 == def0) ) ;
+  BOOST_CHECK ( !(v0 <  def0) ) ;
+  BOOST_CHECK (   v0 >  def0  ) ;
+  BOOST_CHECK ( !(v0 <= def0) ) ;
+  BOOST_CHECK (   v0 >= opt0  ) ;
 }
 
 template<class T>
@@ -676,6 +794,10 @@
   BOOST_CHECK ( def0    == none ) ;
   BOOST_CHECK ( non_def != none ) ;
   BOOST_CHECK ( !def1           ) ;
+  BOOST_CHECK ( !(non_def <  none) ) ; 
+  BOOST_CHECK (   non_def >  none  ) ;
+  BOOST_CHECK ( !(non_def <= none) ) ;
+  BOOST_CHECK (   non_def >= none  ) ;
 
   non_def = none ;
   BOOST_CHECK ( !non_def ) ;
@@ -683,11 +805,30 @@
   test_default_implicit_construction(T(1),none);
 }
 
+template<class T>
+void test_arrow( T const* )
+{
+  TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
+
+  T a(1234);
+
+  optional<T>        oa(a) ;
+  optional<T> const coa(a) ;
+  
+  BOOST_CHECK ( coa->V() == 1234 ) ;
+  
+  oa->V() = 4321 ;
+  
+  BOOST_CHECK (     a.V() = 1234 ) ;
+  BOOST_CHECK ( (*oa).V() = 4321 ) ;
+}
+
 void test_with_builtin_types()
 {
   TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
 
   test_basics( ARG(double) );
+  test_conditional_ctor_and_get_valur_or( ARG(double) );
   test_uninitialized_access( ARG(double) );
   test_no_throwing_swap( ARG(double) );
   test_relops( ARG(double) ) ;
@@ -699,6 +840,7 @@
   TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
 
   test_basics( ARG(X) );
+  test_conditional_ctor_and_get_valur_or( ARG(X) );
   test_direct_value_manip( ARG(X) );
   test_uninitialized_access( ARG(X) );
   test_throwing_direct_init( ARG(X) );
@@ -711,6 +853,7 @@
   test_throwing_swap( ARG(X) );
   test_relops( ARG(X) ) ;
   test_none( ARG(X) ) ;
+  test_arrow( ARG(X) ) ;
   BOOST_CHECK ( X::count == 0 ) ;
 }
 

Modified: boost/trunk/libs/optional/test/optional_test_ref.cpp
===================================================================
--- boost/trunk/libs/optional/test/optional_test_ref.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/optional/test/optional_test_ref.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -299,6 +299,23 @@
   BOOST_CHECK ( !non_def ) ;
 }
 
+template<class T>
+void test_arrow( T const* )
+{
+  TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
+
+  T a(1234);
+
+  optional<T&>        oa(a) ;
+  optional<T&> const coa(a) ;
+  
+  BOOST_CHECK ( coa->V() == 1234 ) ;
+  
+  oa->V() = 4321 ;
+  
+  BOOST_CHECK ( a.V() = 4321 ) ;
+}
+
 void test_with_builtin_types()
 {
   TRACE( std::endl << BOOST_CURRENT_FUNCTION   );
@@ -315,6 +332,7 @@
   test_basics( ARG(X) );
   test_relops( ARG(X) ) ;
   test_none  ( ARG(X) ) ;
+  test_arrow ( ARG(X) ) ;
 
   BOOST_CHECK ( X::count == 0 ) ;
 }

Deleted: boost/trunk/libs/optional/test/optional_test_ref_fail2.cpp
===================================================================
--- boost/trunk/libs/optional/test/optional_test_ref_fail2.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/optional/test/optional_test_ref_fail2.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,23 +0,0 @@
-// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
-//
-// Use, modification, and distribution is 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)
-//
-// See http://www.boost.org/lib/optional for documentation.
-//
-// You are welcome to contact the author at:
-//  fernando_cacciola at hotmail.com
-//
-#include "boost/optional.hpp"
-
-//
-// THIS TEST SHOULD FAIL TO COMPILE
-//
-void optional_reference__test_no_ptr_access()
-{
-  boost::optional<int&> opt ;
-  opt.get_ptr();
-}
-
-

Modified: boost/trunk/libs/parameter/test/sfinae.cpp
===================================================================
--- boost/trunk/libs/parameter/test/sfinae.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/parameter/test/sfinae.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -5,7 +5,7 @@
 
 #include <boost/parameter.hpp>
 #include <boost/parameter/match.hpp>
-#include <boost/assert.hpp>
+#include <boost/detail/lightweight_test.hpp>
 #include <string>
 #include <boost/type_traits/is_convertible.hpp>
 
@@ -38,14 +38,14 @@
   // vc++ 6 ICE.
   void assert_equal_string(std::string x, std::string y)
   {
-        BOOST_ASSERT(x == y);
+        BOOST_TEST(x == y);
   }
   
   template<class P>
   void f_impl(P const& p)
   {
       float v = p[value | 3.f];
-      BOOST_ASSERT(v == 3.f);
+      BOOST_TEST(v == 3.f);
       assert_equal_string(p[name | "bar"], "foo");
   }
 
@@ -97,9 +97,8 @@
     f(value = 3.f, name = "foo");
 
 #ifndef BOOST_NO_SFINAE
-    return f(3, 4);
-#else 
-    return 0;
-#endif 
+    BOOST_TEST(f(3, 4) == 0);
+#endif
+    return boost::report_errors();
 }
 

Modified: boost/trunk/libs/python/build/Jamfile.v2
===================================================================
--- boost/trunk/libs/python/build/Jamfile.v2	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/build/Jamfile.v2	2007-03-26 21:47:29 UTC (rev 14044)
@@ -66,8 +66,7 @@
     :   # default build
         <link>shared
     :   # usage requirements
-        <link>static:<define>BOOST_PYTHON_STATIC_LIB 
-        <link>shared:<define>BOOST_PYTHON_DYNAMIC_LIB
+        <link>static:<define>BOOST_PYTHON_STATIC_LIB
     ;
 }
 else

Modified: boost/trunk/libs/python/src/import.cpp
===================================================================
--- boost/trunk/libs/python/src/import.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/src/import.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -17,7 +17,7 @@
 {
   // should be 'char const *' but older python versions don't use 'const' yet.
   char *n = python::extract<char *>(name);
-  python::handle<> module(python::borrowed(PyImport_AddModule(n)));
+  python::handle<> module(python::borrowed(PyImport_ImportModule(n)));
   return python::object(module);
 }
 

Modified: boost/trunk/libs/python/test/Jamfile.v2
===================================================================
--- boost/trunk/libs/python/test/Jamfile.v2	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/Jamfile.v2	2007-03-26 21:47:29 UTC (rev 14044)
@@ -5,11 +5,11 @@
 use-project /boost/python : ../build ;
 project /boost/python/test ;
 
-rule py-run ( sources * )
+rule py-run ( sources * : input-file ? )
 {
     return [ run $(sources) /boost/python//boost_python /python//python
       : # args
-      : # input files
+      : $(input-file)
       : #requirements
         <define>BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION
  
@@ -27,25 +27,33 @@
 }
 
 
-
-#template py-unit-test
-#  :
-#  : $(PYTHON_PROPERTIES) <define>BOOST_PYTHON_SUPPRESS_REGISTRY_INITIALIZATION
-#    [ difference $(PYTHON_PROPERTIES) : <define>BOOST_PYTHON_DYNAMIC_LIB ] <define>BOOST_PYTHON_STATIC_LIB
-#      ;
-  
-
 test-suite python
   :
 
   [
     run exec.cpp ../build//boost_python/<link>static /python//python
       : # program args
+      : exec.py # input files
+      : # requirements
+      : # target-name
+  ]
+
+  [
+    run exec.cpp ../build//boost_python/<link>shared /python//python
+      : # program args
       : exec.py
       : # requirements
-        <define>BOOST_PYTHON_STATIC_MODULE
+      : exec-dynamic # target-name
   ]
 
+#   [
+#     run import_.cpp ../build//boost_python /python//python
+#       : # program args
+#       : import_.py # input files
+#       : # requirements
+#       : # target-name
+#   ]
+
 [
 bpl-test crossmod_exception
   : crossmod_exception.py crossmod_exception_a.cpp crossmod_exception_b.cpp
@@ -77,8 +85,8 @@
 [ bpl-test keywords : keywords.cpp keywords_test.py ]
    
 
-[ python-extension builtin_converters.ext : test_builtin_converters.cpp /boost/python//boost_python ]
-[ bpl-test builtin_converters : test_builtin_converters.py builtin_converters.ext ]
+[ python-extension builtin_converters_ext : test_builtin_converters.cpp /boost/python//boost_python ]
+[ bpl-test builtin_converters : test_builtin_converters.py builtin_converters_ext ]
 
  [ bpl-test test_pointer_adoption ]
  [ bpl-test operators ]
@@ -144,13 +152,13 @@
     # Whenever the cause for the failure of the polymorphism test is found
     # and fixed, this should be retested.
     <toolset>hp_cxx:<build>no ]
-
+      
 [ python-extension map_indexing_suite_ext
     : map_indexing_suite.cpp int_map_indexing_suite.cpp
     /boost/python//boost_python ]
 [ bpl-test  
     map_indexing_suite : map_indexing_suite.py map_indexing_suite_ext ]
-
+      
 # if $(TEST_BIENSTMAN_NON_BUGS)
 # {
 #     bpl-test bienstman4 ;

Modified: boost/trunk/libs/python/test/dict.cpp
===================================================================
--- boost/trunk/libs/python/test/dict.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/dict.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -2,6 +2,7 @@
 // Software License, Version 1.0. (See accompanying
 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 #include <boost/python/module.hpp>
+#define BOOST_ENABLE_ASSERT_HANDLER
 #include <boost/assert.hpp>
 
 #include <boost/python/def.hpp>
@@ -86,3 +87,5 @@
     def("work_with_dict", work_with_dict);
     def("test_templates", test_templates);
 }
+
+#include "module_tail.cpp"

Copied: boost/trunk/libs/python/test/import_.cpp (from rev 14043, boost/branches/upstream/current/libs/python/test/import_.cpp)

Copied: boost/trunk/libs/python/test/import_.py (from rev 14043, boost/branches/upstream/current/libs/python/test/import_.py)

Modified: boost/trunk/libs/python/test/str.cpp
===================================================================
--- boost/trunk/libs/python/test/str.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/str.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -7,6 +7,8 @@
 #include <boost/python/def.hpp>
 #include <boost/python/class.hpp>
 #include <boost/python/str.hpp>
+#define BOOST_ENABLE_ASSERT_HANDLER
+#include <boost/assert.hpp>
 
 using namespace boost::python;
 
@@ -74,3 +76,4 @@
     def("work_with_string",work_with_string);
 }
 
+#include "module_tail.cpp"

Modified: boost/trunk/libs/python/test/test_builtin_converters.cpp
===================================================================
--- boost/trunk/libs/python/test/test_builtin_converters.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/test_builtin_converters.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -57,7 +57,7 @@
 
 object identity_(object x) { return x; }
 
-BOOST_PYTHON_MODULE(builtin_converters)
+BOOST_PYTHON_MODULE(builtin_converters_ext)
 {    
     def("get_type", get_type);
     def("return_null_handle", return_null_handle);

Modified: boost/trunk/libs/python/test/test_builtin_converters.py
===================================================================
--- boost/trunk/libs/python/test/test_builtin_converters.py	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/test_builtin_converters.py	2007-03-26 21:47:29 UTC (rev 14044)
@@ -2,7 +2,7 @@
 # Software License, Version 1.0. (See accompanying
 # file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
 r"""
->>> from builtin_converters import *
+>>> from builtin_converters_ext import *
 
 # Synthesize idendity functions in case long long not supported
 >>> if not 'rewrap_value_long_long' in dir():
@@ -250,9 +250,9 @@
 def run(args = None):
     import sys
     import doctest
-    import builtin_converters
+    import builtin_converters_ext
     
-    if 'rewrap_value_long_long' in dir(builtin_converters):
+    if 'rewrap_value_long_long' in dir(builtin_converters_ext):
         print 'LONG_LONG supported, testing...'
     else:
         print 'LONG_LONG not supported, skipping those tests...'

Modified: boost/trunk/libs/python/test/virtual_functions.cpp
===================================================================
--- boost/trunk/libs/python/test/virtual_functions.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/python/test/virtual_functions.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -11,6 +11,7 @@
 #include <boost/ref.hpp>
 #include <boost/utility.hpp>
 
+#define BOOST_ENABLE_ASSERT_HANDLER
 #include <boost/assert.hpp>
 
 using namespace boost::python;

Modified: boost/trunk/libs/range/test/sub_range.cpp
===================================================================
--- boost/trunk/libs/range/test/sub_range.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/range/test/sub_range.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -90,18 +90,7 @@
     s.empty();
     r.size();
     s.size();
-    
-    irange singular_irange;
-    BOOST_CHECK( singular_irange.empty() );
-    BOOST_CHECK( singular_irange.size() == 0 );
-    
-    srange singular_srange;
-    BOOST_CHECK( singular_srange.empty() );
-    BOOST_CHECK( singular_srange.size() == 0 );
 
-    BOOST_CHECK( empty( singular_irange ) );
-    BOOST_CHECK( empty( singular_srange ) );
-
     srange rr = make_iterator_range( str );
     BOOST_CHECK( rr.equal( r ) );
 

Modified: boost/trunk/libs/regex/test/c_compiler_checks/posix_api_check.cpp
===================================================================
--- boost/trunk/libs/regex/test/c_compiler_checks/posix_api_check.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/regex/test/c_compiler_checks/posix_api_check.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -21,6 +21,7 @@
 #include <string.h>
 #include <boost/assert.hpp>
 #include <boost/regex.h>
+#include <boost/detail/lightweight_test.hpp>
 
 const char* expression = "^";
 const char* text = "\n      ";
@@ -42,7 +43,7 @@
       printf(buf);
       return result;
    }
-   BOOST_ASSERT(re.re_nsub == 0);
+   BOOST_TEST(re.re_nsub == 0);
    matches[0].rm_so = 0;
    matches[0].rm_eo = strlen(text);
    result = regexec(&re, text, 1, matches, REG_NOTBOL | REG_NOTEOL | REG_STARTEND);
@@ -54,10 +55,10 @@
       regfree(&re);
       return result;
    }
-   BOOST_ASSERT(matches[0].rm_so == matches[0].rm_eo == 1);
+   BOOST_TEST(matches[0].rm_so == matches[0].rm_eo == 1);
    regfree(&re);
    printf("no errors found\n");
-   return 0;
+   return boost::report_errors();
 }
 
 

Modified: boost/trunk/libs/regex/test/regress/main.cpp
===================================================================
--- boost/trunk/libs/regex/test/regress/main.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/regex/test/regress/main.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -73,7 +73,7 @@
    get_array_data();  // initialises data.
 
    std::list<boost::shared_ptr<boost::thread> > threads;
-   for(int i = 0; i < 10; ++i)
+   for(int i = 0; i < 5; ++i)
    {
       threads.push_back(boost::shared_ptr<boost::thread>(new boost::thread(&run_tests)));
    }

Modified: boost/trunk/libs/spirit/fusion/test/pair_tests.cpp
===================================================================
--- boost/trunk/libs/spirit/fusion/test/pair_tests.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/spirit/fusion/test/pair_tests.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -40,5 +40,5 @@
     BOOST_TEST(get<0>(pr2) == 2);
     BOOST_TEST(get<1>(pr2) == "world");
     
-    return 0;
+    return boost::report_errors();
 }

Modified: boost/trunk/libs/test/example/unit_test_example_01.cpp
===================================================================
--- boost/trunk/libs/test/example/unit_test_example_01.cpp	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/test/example/unit_test_example_01.cpp	2007-03-26 21:47:29 UTC (rev 14044)
@@ -1,52 +1,39 @@
-#include <iostream>
+//  (C) Copyright Gennadiy Rozental 2005.
+//  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)
 
-namespace ieee_754 {
+//  See http://www.boost.org/libs/test for the library home page.
 
-template<typename T>
-struct decoded {
-    typedef long long mantissa_holder_type;
-    typedef short     exponent_holder_type;
+// Boost.Test
 
-    bool                  p_sign;
-    mantissa_holder_type  p_mantissa;
-    exponent_holder_type  p_exponent;
-};
+// each test module could contain no more then one 'main' file with init function defined
+// alternatively you could define init function yourself
+#define BOOST_TEST_MAIN
+#include <boost/test/unit_test.hpp>
 
-//___________________________________________________________________________//
+//____________________________________________________________________________//
 
-void decode( double v, decoded<double>& d )
+// most frequently you implement test cases as a free functions with automatic registration
+BOOST_AUTO_TEST_CASE( test1 )
 {
-    union {
-        double v;
-        long long m;
-    } tmp;
-
-    tmp.v = v;
-
-    d.p_sign     = !(tmp.m & 0x8000000000000000LL);
-    d.p_mantissa = tmp.m & 0x000FFFFFFFFFFFFFLL;
-    d.p_exponent = (short)((tmp.m & 0x7FF0000000000000LL) >> 52) - 1075;
-
-    if( d.p_exponent != 0 )
-        d.p_mantissa |= 0x0010000000000000LL;
+    // reports 'error in "test1": test 2 == 1 failed'
+    BOOST_CHECK( 2 == 1 );
 }
 
-//___________________________________________________________________________//
+//____________________________________________________________________________//
 
-} // namespace ieee_754
-
-using namespace ieee_754;
-
-int
-main()
+// each test file may contain any number of test cases; each test case has to have unique name
+BOOST_AUTO_TEST_CASE( test2 )
 {
-    double d = 0.2;
-    decoded<double> dec;
+    int i = 0;
 
-    decode( d, dec );
+    // reports 'error in "test2": check i == 2 failed [0 != 2]'
+    BOOST_CHECK_EQUAL( i, 2 );
 
-    std::cout << "orig = "           << std::hex << *(long long*)&d << std::endl;
-    std::cout << "dec.p_sign = "     << (dec.p_sign ? '+' : '-') << std::endl;
-    std::cout << "dec.p_mantissa = " << std::hex << dec.p_mantissa << std::endl;
-    std::cout << "dec.p_exponent = " << std::dec << dec.p_exponent << std::endl;
+    BOOST_CHECK_EQUAL( i, 0 );
 }
+
+//____________________________________________________________________________//
+
+// EOF

Modified: boost/trunk/libs/wave/doc/class_reference_context.html
===================================================================
--- boost/trunk/libs/wave/doc/class_reference_context.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/libs/wave/doc/class_reference_context.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -60,7 +60,7 @@
         <span class="keyword">typedef</span> pp_iterator&lt;context&gt; iterator_type; 
         <span class="keyword">typedef</span> Token token_type;
         <span class="keyword">typedef</span> <span class="keyword">typename</span> token_type::position_type position_type;
-
+        <span class="keyword">typedef</span> std::list&lt;token_type&gt; token_sequence_type;<br>
     <span class="comment">// constructor</span>
         <a href="class_reference_context.html#constructor">context</a>(Iterator<span class="keyword"> const</span> &amp;first_, 
             Iterator <span class="keyword">const</span> &amp;last_, 
@@ -85,6 +85,11 @@
         <span class="keyword">bool</span> <a href="class_reference_context.html#remove_macro_definition">remove_macro_definition</a>(<span class="keyword">std::string const</span> &amp;name, 
             <span class="keyword">bool</span> even_predefined = <span class="keyword">false</span>);
         <span class="keyword">void</span> <a href="class_reference_context.html#reset_macro_definitions">reset_macro_definitions</a>();
+    <span class="keyword">    bool</span></span> <a href="class_reference_context.html#get_macro_definition">get_macro_definition</a>(
+        <span class="keyword">    std::string const</span> &amp;name, <span class="keyword">bool</span> &amp;is_function_style, <span class="keyword">
+            bool</span> &amp;is_predefined, position_type &amp;pos, 
+            std::vector&lt;token_type&gt; &amp;parameters, 
+            token_sequence_type &amp;definition) <span class="keyword">const</span>; 
 
     <span class="comment">// other options</span>
         <span class="keyword">void</span> <a href="class_reference_context.html#language_support">set_language</a>(language_support enable);
@@ -332,6 +337,17 @@
 <blockquote>
   <p>Returns, if a macro with the given <tt>name</tt> is defined, i.e. if it is 
     contained in the macro symbol table.</p>
+  </blockquote>
+<p><strong><a name="get_macro_definition"></a>get_macro_definition</strong></p>
+<pre>    <span class="keyword">bool</span></span> get_macro_definition(
+        <span class="keyword">std::string const</span> &amp;name, <span class="keyword">bool</span> &amp;is_function_style, <span class="keyword">
+        bool</span> &amp;is_predefined, position_type &amp;pos, 
+        std::vector&lt;token_type&gt; &amp;parameters, 
+        token_sequence_type &amp;definition) <span class="keyword">const</span>; </pre>
+<blockquote>
+  <p>Allows to retrieve all information known with regard to a macro definition. The parameter <tt>name</tt>    specifies the name of the macro the information should be returned for. The parameters 
+  <tt>is_function_style</tt> and <tt>is_predefined</tt> return, whether the macro has been defined as a function style macro or as a predefined macro resp. The parameter <tt>pos</tt> will contain the position the macro was defined at. The parameter <tt>parameters</tt> will contain the names of the parameters the macro was defined with and the parameter <tt>definition</tt> will contain the token sequence for the definition (macro body).</p>
+  <p>The function returns <tt>true</tt> is the macro was defined and the requested information has been successfully retrieved, <tt>false</tt> otherwise.</p>
 </blockquote>
 <p><a name="remove_macro_definition"></a><b>remove_macro_definition</b></p>
 <pre><span class="keyword">    bool</span> remove_macro_definition(
@@ -471,7 +487,7 @@
   <font size="2">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) </font> </p>
 <span class="updated"></span>
 <p class="copyright"><span class="updated">Last updated: 
-  <!-- #BeginDate format:fcAm1m -->Tuesday, March 7, 2006  13:23<!-- #EndDate -->
+  <!-- #BeginDate format:fcAm1m -->Tuesday, March 20, 2007  14:04<!-- #EndDate -->
   </span>
 </p>
 <p>&nbsp;</p>

Modified: boost/trunk/more/whos_using/using.qbk
===================================================================
--- boost/trunk/more/whos_using/using.qbk	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/more/whos_using/using.qbk	2007-03-26 21:47:29 UTC (rev 14044)
@@ -7,7 +7,7 @@
             http://www.boost.org/LICENSE_1_0.txt
         </ulink>)
     ]
-    [last-revision $Date: 2007/01/04 09:58:04 $]
+    [last-revision $Date: 2007/03/18 10:01:56 $]
 ]
 
 [section:intro]
@@ -765,6 +765,19 @@
 level functionality as well as tools to create and import content.
 ]
 
+[blurb [*Python-Ogre]\n\n
+[@http://python-ogre.python-hosting.com/ Python-Ogre] 
+is a Python bindings for Ogre 3D - a scene-oriented,
+flexible 3D engine.\n
+Python-Ogre uses Boost.Python to expose next libraries to Python:\n
+  * Ogre\n
+  * Newton\n
+  * ODE\n
+  * OgreAL\n
+  * CEGUI\n
+  * OIS\n
+]
+
 [endsect]
 
 [section:inhouse In House Boost]
@@ -773,6 +786,13 @@
 developement using the Boost Libraries can significantly shorten your
 development cycles.
 
+[blurb [*Google]\n\n
+[@http://code.google.com/p/google-gtags/ google-gtags] Provides server-based 
+tags serving for large codebases. This is an extension to GNU Emacs and X-Emacs 
+TAGS functionality, that uses [@../../libs/test/index.html Boost.Test] as its 
+unit test framework.
+]
+
 [blurb [*LiquidNet]\n\n
 [@http://www.liquidnet.com/ LiquidNet] is Americas number one electronic 
 marketplace for large block trading, and the 5th fastest growing company
@@ -906,6 +926,16 @@
 [@../../libs/utility/index.html Utility]."]
 ]
 
+[blurb [*Automated Trading Deck] \n\n
+[@http://www.atdesk.com Automated Trading Deck] (ATD) uses a large number
+of Boost libraries.  ATD is a technology company specializing in
+automated trading and customized equity execution solutions for its
+customers. We offer automated execution solutions in all domestic cash
+equity markets, including the listed, over-the-counter, exchange traded
+fund and bulletin board marketplaces. Our proprietary "Pricing Engine"
+and automated limit-order trading algorithms apply advanced expert
+systems to limit-order trading and customer executions.
+]
 
 [endsect]
 

Modified: boost/trunk/status/explicit-failures-markup.xml
===================================================================
--- boost/trunk/status/explicit-failures-markup.xml	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/status/explicit-failures-markup.xml	2007-03-26 21:47:29 UTC (rev 14044)
@@ -954,8 +954,8 @@
         </mark-expected-failures>
 
         <mark-expected-failures>
-            <test name="testdate_input"/>
-            <test name="testdate_input_dll"/>
+            <test name="testdate_input_facet"/>
+            <test name="testdate_input_facet_dll"/>
             <toolset name="msvc-7.1_stlport4"/>
             <note author="J. Garland">
                The STLPort standard library has issues with some custom
@@ -1485,6 +1485,26 @@
               of class template partial specializations.
             </note>
         </mark-expected-failures>
+        <mark-expected-failures>
+            <test name="dijkstra_heap_performance"/>
+            <test name="layout_test"/>
+            <test name="relaxed_heap_test"/>
+            <toolset name="msvc-7.0"/>
+            <note author="Vladimir Prus">
+              The test fails due to compile error in relaxed_heap.hpp. 
+              The compile error is likely caused by a compiler bug.      
+            </note>
+        </mark-expected-failures>
+        <mark-expected-failures>
+          <test name="graphviz_test"/>
+          <toolset name="msvc-7.1_stlport4"/>
+          <note author="Vladimir Prus">
+            The test fails from completely unknown reason -- it might
+            be compiler bug, or compiler misconfiguration or testing
+            system bug.
+          </note>
+        </mark-expected-failures>
+  
     </library>
 
 
@@ -1640,6 +1660,14 @@
                 disable this test with BBv2 at present.
             </note>
         </mark-expected-failures>
+        <mark-expected-failures>
+            <test name="file_descriptor_test"/>
+            <toolset name="gcc-cygwin-3.4.4"/>
+            <note author="Vladimir Prus">
+              The test fails at runtime for unknown reasons.
+            </note>
+        </mark-expected-failures>
+
     </library>
 
     <!-- lambda -->
@@ -2787,6 +2815,17 @@
             <toolset name="qcc-3.3.5*cpp"/>
             <note author="Jim Douglas" date="14 Feb 06" refid="27"/>
        </mark-expected-failures>
+
+       <mark-expected-failures>
+            <test name="common_factor_test"/>
+            <toolset name="msvc-6.5_stlport*"/>
+            <toolset name="msvc-7.1_stlport*"/>
+            <note author="John Maddock">
+            This failure appears to be caused by a compiler bug: please note
+            that the issue only effects the test suite, not the library itself.
+            A workaround is available but breaks other compilers.
+            </note>
+       </mark-expected-failures>
     </library>
 
     <!-- numeric/conversion -->
@@ -2876,6 +2915,16 @@
             <toolset name="cw-8.3*"/>
             <note author="Aleksey Gurtovoy" refid="2"/>
         </mark-expected-failures>
+        <mark-expected-failures>
+            <test name="test_float"/>
+            <toolset name="msvc-7.1_stlport4"/>
+            <note author="Vladimir Prus">
+              This failure is unresearched. Presumably, the problem
+              is that the abs function is not available in the "right"
+              namespace with this compiler/stdlib combination.
+            </note>
+        </mark-expected-failures>
+
     </library>
 
 
@@ -3382,6 +3431,17 @@
             <toolset name="hp_cxx*"/>
             <note author="Markus Schoepflin" refid="29"/>
         </mark-expected-failures>
+        <mark-expected-failures>
+            <test name="*"/>
+            <toolset name="gcc-cygwin-3.4.4"/>
+            <note author="Roland Schwarz">
+                The tests are failing because the libraries being built are targeted
+                to use the cygwin.dll, while the tests are run against a python
+                executable that depends on msvcrt.dll. This combination cannot be expected
+                to work. (The tests will pass if the additional compiler switch -mno-cygwin
+                is used during compile and link.) 
+            </note>
+        </mark-expected-failures>
     </library>
 
     <!-- random -->
@@ -3589,7 +3649,6 @@
             </mark-failure>
             <mark-failure>
                 <toolset name="tru64cxx*"/>
-                <toolset name="hp_cxx*"/>
                 <note author="Markus Schoepflin" refid="3"/>
             </mark-failure>
         </test>
@@ -3645,6 +3704,19 @@
                Test fails due to unresilved externals from STLport: appears to be
                an STLport bug. </note>
         </mark-expected-failures>
+        <mark-expected-failures>
+            <test name="regex_regress_threaded"/>
+            <test name="static_mutex_test"/>
+            <toolset name="msvc-6.5_stlport*"/>
+            <toolset name="msvc-7.1_stlport*"/>
+            <toolset name="msvc-8.0"/>
+            <toolset name="gcc-cygwin*"/>
+            <note author="John Maddock">
+               These tests pass when run directly from the command line, 
+               but fail when run under the regression test script. 
+               The issue has never been fully pinned down, but appears
+               to be related to how long the tests take to run.</note>
+        </mark-expected-failures>
     </library>
 
     <!-- signals -->
@@ -3825,12 +3897,27 @@
             <test name="prg_exec_fail2"/>
             <toolset name="darwin-4.0.1"/>
             <note author="Vladimir Prus">
-              The test appears to test that division by zero is
-              detected by Boost.Test. This is not happening on
-              Darwin, for unknown reasons.
+              The test verifies that Boost.Test detects division by
+              zero. Division by zero has an undefined result 
+              on PowerPC processors. The compiler has to emit extra 
+              code to assert that the divisor isn't zero. 
+
+              Compiler options -fno-trapping-math and -fnon-call-exceptions 
+              might affect this. However, in default configuration
+              no check is done, and division by zero is not detected.
             </note>
         </mark-expected-failures>
 
+        <mark-expected-failures>
+            <test name="prg_exec_fail3"/>
+            <toolset name="cw-9.4"/>
+            <note author="Vladimir Prus">
+              The test appears to test that failed assertion result
+              in non-zero exit status.  That seems to be not the
+              case, for unknown reasons.
+            </note>
+        </mark-expected-failures>
+
     </library>
 
 

Modified: boost/trunk/tools/build/v2/build/feature.jam
===================================================================
--- boost/trunk/tools/build/v2/build/feature.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/build/feature.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -165,13 +165,14 @@
     local result ;
     for local f in $(features)
     {
-        local a = $($(f).attributes) ;
+        local gf = $(:E=:G=$(f)) ;
+        local a = $($(gf).attributes) ;
         if ( free in $(a) ) || ( optional in $(a) )
         {
         }
         else
         {
-            result += $(f)$($(f).default) ;
+            result += $(gf)$($(gf).default) ;
         }
     }
     return $(result) ;
@@ -189,13 +190,13 @@
 # return the attibutes of the given feature
 rule attributes ( feature )
 {
-    return $($(feature).attributes) ;
+    return $($(:E=:G=$(feature)).attributes) ;
 }
 
 # return the values of the given feature
 rule values ( feature )
 {
-    return $($(feature).values) ;
+    return $($(:E=:G=$(feature)).values) ;
 }
 
 # returns true iff 'value-string' is a value-string of an implicit feature
@@ -640,6 +641,8 @@
 rule get-values ( feature : properties * )
 {
     local result ;
+    
+    feature = $(:E=:G=$(feature)) ; # add <> if necessary.
     for local p in $(properties)
     {
         if $(p:G) = $(feature)
@@ -1050,6 +1053,8 @@
     compose <variant>debug : <define>_DEBUG <optimization>off ;
     compose <variant>release : <define>NDEBUG <optimization>on ;
 
+    assert.result dynamic static : values <runtime-link> ;
+    assert.result dynamic static : values runtime-link ;
 
     try ;
     {
@@ -1128,12 +1133,20 @@
       : defaults <runtime-link> <define> <optimization>
       ;
     
+    # make sure defaults is resilient to missing grist.
+    assert.result <runtime-link>dynamic <optimization>on
+      : defaults runtime-link define optimization
+      ;
+    
     feature dummy : dummy1 dummy2 ;
     subfeature dummy : subdummy : x y z : optional ;
 
     feature fu : fu1 fu2 : optional ;
     subfeature fu : subfu : x y z : optional ;
     subfeature fu : subfu2 : q r s ;
+
+    assert.result optional : attributes <fu> ;
+    assert.result optional : attributes fu ;
     
     assert.result <runtime-link>static <define>foobar <optimization>on <toolset>gcc:<define>FOO
       <toolset>gcc <variant>debug <stdlib>native <dummy>dummy1 <toolset-gcc:version>2.95.2

Modified: boost/trunk/tools/build/v2/build/generators.jam
===================================================================
--- boost/trunk/tools/build/v2/build/generators.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/build/generators.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -842,6 +842,9 @@
             
     local usage-requirements ;
     local success ;
+    
+    generators.dout [ indent ] returned $(targets) ;
+    
     if $(targets)
     {
         success = true ;
@@ -859,6 +862,12 @@
     
     generators.dout [ indent ] "  generator" [ $(generator).id ] " spawned " ;
     generators.dout [ indent ] " " $(targets) ; 
+    if $(usage-requirements)
+    {
+        generators.dout [ indent ] "  with usage requirements:" $(x) ;
+    }
+    
+    
     if $(success)
     {
         return $(usage-requirements) $(targets) ;

Modified: boost/trunk/tools/build/v2/build/property-set.jam
===================================================================
--- boost/trunk/tools/build/v2/build/property-set.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/build/property-set.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -101,6 +101,11 @@
         return $(self.raw) ;
     }
     
+    rule str ( )
+    {
+        return "[" $(self.raw) "]" ;
+    }
+    
     # Returns properties that are neither incidental nor free
     rule base ( )
     {

Modified: boost/trunk/tools/build/v2/build/type.jam
===================================================================
--- boost/trunk/tools/build/v2/build/type.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/build/type.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -359,9 +359,6 @@
     local bt = [ BACKTRACE 1 ] ;
     local rulename = $(bt[4]) ;
     
-    # This rule may be only called from Jamfile, and therefore, 
-    # CALLER_MODULE is Jamfile module, which is used to denote 
-    # a project.
     local project = [ project.current ] ;
         
     # This is a circular module dependency, so it must be imported here

Modified: boost/trunk/tools/build/v2/build-system.jam
===================================================================
--- boost/trunk/tools/build/v2/build-system.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/build-system.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -83,6 +83,7 @@
     {
         if $(debug-config)
         {
+            ECHO notice: searching \"$(path)\" for \"$(basename).jam\" ;
             local where = [ GLOB $(path) : $(basename).jam ] ;
             if $(where)
             {            
@@ -250,7 +251,7 @@
     ECHO "warning: Configuring default toolset" \"$(default-toolset)\". ;
     ECHO "warning: If the default is wrong, you may not be able to build C++ programs." ;
     ECHO "warning: Use the \"--toolset=xxxxx\" option to override our guess." ;
-    ECHO "warning: For more configuration options, please consult"
+    ECHO "warning: For more configuration options, please consult" ;
     ECHO "warning: http://boost.org/boost-build2/doc/html/bbv2/advanced/configuration.html" ;
 
     

Modified: boost/trunk/tools/build/v2/doc/tools.html
===================================================================
--- boost/trunk/tools/build/v2/doc/tools.html	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/doc/tools.html	2007-03-26 21:47:29 UTC (rev 14044)
@@ -49,7 +49,7 @@
     <p>Some important libraries have special support in Boost.Build:</p>
 
     <ul>
-      <li><a href="http://stlport.org">STLport</a> &mdash; on gcc and
+      <li><a href="http://stlport.sourceforge.net">STLport</a> &mdash; on gcc and
       msvc.</li>
 
       <li><a href="http://www.trolltech.com/products/qt/index.html">QT</a>,

Modified: boost/trunk/tools/build/v2/tools/builtin.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/builtin.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/builtin.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -33,14 +33,17 @@
 local os = [ modules.peek : OS ] ;
 feature os : $(os) : propagated link-incompatible ;
 
+.os-names = amiga aix bsd cygwin darwin dos emx freebsd hpux
+        linux netbsd openbsd osf qnx qnxnto sgi solaris sun sunos
+        svr4 sysv ultrix unix unixware vms windows ;
+
 # Translates from bjam current OS to the os tags used
 # in host-os and target-os. I.e. it returns the
 # running host-os.
 local rule default-host-os ( )
 {
     local host-os ;
-    local os-list = [ feature.values host-os ] ;
-    if [ os.name ] in $(os-list:U)
+    if [ os.name ] in $(.os-names:U)
     {
         host-os = [ os.name ] ;
     }
@@ -70,18 +73,13 @@
 # to list all the values to prevent unkown value errors.
 # Both set the default value to the current OS to account for
 # the default use case of building on the target OS.
-feature host-os
-    :   amiga aix bsd cygwin darwin dos emx freebsd hpux
-        linux netbsd openbsd osf qnx qnxnto sgi solaris sun sunos
-        svr4 sysv ultrix unix unixware vms windows
-    :   optional ;
-        feature.set-default host-os : [ default-host-os ] ;
+feature host-os :  $(.os-names) ;
+feature.set-default host-os : [ default-host-os ] ;
+
 feature target-os
-    :   amiga aix bsd cygwin darwin dos emx freebsd hpux
-        linux netbsd openbsd osf qnx qnxnto sgi solaris sun sunos
-        svr4 sysv ultrix unix unixware vms windows
+    :   $(.os-names)
     :   propagated link-incompatible ;
-        feature.set-default target-os : [ default-host-os ] ;
+feature.set-default target-os : [ default-host-os ] ;
 
 
 feature toolset : : implicit propagated symmetric ;
@@ -169,15 +167,17 @@
 feature hardcode-dll-paths : true false : incidental ;
 
 
-# This is internal feature which holds the paths of all dependency
+# An internal feature that holds the paths of all dependency
 # dynamic libraries. On Windows, it's needed so that we can all
-# those paths to PATH, when running applications.
+# those paths to PATH when running applications.
 # On Linux, it's needed to add proper -rpath-link command line options.
 feature xdll-path : : free path ;
 
 #provides means to specify def-file for windows dlls.
 feature def-file : : free dependency ;
 
+feature.feature suppress-import-lib : false true : incidental ; 
+
 # This is internal feature which is used to store the name of 
 # bjam action to call when building a target.
 feature.feature action : : free ;
@@ -726,7 +726,7 @@
         }
                         
         # Hardcode dll paths only when linking executables.
-        # Pros: don't need to relinking libraries when installing.
+        # Pros: don't need to relink libraries when installing.
         # Cons: "standalone" libraries (plugins, python extensions)
         # can't hardcode paths to dependent libraries.
         if [ $(property-set).get <hardcode-dll-paths> ] = true

Modified: boost/trunk/tools/build/v2/tools/common.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/common.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/common.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -338,6 +338,10 @@
     if $(command:D)
     {
         if [ path.exists $(command) ]
+          # Both NT and Cygwin will run .exe files by their unqualified names
+          ||  [ os.on-windows ] && [ path.exists $(command).exe ]
+            # Only NT will run .bat files by their unqualified names
+            || [ os.name ] = NT && [ path.exists $(command).bat ]
         {
             return $(command) ;
         }        

Modified: boost/trunk/tools/build/v2/tools/darwin.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/darwin.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/darwin.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -65,14 +65,7 @@
 {
     local framework-path = [ on $(target) return $(FRAMEWORK:D) ] ;
     
-    if $(framework-path)
-    {
-        FRAMEWORK_PATH on $(target) += -F$(framework-path) ;
-    }
-    else
-    {
-        FRAMEWORK_PATH on $(target) = ;
-    }
+    FRAMEWORK_PATH on $(target) += -F$(framework-path) ;
 }
 
 rule link
@@ -82,7 +75,7 @@
 
 actions link bind LIBRARIES
 {
-    $(CONFIG_COMMAND) -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=) $(OPTIONS) $(USER_OPTIONS)
+    $(CONFIG_COMMAND) -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
     $(NEED_STRIP)strip $(NEED_STRIP)"$(<)"
 }
 
@@ -93,7 +86,7 @@
 
 actions link.dll bind LIBRARIES
 {
-    $(CONFIG_COMMAND) -dynamiclib -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=) $(OPTIONS) $(USER_OPTIONS)
+    $(CONFIG_COMMAND) -dynamiclib -L"$(LINKPATH)" -o "$(<)" "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-SA) -l$(FINDLIBS-ST) $(FRAMEWORK_PATH) -framework$(_)$(FRAMEWORK:D=:S=) $(OPTIONS) $(USER_OPTIONS)
 }
 
 actions piecemeal archive

Modified: boost/trunk/tools/build/v2/tools/gcc.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/gcc.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/gcc.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -44,6 +44,9 @@
 type.set-generated-target-suffix OBJ : <toolset>gcc : o ;
 type.set-generated-target-suffix STATIC_LIB : <toolset>gcc : a ;
 
+type.set-generated-target-suffix IMPORT_LIB : <toolset>gcc <target-os>cygwin : dll.a ;
+type.set-generated-target-suffix IMPORT_LIB : <toolset>gcc <target-os>windows : a ;
+
 import rc ;
 
 # Initializes the gcc toolset for the given version.
@@ -75,7 +78,7 @@
     #   Autodetect the version and flavor if not given.
     if $(command)
     {
-        # The 'command' variable can have multiple-element. When calling
+        # The 'command' variable can have multiple elements. When calling
         # the SHELL builtin we need a single string.
         local command-string = $(command:J=" ") ;
         local command-info = [ MATCH "^[^ ]+[ ]+[^ ]+[ ]+([^ ]+)[^(]*[(]?([^)]*)"
@@ -427,8 +430,26 @@
         }
         else
         {
-            return [ unix-linking-generator.run $(project) $(name)
+            local generated-targets = [ unix-linking-generator.run $(project) $(name)
                 : $(property-set) : $(sources) ] ;
+            
+            # If more than one target was generated, throw out the
+            # last one, which on windows just leaves the import
+            # library.  Most generators on windows simply don't accept
+            # shared libraries as input, but being able to link
+            # directly to a shared library without an import library
+            # is an important capability of GCC.  Therefore, we remove
+            # the target after the action sees it so that dependent
+            # targets don't try to link to both the import library and
+            # the DLL.
+            if [ $(property-set).get <suppress-import-lib> ] = true
+            {
+                return $(generated-targets[0]) $(generated-targets[-1]) ;
+            }
+            else
+            {
+                return $(generated-targets[1-2]) ;
+            }
         }
     }
 }
@@ -436,10 +457,18 @@
 generators.register [ new gcc-linking-generator gcc.link : LIB OBJ : EXE 
     : <toolset>gcc ] ;
 
-generators.register [ new gcc-linking-generator gcc.link.dll : LIB OBJ : SHARED_LIB 
+.IMPLIB-COMMAND = ;
+.IMPLIB-TYPE = ;
+if [ os.on-windows ]
+{
+    .IMPLIB-COMMAND = "-Wl,--out-implib," ;
+    .IMPLIB-TYPE = IMPORT_LIB ;
+}
+
+generators.register 
+  [ new gcc-linking-generator gcc.link.dll : LIB OBJ : $(.IMPLIB-TYPE) SHARED_LIB 
     : <toolset>gcc ] ;
 
-
 # Declare flags for linking
 # First, the common flags
 flags gcc.link OPTIONS <debug-symbols>on : -g ;
@@ -601,7 +630,7 @@
 # Differ from 'link' above only by -shared.
 actions link.dll bind LIBRARIES
 {
-    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" -o "$(<)" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,$(<[1]:D=) -shared $(START-GROUP) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
+    "$(CONFIG_COMMAND)" -L"$(LINKPATH)" -Wl,$(RPATH_OPTION:E=-R)$(SPACE)-Wl,"$(RPATH)" "$(.IMPLIB-COMMAND)$(<[1])" -o "$(<[-1])" $(HAVE_SONAME)-Wl,$(SONAME_OPTION)$(SPACE)-Wl,$(<[-1]:D=) -shared $(START-GROUP) "$(>)" "$(LIBRARIES)" -l$(FINDLIBS-ST) -l$(FINDLIBS-SA) $(END-GROUP) $(OPTIONS) $(USER_OPTIONS)
 }
 
 # Set up threading support. It's somewhat contrived, so perform it at the end,

Modified: boost/trunk/tools/build/v2/tools/msvc.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/msvc.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/msvc.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -298,7 +298,13 @@
                 if ! $(below-8.0)
                 {
                     cpu = i386 amd64 ia64 ;
-                    setup-option = x86 x86_amd64 x86_ia64 ;
+                    setup-option = x86 x86_amd64 x86_iPF ;
+                    
+                    # Use a native x64 compiler if possible
+                    if [ MATCH ^(AMD64) : [ os.environ PROCESSOR_IDENTIFIER ] ]
+                    {
+                        setup-option = x86 amd64 x86_IPF ;
+                    }
                 }
             }
         }
@@ -849,7 +855,7 @@
 
 # Windows Manifests is a new way to specify dependencies 
 # on managed DotNet assemblies and Windows native DLLs. The 
-# manifests are embedded as resourses and are useful in 
+# manifests are embedded as resources and are useful in 
 # any PE targets (both DLL and EXE)
 
 if [ os.name ] in NT
@@ -865,7 +871,7 @@
 
     actions link.dll bind DEF_FILE
     {
-        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:$(DEF_FILE) $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
         if %ERRORLEVEL% NEQ 0 EXIT %ERRORLEVEL%
         if exist "$(<[1]).manifest" (
             $(.MT) -manifest "$(<[1]).manifest" "-outputresource:$(<[1]);2"
@@ -884,7 +890,7 @@
 
     actions link.dll bind DEF_FILE
     {
-        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:$(DEF_FILE) $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
+        $(.LD) /DLL $(LINKFLAGS) /out:"$(<[1]:W)" /IMPLIB:"$(<[2]:W)" /LIBPATH:"$(LINKPATH:W)" /def:"$(DEF_FILE)" $(OPTIONS) @"@($(<[1]:W).rsp:E=$(nl)"$(>)" $(nl)$(LIBRARIES_MENTIONED_BY_FILE) $(nl)$(LIBRARIES) $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_ST:S=.lib)" $(nl)"$(LIBRARY_OPTION)$(FINDLIBS_SA:S=.lib)")"
         if test -e "$(<[1]).manifest"; then
             $(.MT) -manifest "$(<[1]:W).manifest" "-outputresource:$(<[1]:W);2"
         fi
@@ -962,14 +968,19 @@
     {
         if $(.version-$(i)-reg)
         {
-            local vc-path = [ W32_GETREG
-                "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"$(.version-$(i)-reg)
+            local vc-path ;
+            for local x in "" "Wow6432Node\\"
+            {
+                vc-path += [ W32_GETREG
+                "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\"$(x)$(.version-$(i)-reg)
                 : "ProductDir" ] ;
+            }
             
+            
             if $(vc-path)
             {
-                vc-path = [ path.native [ path.join [ path.make-NT $(vc-path) ] "bin" ] ] ;
-                register-configuration $(i) : $(vc-path) ;
+                vc-path = [ path.native [ path.join [ path.make-NT $(vc-path[1]) ] "bin" ] ] ;
+                register-configuration $(i) : $(vc-path[1]) ;
             }
         }
     }

Modified: boost/trunk/tools/build/v2/tools/python.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/python.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/python.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -15,12 +15,6 @@
 #
 # Extensions that use Boost.Python must explicitly link to it.
 
-# Known problems: 
-# - the directory where extension is generated is different from V2
-# - the ext + py -> pyd_run_output generator is declared to take 
-#   SHARED_LIB, not PYTHON_EXTENSION. That's because we reuse 
-#   'lib-target-class', which creates SHARED_LIB explicitly.
-
 import type ;
 import testing ;
 import generators ;
@@ -32,6 +26,12 @@
 import common ;
 import toolset : flags ;
 import regex ;
+import numbers ;
+import string ;
+import property ;
+import sequence ;
+import path ;
+import feature ;
 
 # Make this module a project
 project.initialize $(__name__) ;
@@ -56,74 +56,64 @@
 lib rt ;
 
 
-# Initializes the Python toolset.
-# - version -- the version of Python to use. Should be in Major.Minor format,
-#   for example 2.3
-# - 'root' -- the install root for Python
-# - 'includes' -- the include path to Python headers. If empty, will be
-#        guessed from 'root'
-# - 'libraries' -- the path to Python libraries. If empty, will be guessed
-#        from 'root'
-# - 'cygwin-condition' -- if specified, should be a set of properties which
-#   are present when we're building with cygwin gcc. 
-#   This argument is not used yet.
+# Initializes the Python toolset.  Note that all parameters are
+# optional.
 #
+# - version -- the version of Python to use. Should be in Major.Minor
+#   format, for example 2.3.  Do not include the subminor version.
+#
+# - cmd-or-prefix: Preferably, a command that invokes a Python
+#   interpreter.  Alternatively, the installation prefix for Python
+#   libraries and includes.  If empty, will be guessed from the
+#   version, the platform's installation patterns, and the python
+#   executables that can be found in PATH.
+#
+# - includes: the include path to Python headers. If empty, will be
+#   guessed.
+#
+# - libraries: the path to Python library binaries. If empty, will be
+#   guessed.  On MacOS/Darwin, you can also pass the path of the
+#   Python framework.
+#
+# - condition: if specified, should be a set of properties that are
+#   matched against the build configuration when Boost.Build selects a
+#   Python configuration to use.
+#
 # Example usage:
 #
-#   using python 2.3 ;  # Use default root
-#   using python 2.3 : /usr/local ; # Root specified, include and lib paths
-#                                   # will be guessed
+#   using python 2.3 ;
+#   using python 2.3 : /usr/local/bin/python ;
 #    
-rule init ( version ? : root ? : includes ? : libraries ? 
-    : cygwin-condition * )
+rule init ( version ? : cmd-or-prefix ? : includes ? : libraries ? 
+    : condition * )
 {
     .configured = true ;
     
     project.push-current $(.project) ;
-               
-    if [ os.name ] = NT
+         
+    debug-message Configuring python... ;
+    for local v in version cmd-or-prefix includes libraries condition
     {
-        init-nt $(version) : $(root) : $(includes) : $(libraries) : $(cygwin-condition) ;
+        if $($(v))
+        {
+            debug-message "  user-specified "$(v): \"$($(v))\" ;
+        }
     }
-    else if [ os.name ] = MACOSX
-    {
-        init-mac $(version) : $(root) : $(includes) : $(libraries) ;
-    } 
-    else if [ modules.peek : UNIX ]
-    {
-        init-unix $(version) : $(root) : $(includes) : $(libraries) : $(cygwin-condition) ;
-    }
     
-    if [ os.on-windows ] && ! $(.alias-defined)
-    {
-        .alias-defined = true ;
-        alias python_for_extensions : python ;
-    }
+    configure $(version) : $(cmd-or-prefix) : $(includes) : $(libraries) : $(condition) ;
     
-    
     project.pop-current ;
 }
 
-# Retrieves the Python interpreter
-rule get-python-interpreter ( )
+# A simpler version of SHELL that grabs stderr as well as stdout, but
+# returns nothing if there's an error.
+local rule shell-cmd ( cmd )
 {
-  return $(PYTHON) ;
-}
-
-# Retrieves the Python version number
-rule get-python-version ( )
-{
-  return [ python-version [ get-python-interpreter ] ] ;
-}
-
-local rule python-version ( cmd )
-{
-    cmd ?= python ;
-    local version = [ SHELL $(cmd)" -c 'import sys; print sys.version'" : exit-status ] ;
-    
-    if $(version[2]) = 0
+    # debug-message running command '$(cmd)' ;
+    x = [ SHELL $(cmd)" 2>&1" : exit-status ] ;
+    if $(x[2]) = 0
     {
-        return [ MATCH ^([0-9]+.[0-9]+) : $(version[1]) : 1 ] ;
+        return $(x[1]) ;
     }
     else
     {
@@ -131,368 +121,777 @@
     }
 }
 
-local rule python-interpreter ( cmd )
+# Try to identify Cygwin symlinks.  Invoking such a file directly as
+# an NT executable from a native Windows build of bjam would be fatal
+# to the bjam process.  One /can/ invoke them through sh.exe or
+# bash.exe, if you can prove that those aren't also symlinks ;-)
+#
+# If a symlink is found returns non-empty; we try to extract the
+# target of the symlink from the file and return that.
+#
+# Note: 1. only works on NT  2. path is a native path.
+local rule is-cygwin-symlink ( path )
 {
-    local which = [ SHELL "which "$(cmd) : exit-status ] ;
-    if $(which[2]) = 0
+    local is-symlink = ;
+    
+    # Look for a file with the given path having the S attribute set,
+    # as cygwin symlinks do.  /-C means "do not use thousands
+    # separators in file sizes."
+    local dir-listing = [ shell-cmd "DIR /-C /A:S "$(path) ] ;
+
+    if $(dir-listing)
     {
-        return $(which[1]) ;
+        # escape any special regex characters in the base part of the path
+        local base-pat = [ regex.escape $(path:D=) : ].[()*+?|\\$^ : \\ ] ;
+        
+        # extract the file's size from the directory listing
+        local size-of-system-file = [ MATCH "([0-9]+) "$(base-pat) : $(dir-listing) : 1 ] ;
+        
+        # if the file has a reasonably small size, look for the
+        # special symlink identification text
+        if $(size-of-system-file) && [ numbers.less $(size-of-system-file) 1000 ]
+        {
+            local link = [ SHELL "FIND /OFF \"!<symlink>\" \""$(path)"\" 2>&1" ] ;
+            if $(link[2]) != 0
+            {
+                local nl = "
+
" ;
+                is-symlink = [ MATCH ".*!<symlink>([^"$(nl)"]*)" : $(link[1]) : 1 ] ;
+                if $(is-symlink)
+                {
+                    is-symlink = [ *nix-path-to-native $(is-symlink) ] ;
+                    is-symlink = $(is-symlink:R=$(path:D)) ;
+                }
+
+            }
+        }
     }
-    else
+    return $(is-symlink) ;
+}
+
+# Append ext to each member of names that does not contain '.'
+local rule default-extension ( names * : ext * )
+{
+    local result ;
+    for local n in $(names)
     {
-        return ;
+        switch $(n)
+        {
+            case *.* : result += $(n) ;
+            case * : result += $(n)$(ext) ;
+        }
     }
+    return $(result) ;
 }
 
-local rule python-root ( cmd )
+# Tries to determine whether invoking "cmd" would actually attempt to
+# launch a cygwin symlink.
+#
+# Note: only works on NT
+local rule invokes-cygwin-symlink ( cmd )
 {
-    return [ MATCH (.*)/bin/[^/]* : [ SHELL "which "$(cmd) ] : 1 ] ;
+    local dirs = $(cmd:D) ;
+    if ! $(dirs)
+    {
+        dirs = . [ os.executable-path ] ;
+    }
+    local base = [ default-extension $(cmd:D=) : .exe .bat ] ;
+    local paths = [ GLOB $(dirs) : $(base) ] ;
+    if $(paths)
+    {
+        # Make sure we didn't find a Cygwin symlink.  Invoking such a
+        # file as an NT executable will be fatal to the bjam process.
+        return [ is-cygwin-symlink $(paths[1]) ] ;
+    }
 }
 
-
 local rule debug-message ( message * )
 {
     if --debug-configuration in [ modules.peek : ARGV ]
     {
-        ECHO notice: $(message) ;
+        ECHO notice: [python-cfg] $(message) ;
     }
 }
 
-# condition is a list of properties for which this python initialization applies.
-rule init-unix ( version ? : root ? : includes ? : libraries ? : condition * )
+# Like W32_GETREG, except prepend HKEY_CURRENT_USER\SOFTWARE and
+# HKEY_LOCAL_MACHINE\SOFTWARE to the first argument, returning the
+# first result found.  Also accounts for the fact that on 64-bit
+# machines, 32-bit software has its own area, under
+# SOFTWARE\Wow6432node.
+local rule software-registry-value ( path : data ? )
 {
-    #
-    # Autoconfiguration sequence
-    #
-    if $(version)
+    local result ;
+    for local root in HKEY_CURRENT_USER HKEY_LOCAL_MACHINE
     {
-        local v = [ MATCH ^([0-9]+\.[0-9]+)(.*)$ : $(version) : 1 2 ] ;
-        if ! $(v) || $(v[2])
+        for local x64elt in "" Wow6432node\\ # Account for 64-bit windows
         {
-            ECHO "Warning: \"using python\" expects a two part (major, minor) version number; got" $(version) instead ;
-            if $(v)
+            if ! $(result)
             {
-                version = $(v[1]) ;
+                result = [ W32_GETREG $(root)\\SOFTWARE\\$(x64elt)$(path) : $(data) ] ;
             }
         }
-        debug-message looking for python $(version) ;
+        
     }
+    return $(result) ;
+}
+
+.windows-drive-letter-re = ^([A-Za-z]):[\\/](.*) ;
+.cygwin-drive-letter-re = ^/cygdrive/([a-z])/(.*) ;
+
+.working-directory = [ PWD ] ;
+.working-drive-letter = [ SUBST $(.working-directory) $(.windows-drive-letter-re) $1 ] ; 
+.working-drive-letter ?= [ SUBST $(.working-directory) $(.cygwin-drive-letter-re) $1 ] ;
+  
+local rule windows-to-cygwin-path ( path )
+{
+    # if path is rooted with a drive letter, rewrite it using the
+    # /cygdrive mountpoint
+    local p = [ SUBST $(path:T) $(.windows-drive-letter-re) /cygdrive/$1/$2 ] ;
     
-    # if root is explicitly specified, look in its bin subdirectory
-    local bin = bin/ ;
-    bin = $(bin:R=$(root)) ; # will null out $(bin) if $(root) is empty.
+    # else if path is rooted without a drive letter, use the working directory
+    p ?=  [ SUBST $(path:T) ^/(.*) /cygdrive/$(.working-drive-letter:L)/$2 ] ;
     
-    if $(bin)
+    # else return the path unchanged
+    return $(p:E=$(path:T)) ;
+}
+
+# :W only works in Cygwin builds of bjam.  This one works on NT builds
+# as well.
+local rule cygwin-to-windows-path ( path )
+{
+    path = $(path:R="") ; # strip any trailing slash
+    
+    local drive-letter = [ SUBST $(path) $(.cygwin-drive-letter-re) $1:/$2 ] ;
+    if $(drive-letter)
     {
-        debug-message searching for python binaries in $(bin) ;
+        path = $(drive-letter) ;
     }
-    
-    # Form the python commands to try in order.  First look for python
-    # with the explicit version number, then without it
-    local python = python ;
-    local cmds = $(python:D=$(bin:E=""))$(version:E="") $(python:D=$(bin:E="")) ;
+    else if $(path:R=/x) = $(path) # already rooted?
+    {
+        # Look for a cygwin mount that includes each head sequence in $(path).
+        local head = $(path) ;
+        local tail = "" ;
 
-    local interpreter ;
-    while $(cmds)
-    {
-        # pop a command
-        interpreter = $(cmds[0]) ; cmds = $(cmds[2-]) ;
-        debug-message trying Python interpreter command $(interpreter) ;
-          
-        # Check to see what version that command actually runs, if any
-        local true-version = [ python-version $(interpreter) ] ;
-        
-        if ! $(true-version)
+        while $(head)
         {
-            debug-message $(interpreter) does not invoke a working Python interpreter ;
-        }
-        else
-        {
-            debug-message $(interpreter) invokes actual Python (major,minor) version $(true-version) ;
+            local root = [ 
+              software-registry-value "Cygnus Solutions\\Cygwin\\mounts v2\\"$(head) 
+                : native 
+            ] ;
             
-            # if no version was specified, assume that's OK
-            version ?= $(true-version) ;
+            if $(root)
+            {
+                path = $(tail:R=$(root)) ;
+                head = ;
+            }
+            tail = $(tail:R=$(head:D=)) ;
             
-            # if the version is a match, stop searching
-            if $(version) = $(true-version)
+            if $(head) = /
             {
-                debug-message qualifying Python interpreter found ;
-                root ?= [ python-root $(interpreter) ] ;
-                cmds = ; # break
+                head = ;
             }
+            else
+            {
+                head = $(head:D) ;
+            }
         }
     }
-    debug-message "Python interpreter command is" $(interpreter) ;
-    
-    includes ?= $(root)/include/python$(version) ;
-    debug-message "Python include path is" $(includes) ;
-    
-    libraries ?= $(root)/lib/python$(version)/config ;
-    debug-message "Python library path is" $(libraries) ;
-    
-    #
-    # End autoconfiguration sequence
-    #
-    
-    
-    # Set up the PYTHON variable to point at the interpreter.
-    # If no specific condition is specified, set global value
-    # If condition is specified, set PYTHON on target. It will
-    # override the global value.
-    if ! $(condition)
+    return [ regex.replace $(path:R="") / \\ ] ;
+}
+
+# Convert a *nix path to native
+local rule *nix-path-to-native ( path )
+{
+    if [ os.name ] = NT
     {
-        PYTHON = $(interpreter) ;
+        path = [ cygwin-to-windows-path $(path) ] ;
     }
+    return $(path) ;
+}
+  
+# Convert an NT path to native
+local rule windows-path-to-native ( path )
+{
+    if [ os.name ] = NT
+    {
+        return $(path) ;
+    }
     else
-    {              
-        flags python.capture-output PYTHON $(condition:J=/) : $(interpreter) ;
-    }   
+    {
+        return [ windows-to-cygwin-path $(path) ] ;
+    }
+}
 
-    # Provide system library dependencies for targets linking with
-    # static Python libraries.
-    #
-    # On many systems, Python uses libraries such as pthreads or
-    # libdl.  Since static libraries carry no library dependency
-    # information of their own that the linker can extract, these
-    # extra dependencies have to be given explicitly on the link line
-    # of the client.  The information about these dependencies is
-    # packaged into the "python" target below.
+# Return nonempty if path looks like a windows path, i.e. it starts
+# with a drive letter or contains backslashes.
+local rule guess-windows-path ( path )
+{
+    return [ SUBST $(path) ($(.windows-drive-letter-re)|.*([\\]).*) $1 ] ;
+}
 
-    # Even where Python itself uses pthreads, it never allows
-    # extension modules to be entered concurrently (unless they
-    # explicitly give up the interpreter lock).  Therefore, extension
-    # modules don't need the efficiency overhead of threadsafe code as
-    # produced by <threading>multi, and we handle libpthread along
-    # with other libraries here.  Note: this optimization is based on
-    # an assumption that the compiler generates link-compatible code
-    # in both the single- and multi-threaded cases, and that system
-    # libraries don't change their ABIs either.  
-
-    # Most libraries are added to 'extra-libs'. Those that depend on
-    # the toolset are added to 'extra-libs-conditional', which will be
-    # used to form more specific target alternatives.
+local rule path-to-native ( paths * )
+{
+    local result ;
     
-    local extra-libs extra-libs-conditional ;
-
-    switch [ os.name ]
+    for local p in $(paths)
     {
-        case SOLARIS :
+        if [ guess-windows-path $(p) ]
         {
-            extra-libs = pthread dl ;
-            
-            # Add a librt dependency for the gcc toolset on SunOS (the
-            # sun toolset adds -lrt unconditionally). While this
-            # appears to duplicate the logic already in gcc.jam, it
-            # doesn't as long as we're not forcing <threading>multi.
-            extra-libs-conditional = <toolset>gcc:<source>rt ;
+            result += [ windows-path-to-native $(p) ] ;
         }
-        
-        case OSF :     
+        else
         {
-            extra-libs = pthread ;
-            extra-libs-conditional = <toolset>gcc:<source>rt ;
+            result += [ *nix-path-to-native $(p:T) ] ;
         }
+    }
+    return $(result) ;
+}
+
+# Validate the version string and extract the major/minor part we care
+# about
+local rule split-version ( version )
+{
+    local major-minor = [ MATCH ^([0-9]+)\.([0-9]+)(.*)$ : $(version) : 1 2 3 ] ;
+    if ! $(major-minor[2]) || $(major-minor[3])
+    {
+        ECHO "Warning: \"using python\" expects a two part (major, minor) version number; got" $(version) instead ;
         
-        case QNX* :    
-        {
-            extra-libs =                 ;
-        }
-        
-        case HPUX :
-        {
-            extra-libs = pthread rt ;
-        }
-        
-        case * :       extra-libs = pthread dl util ;
+        # Add a zero to account for the missing digit if necessary.
+        major-minor += 0 ;
     }
     
-    if ! [ os.on-windows ]
+    return $(major-minor[1]) $(major-minor[2]) ;
+}
+
+# Build a list of versions from 3.0 down to 1.5.  Because bjam
+# can't enumerate registry sub-keys, we have no way of finding
+# a version with a 2-digit minor version, e.g. 2.10 -- let's
+# hope that never happens.
+.version-countdown = ;
+for local v in [ numbers.range 15 30 ]
+{
+    .version-countdown = [ SUBST $(v) (.)(.*) $1.$2 ] $(.version-countdown) ;
+}
+
+local rule windows-installed-pythons ( version ? )
+{
+    version ?= $(.version-countdown) ;
+    local interpreters ;
+    
+    for local v in $(version)
     {
-        # On *nix, we don't want to link either Boost.Python or Python
-        # extensions to libpython, because the Python interpreter itself
-        # provides all those symbols. If we linked to libpython, we'd get
-        # duplicate symbols. So declare two targets -- one for building
-        # extensions and another for embedding
-        alias python_for_extensions
-                     :  
-                     : $(condition)
-                     :
-                     : <include>$(includes) 
-                     ;
+        local install-path = [ 
+          software-registry-value "Python\\PythonCore\\"$(v)"\\InstallPath" ] ;
+            
+        if $(install-path)
+        {
+            install-path = [ windows-path-to-native $(install-path) ] ;
+            debug-message Registry indicates Python $(v) installed at \"$(install-path)\" ;
+        }
+            
+        interpreters += $(:E=python:R=$(install-path)) ;
     }
+    return $(interpreters) ;
+}
+
+local rule darwin-installed-pythons ( version ? )
+{
+    version ?= $(.version-countdown) ;
     
+    local prefix 
+      = [ GLOB /System/Library/Frameworks /Library/Frameworks
+          : Python.framework ] ;
     
-    # This should really be called python_for_embedding
-    alias python
-                 : $(extra-libs) 
-                 : $(condition) $(extra-libs-conditional)
-                 :
-                 : <include>$(includes) 
-                   <library-path>$(libraries)
-                   <find-shared-library>python$(version)
-                 ;
+    return $(prefix)/Versions/$(version)/bin/python ;
 }
 
-rule init-mac ( version : root ? : includes ? : libraries ? )
+# Assume "python-cmd" invokes a python interpreter and invoke it to
+# extract all the information we care about from its "sys" module.
+# Returns void if unsuccessful.
+rule dump-sys ( python-cmd )
 {
-    if ! $(root)
+    # Avoid invoking a Cygwin symlink on NT
+    local skip-symlink ;
+    if [ os.name ] = NT
     {
-        if [ GLOB /System/Library/Frameworks : Python.framework ]
+        skip-symlink = [ invokes-cygwin-symlink $(python-cmd) ] ;
+    }
+    
+    if $(skip-symlink)
+    {
+        debug-message -------------------------------------------------------------------- ;
+        debug-message \"$(python-cmd)\" would attempt to invoke a Cygwin symlink, ;
+        debug-message causing a bjam built for Windows to hang. ;
+        debug-message ;
+        debug-message If you intend to target a Cygwin build of Python, please ;
+        debug-message replace the path to the link with the path to a real executable ;
+        debug-message (guessing: \"$(skip-symlink)\") "in" your 'using python' line ;
+        debug-message "in" user-config.jam or site-config.jam.  Don't forget to escape ;
+        debug-message backslashes ;
+        debug-message -------------------------------------------------------------------- ;
+    }
+    else
+    {
+        # Prepare a List of Python format strings and expressions that
+        # can be used to print the constants we want from the sys
+        # module.
+        
+        # We don't really want sys.version since that's a complicated
+        # string, so get the information from sys.version_info
+        # instead.
+        local format = "version=%d.%d" ;
+        local exprs = "version_info[0]" "version_info[1]" ;
+        
+        for local s in $(sys-elements[2-])
         {
-            root = /System/Library/Frameworks/Python.framework/Versions/$(version) ;
+            format += $(s)=%s ;
+            exprs += $(s) ;
         }
-        else
+        
+        # Invoke Python and ask it for all those values
+        local full-cmd = 
+          $(python-cmd)" -c \"from sys import *; print '"$(format:J=\\n)"' % ("$(exprs:J=,)")\"" ;
+        
+        local output = [ shell-cmd $(full-cmd) ] ;
+        if $(output)
         {
-            root = /Library/Frameworks/Python.framework/Versions/$(version) ;
+            # Parse the output to get all the results
+            local nl = "
+
" ;
+            for s in $(sys-elements)
+            {
+                # These variables are expected to be declared local in
+                # the caller, so Jam's dynamic scoping will set their
+                # values there.
+                sys.$(s) = [ SUBST $(output) \\<$(s)=([^$(nl)]+) $1 ] ;
+            }
         }
-    }   
+        return $(output) ;
+    }
+}
 
-    # includes ?= $(PYTHON_ROOT)/include/python$(PYTHON_VERSION) ;
-    includes ?= $(root)/include/python$(version) ;
-    libraries ?= $(root)/lib/python$(version)/config ;
-
-    # Find the 'python' binary, which is used for testing.
-    # Look first in $(root)/bin, then in PATH.
-    local interpreter = [ common.get-invocation-command 
-        python : python : : $(root)/bin : path-last ] ;
+# Make sure the "libraries" and "includes" variables (in an enclosing
+# scope) have a value based on the information given.
+local rule compute-default-paths ( 
+  target-os : version ? : prefix ? : exec-prefix ? )
+{
+    exec-prefix ?= $(prefix) ;
     
-    # debug support
-    if --debug-configuration in [ modules.peek : ARGV ]
+    if $(target-os) = windows
     {
-        ECHO "notice: Python include path is" $(includes) ;
-        ECHO "notice: Python library path is" $(libraries) ;
-        ECHO "notice: Python interpreter is" $(interpreter) ;        
+        # The exec_prefix is where you're supposed to look for
+        # machine-specific libraries.
+        local default-library-path = $(exec-prefix)\\libs ;
+        local default-include-path = $(:E=Include:R=$(prefix)) ;
+        
+        # If the interpreter was found in a directory
+        # called "PCBuild" or "PCBuild8," assume we're
+        # looking at a Python built from the source
+        # distro, and go up one additional level to the
+        # default root.  Otherwise, the default root is
+        # the directory where the interpreter was found.
+        
+        # We ask Python itself what the executable path is
+        # in case of intermediate symlinks or shell
+        # scripts.
+        local executable-dir = $(executable:D) ;
+        
+        if [ MATCH ^(PCBuild) : $(executable-dir:D=) ]
+        {
+            debug-message "This Python appears to reside in a source distribution;" ;
+            debug-message "prepending \""$(executable-dir)"\" to default library search path" ;
+            
+            default-library-path = $(executable-dir)
+              $(default-library-path) ;
+            
+            default-include-path = $(:E=PC:R=$(executable-dir:D)) $(default-include-path) ;
+            
+            debug-message "and \""$(default-include-path[1])"\" to default #include path" ;
+        }
+        
+        libraries ?= $(default-library-path) ;
+        includes ?= $(default-include-path) ;
     }
-    
-    PYTHON = $(interpreter) ;
-    flags python.capture-output PYTHON : $(interpreter) ;
-    
-    PYTHON_FRAMEWORK ?= $(root) ;
-    while $(PYTHON_FRAMEWORK:D=) && $(PYTHON_FRAMEWORK:D=) != Python.framework
+    else
     {
-        PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D) ;
+        includes ?= $(prefix)/include/python$(version) ;
+        
+        local lib = $(exec-prefix)/lib ;
+        libraries ?= $(lib)/python$(version)/config $(lib) ;
     }
-    PYTHON_FRAMEWORK = $(PYTHON_FRAMEWORK:D)/Python ;
+}
 
-    alias python
-      :
-      : <os>MACOSX <toolset>darwin
-      :
-      : <include>$(includes) <framework>$(PYTHON_FRAMEWORK)
-      ;  
+# The version of the python interpreter to use
+feature.feature python : : propagated ;
+feature.feature python.interpreter : : free ;
 
-    # Unlike most *nix systems, Mac OS X's linker does not permit undefined
-    # symbols when linking a shared library. So, we still need to link
-    # against the Python framework, even when building extensions. 
-    # Note that framework builds of Python always use shared libraries,
-    # so we do not need to worry about duplicate Python symbols.
-    .alias-defined = true ;
-    alias python_for_extensions : python ;
-}
+flags python.capture-output PYTHON : <python.interpreter> ;
 
-rule init-nt ( version : root ? : includes ? : libraries ? : cygwin-condition ? )
+# Return a list of candidate commands to try when looking for a Python
+# interpreter.  prefix is expected to be a native path.
+local rule candidate-interpreters ( version ? : prefix ? : target-os )
 {
-    if ! $(cygwin-condition)
-    {        
-        # The name of Python library file does not have a dot between
-        # major and minor version. 
-        local PYTHON_VERSION_NODOT = [ regex.match ([0-9]+)[.]([0-9]+).* : $(version) : 1 2 ] ;
+    local bin-path = bin ;
+    if $(target-os) = windows
+    {
+        # on Windows, look in the root directory itself and, to work
+        # with the result of a build-from-source, the PCBuild directory
+        bin-path = PCBuild8 PCBuild ""  ; 
+    }
+    
+    bin-path = $(bin-path:R=$(prefix)) ;
+    
+    if $(target-os) in windows darwin
+    {
+        return                                          # Search:
+          $(:E=python:R=$(bin-path))                    #   Relative to the prefix, if any
+          python                                        #   In the PATH
+          [ $(target-os)-installed-pythons $(version) ] #   Standard install locations
+        ;
+    }
+    else
+    {
+        # Search relative to the prefix, or if none supplied, in PATH
+        local unversioned = $(:E=python:R=$(bin-path:E=)) ;
+        
+        # if a version was specified, look for a python with that
+        # specific version appended before looking for one called,
+        # simply, "python"
+        return $(unversioned)$(version) $(unversioned) ;
+    }
+}
 
-        PYTHON_VERSION_NODOT = $(PYTHON_VERSION_NODOT:J="") ;
+# Compute system library dependencies for targets linking with
+# static Python libraries.
+#
+# On many systems, Python uses libraries such as pthreads or
+# libdl.  Since static libraries carry no library dependency
+# information of their own that the linker can extract, these
+# extra dependencies have to be given explicitly on the link line
+# of the client.  The information about these dependencies is
+# packaged into the "python" target below.
 
-        root ?= c:/python$(PYTHON_VERSION_NODOT) ;
-	          
-        local PATH = [ modules.peek : PATH ] ;
-        local PATH = [ modules.peek : Path ] ;        
-        
-        PYTHON_INCLUDES = $(includes) ;
-        PYTHON_LIB_PATH = $(libraries) ;
+# Even where Python itself uses pthreads, it never allows
+# extension modules to be entered concurrently (unless they
+# explicitly give up the interpreter lock).  Therefore, extension
+# modules don't need the efficiency overhead of threadsafe code as
+# produced by <threading>multi, and we handle libpthread along
+# with other libraries here.  Note: this optimization is based on
+# an assumption that the compiler generates link-compatible code
+# in both the single- and multi-threaded cases, and that system
+# libraries don't change their ABIs either.  
+#
+# Returns a list consisting of ungristed library names to be used as
+# direct dependencies and conditional library names to be added to
+# target conditions.
+local rule system-library-dependencies ( target-os )
+{
+    switch $(target-os)
+    {
+        case s[uo][nl]* : # solaris, sun, sunos
+            # Add a librt dependency for the gcc toolset on SunOS (the
+            # sun toolset adds -lrt unconditionally). While this
+            # appears to duplicate the logic already in gcc.jam, it
+            # doesn't as long as we're not forcing <threading>multi.
+            return pthread dl <toolset>gcc:<library>rt ;
 
-        PYTHON_LIB_PATH ?= $(root)/libs [ GLOB $(root) : PCbuild ] ;
         
-        PYTHON_INCLUDES ?= $(root)/include [ GLOB $(root) : PC ] ;
+        case osf : return pthread <toolset>gcc:<library>rt ;
         
+        case qnx* : return ;  
+        case darwin : return ;
+        case windows : return ;
         
-        PYTHON_DLL ?= [ GLOB $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT).dll ] ;
-        PYTHON_DEBUG_DLL ?= [ GLOB $(PATH) $(Path) : python$(PYTHON_VERSION_NODOT)_d.dll ] ;
-        PYTHON_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;
-        PYTHON_DEBUG_IMPORT_LIB ?= [ GLOB $(PYTHON_LIB_PATH) : libpython$(PYTHON_VERSION_NODOT).* ] ;        
+        case hpux : return rt ;
         
-        local interpreter = [ common.get-invocation-command 
-            python.exe : python.exe : : $(root)/bin 
-                                          $(root)
-                                          $(root)/PCBuild
-                                            : path-last ] ;
+        case * : return pthread dl <toolset>gcc:<library>util ;
+    }
+}
+
+# Declare a target to represent Python's library.
+local rule declare-libpython-target ( version ? : requirements * )
+{
+    # Compute the representation of Python version in the name of
+    # Python's library file.
+    local lib-version = $(version) ;
+    if <target-os>windows in $(requirements)
+    {
+        local major-minor = [ split-version $(version) ] ;
+        lib-version = $(major-minor:J="") ;
+    }
+    
+    if ! $(lib-version)
+    {
+        ECHO *** warning: could not determine Python version, which will ;
+        ECHO *** warning: probably prevent us from linking with the python ;
+        ECHO *** warning: library.  Consider explicitly passing the version ;
+        ECHO *** warning: to 'using python'. ;
+    }
+    
+    # Declare it
+    lib python.lib : : <name>python$(lib-version) $(requirements) ;
+}
+
+# implementation of init
+local rule configure ( 
+  version ? : cmd-or-prefix ? : includes ? : libraries ? : condition * )
+{
+    local prefix ;
+    local exec-prefix ;
+    local cmds-to-try ;
+    local interpreter-cmd ;
+    
+    local target-os = [ feature.get-values target-os : $(condition) ] ;
+    target-os ?= [ feature.defaults target-os ] ;
+    target-os = $(target-os:G=) ;
+    
+    # Normalize and dissect any version number
+    local major-minor ;
+    if $(version) 
+    {
+        major-minor = [ split-version $(version) ] ;
+        version = $(major-minor:J=.) ;
+    }
+
+    local cmds-to-try ;
+    
+    if ! $(cmd-or-prefix) || [ GLOB $(cmd-or-prefix) : * ] 
+    {
+        # if the user didn't pass a command, whatever we got was a prefix
+        prefix = $(cmd-or-prefix) ;
+        cmds-to-try = [ candidate-interpreters $(version) : $(prefix) : $(target-os) ] ;
+    }
+    else
+    {
+        # Work with the command the user gave us.
+        cmds-to-try = $(cmd-or-prefix) ;
         
-        if --debug-configuration in [ modules.peek : ARGV ]
+        # On windows, don't nail down the interpreter command just yet
+        # in case the user specified something that turns out to be a
+        # cygwin symlink, which could bring down bjam if we invoke it.
+        if $(target-os) != windows
         {
-            ECHO "notice: Python include path is" $(PYTHON_INCLUDES) ;
-            ECHO "notice: Python library path is" $(PYTHON_LIB_PATH) ;
-            ECHO "notice: Python interpreter is" $(interpreter) ;        
-            ECHO "notice: Python library name is" python$(PYTHON_VERSION_NODOT) ;
+            interpreter-cmd = $(cmd-or-prefix) ;
         }
+    }
+    
+    # Anything left to find or check?
+    if ! ( $(interpreter-cmd) && $(includes) && $(libraries) )
+    {
+        # Values to be extracted from python's sys module.  These will
+        # be set by the dump-sys rule, above, using Jam's dynamic scoping.
+        local sys-elements = version platform prefix exec_prefix executable ;
+        local sys.$(sys-elements) ;
+    
+        # compute the string Python's sys.platform needs to match.  If
+        # not targeting windows or cygwin we'll assume only native
+        # builds can possibly run, so we won't require a match and we
+        # leave sys.platform blank.
+        local platform ;
+        switch $(target-os) 
+        {
+            case windows : platform = win32 ;
+            case cygwin : platform = cygwin ;
+        }
         
-        PYTHON = $(interpreter) ;
-        flags python.capture-output PYTHON : $(interpreter) ;
-               
-        properties += <library-path>$(PYTHON_LIB_PATH) ;
+        local fallback-cmd = $(cmds-to-try[1]) ;
+        local fallback-version ;
+        while $(cmds-to-try)
+        {
+            # pop top command
+            local cmd = $(cmds-to-try[1]) ;
+            cmds-to-try = $(cmds-to-try[2-]) ;
             
-        # msvc compilers auto-find the python library
-        # declare two alternatives -- one for msvc and another
-        # for the rest of the world
-        alias python 
-          :
-          : <toolset>msvc 
-          :
-          : <library-path>$(PYTHON_LIB_PATH) 
-            <include>$(PYTHON_INCLUDES)
-          ;
-                       
-        local lib = python$(PYTHON_VERSION_NODOT) ;
+            debug-message Checking interpreter command \"$(cmd)\"... ;
+            if [ dump-sys $(cmd) ]
+            {
+                fallback-version ?= $(sys.version) ;
+                
+                # Check for version/platform validity
+                for local x in version platform
+                {
+                    if $($(x)) && $($(x)) != $(sys.$(x))
+                    {
+                        debug-message ...$(x) "mismatch (looking for" 
+                            $($(x)) but found $(sys.$(x))")" ;
+                        cmd = ;
+                    }
+                }
+                
+                if $(cmd)
+                {
+                    debug-message ...requested configuration matched! ;
+                    
+                    exec-prefix = $(sys.exec_prefix) ;
+                    
+                    compute-default-paths
+                      $(target-os)
+                        : $(sys.version)
+                          : $(sys.prefix)
+                            : $(sys.exec_prefix) ;
+                    
+                    version = $(sys.version) ;
+                    interpreter-cmd ?= $(cmd) ;
+                    cmds-to-try = ; # All done.
+                }
+            }
+            else
+            {
+                debug-message ...does not invoke a working interpreter ;
+            }
+        }
         
-        alias python
-          :
-          :
-          :
-          : <library-path>$(PYTHON_LIB_PATH)    
-            <include>$(PYTHON_INCLUDES)
-            <find-shared-library>$(lib) ;                
+        # Anything left to compute?
+        if ! ( $(includes) && $(libraries) && $(interpreter-cmd) )
+        {
+            version ?= $(fallback-version) ;
+            version ?= 2.5 ;
+            
+            if ! $(interpreter-cmd)
+            {
+                fallback-cmd ?= python ;
+                ECHO warning: No working Python interpreter found. ;
+                if [ os.name ] != NT || ! [ invokes-cygwin-symlink $(fallback-cmd) ]
+                {
+                    interpreter-cmd = $(fallback-cmd) ;
+                    ECHO warning: falling back to \"$(interpreter-cmd)\" ;
+                }
+            }
+            exec-prefix ?= $(prefix) ;
+            compute-default-paths $(target-os) : $(version) : $(prefix:E=) ;
+        }
     }
-    else
-    {        
-        root ?= /usr ;  
-        if $(root) = /usr
+    
+    includes = [ path-to-native $(includes) ] ;
+    libraries = [ path-to-native $(libraries) ] ;
+    
+    debug-message "Details of this Python configuration:" ;
+    debug-message "  interpreter command:" \"$(interpreter-cmd:E=<empty>)\" ;
+    debug-message "  include path:" \"$(includes:E=<empty>)\" ;
+    debug-message "  library path:" \"$(libraries:E=<empty>)\" ;
+    if $(target-os) = windows
+    {
+        debug-message "  DLL search path:" \"$(exec-prefix:E=<empty>)\" ;
+    }
+    
+    
+    #
+    # End autoconfiguration sequence
+    #
+    
+    # Add the version, if any, to the condition
+    if $(version)
+    {
+        if ! $(version) in [ feature.values python ] 
         {
-            CYGWIN_PYTHON_DLL_PATH ?= /bin ;
+            feature.extend python : $(version) ;
         }
+        condition += <python>$(version:E=default) ;
+    }
+    
+    condition += <target-os>$(target-os) ;
+    
+    # Set up the PYTHON variable to point at the interpreter.    
+    local target-requirements = $(condition) ;
+    local system-libs ;
+    for local x in [ system-library-dependencies $(target-os) ]
+    {
+        if $(x:G)
+        {
+            target-requirements += $(x) ;
+        }
         else
         {
-            CYGWIN_PYTHON_DLL_PATH ?= $(root)/bin ;
+            system-libs += $(x) ;
         }
-        CYGWIN_PYTHON_LIB_PATH ?= $(CYGWIN_PYTHON_ROOT)/lib/python$(version)/config ;
-      
-        CYGWIN_PYTHON_DEBUG_VERSION ?= $(version) ;
-        CYGWIN_PYTHON_DEBUG_ROOT ?= /usr/local/pydebug ;
-        CYGWIN_PYTHON_DEBUG_DLL_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/bin ;
-        CYGWIN_PYTHON_DEBUG_LIB_PATH ?= $(CYGWIN_PYTHON_DEBUG_ROOT)/lib/python$(CYGWIN_PYTHON_DEBUG_VERSION)/config ;        
+    }      
+    
+    # See if we can find a framework directory on darwin
+    local framework-directory ;
+    if $(target-os) = darwin
+    {
+        # Search upward for the framework directory
+        local framework-directory = $(libraries[-1]) ;
+        while $(framework-directory:D=) && $(framework-directory:D=) != Python.framework
+        {
+            framework-directory = $(framework-directory:D) ;
+        }
         
-        local properties ;
+        if $(framework-directory) = Python.framework
+        {
+            debug-message framework directory is \"$(fwk)\" ;
+        }
+        else
+        {
+            debug-message no framework directory found; using library path ;
+            framework-directory = ;
+        }
+    }
 
-        properties += <library-path>$(CYGWIN_PYTHON_LIB_PATH) 
-                      <find-shared-library>python$(CYGWIN_PYTHON_VERSION).dll ;
-        
-        properties += <include>$(root)/include/python$(version) ;          
-          
+    # Make sure that we can find the Python DLL on windows
+    local dll-path ;
+    if $(target-os) = windows && $(exec-prefix)
+    {
+        dll-path += $(exec-prefix) ;
+    }
+    
+    local usage-requirements = <include>$(includes) <python.interpreter>$(interpreter-cmd) ;
+    
+    #
+    # Declare the "python" target. This should really be called
+    # python_for_embedding
+    #
+    
+    if $(framework-directory)
+    {
         alias python
+          : 
+          : $(target-requirements)
           :
-          : $(cygwin-condition)
+          : $(usage-requirements) <framework>$(fwk)
+          ;
+    }
+    else
+    {
+        declare-libpython-target $(version) : $(target-requirements) ;
+        alias python
+          : $(system-libs)
+          : $(target-requirements) 
           :
-          : $(properties)
-          ;        
-    }    
+            # why python.lib must be listed here instead of along with
+            # the system libs is a mystery, but if we don't do it, on
+            # cygwin, -lpythonX.Y never appears in the command line
+            # (although it does on linux).
+          : $(usage-requirements) <library-path>$(libraries) <dll-path>$(dll-path) <library>python.lib
+          ;
+    }
+    
+    # On *nix, we don't want to link either Boost.Python or Python
+    # extensions to libpython, because the Python interpreter itself
+    # provides all those symbols. If we linked to libpython, we'd get
+    # duplicate symbols. So declare two targets -- one for building
+    # extensions and another for embedding
+    #
+    # Unlike most *nix systems, Mac OS X's linker does not permit undefined
+    # symbols when linking a shared library. So, we still need to link
+    # against the Python framework, even when building extensions. 
+    # Note that framework builds of Python always use shared libraries,
+    # so we do not need to worry about duplicate Python symbols.
+    if $(target-os) in windows cygwin darwin
+    {
+        alias python_for_extensions : python : $(target-requirements) ;
+    }
+    else
+    {
+        alias python_for_extensions
+                     :  
+                     : $(target-requirements)
+                     :
+                     : $(usage-requirements)
+                     ;
+    }
 }
 
-
 rule configured ( ) 
 {
      return $(.configured) ;
@@ -500,21 +899,30 @@
         
 type.register PYTHON_EXTENSION : : SHARED_LIB ;
 
-# We can't give "dll" suffix to PYTHON_EXTENSION, because
-# we would not know what "a.dll" is: python extenstion or
-# ordinary library. Therefore, we specify only suffixes
-# used for generation of targets.
+# We can't simply assign the "dll" or "so" suffix to PYTHON_EXTENSION,
+# because then we wouldn't know whether "x.dll" is a python extension
+# or an ordinary library. Therefore, we specify only the suffixes used
+# for target generation.
 type.set-generated-target-suffix PYTHON_EXTENSION : : so ;
-type.set-generated-target-suffix PYTHON_EXTENSION : <os>NT : pyd ;
-type.set-generated-target-suffix PYTHON_EXTENSION : <os>CYGWIN : dll ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>windows : pyd ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>cygwin : dll ;
 
+# Prior to python 2.5, HPUX extension modules had a ".sl" extension
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>2.4 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>2.3 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>2.2 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>2.1 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>2.0 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>1.6 : sl ;
+type.set-generated-target-suffix PYTHON_EXTENSION : <target-os>hpux <python>1.5 : sl ;
+
 # Unset 'lib' prefix for PYTHON_EXTENSION
 type.set-generated-target-prefix PYTHON_EXTENSION : : "" ;
 
 rule python-extension ( name : sources * : requirements * : default-build * : 
                         usage-requirements * )
 {
-    requirements += <use>/python//python_for_extensions ;
+    requirements += <use>/python//python_for_extensions <suppress-import-lib>true ;
                     
     local project = [ project.current ] ;
 
@@ -598,18 +1006,21 @@
                 local extension = [ generators.construct $(project) $(name) :
                   PYTHON_EXTENSION : $(property-set) : $(s) $(libs) ] ;
 
-                # The important part of usage requirements returned from
-                # PYTHON_EXTENSION genrator are xdll-path properties that
-                # will allow to find python extension at runtime.
+                # The important part of usage requirements returned
+                # from PYTHON_EXTENSION generator are xdll-path
+                # properties that will allow us to find the python
+                # extension at runtime.
                 property-set = [ $(property-set).add $(extension[1]) ] ;
-                # Ignore usage requirements. We're top-level generator and
-                # nobody is going to use us.
+                
+                # Ignore usage requirements. We're a top-level
+                # generator and nobody is going to use what we
+                # generate.
                 new-sources += $(extension[2-]) ;
             }
         }
 
         property-set = [ $(property-set).add-raw <dependency>$(other-pythons) ] ;
-        
+
         result = [ construct-result $(python) $(extensions) $(new-sources) 
           : $(project) $(name) : $(property-set) ] ;        
     }    
@@ -621,6 +1032,19 @@
 generators.register-standard testing.expect-success 
   : RUN_PYD_OUTPUT : RUN_PYD ;
 
+# There are two different ways of spelling OS names.  One is used for
+# [ os.name ] and the other is used for the <host-os> and <target-os>
+# properties.  Until that is remedied, this sets up a crude mapping
+# from the latter to the former, that will work *for the purposes of
+# cygwin/NT cross-builds only*.  Couldn't think of a better name than
+# "translate"
+.translate-os-windows = NT ;
+.translate-os-cygwin = CYGWIN ;
+local rule translate-os ( src-os )
+{
+    local x = $(.translate-os-$(src-os)) [ os.name ] ;
+    return $(x[1]) ;
+}
 
 # The flag settings on testing.capture-output do not
 # apply to python.capture output at the moment.
@@ -633,14 +1057,34 @@
     # DLL. Only $(sources[1]) is passed to testing.capture-output,
     # so RUN_PATH variable on $(sources[2]) is not consulted. Move it
     # over explicitly.
-    RUN_PATH on $(sources[1]) = [ on $(sources[2]) return $(RUN_PATH) ] ;
-    PYTHONPATH = [ on $(sources[2]) return $(LOCATE) ] ;
+    RUN_PATH on $(sources[1]) = [ on $(sources[2-]) return $(RUN_PATH) ] ;
+    
+    PYTHONPATH = [ on $(sources[2-]) return $(LOCATE) $(SEARCH) ] ;
+    
     # After test is run, we remove the Python module, but not the Python
     # script.
     testing.capture-output $(target) : $(sources[1]) : $(properties) 
-      : $(sources[2]) ;
-    local c = [ common.prepend-path-variable-command PYTHONPATH : $(PYTHONPATH) ] ;
-    LAUNCHER on $(target) = $(c) [ on $(target) return $(PYTHON) ] ;
+      : $(sources[2-]) ;
+
+    # PYTHONPATH is different; it will be interpreted by whichever
+    # Python is invoked and so must follow path rules for the target
+    # os.  The only OSes where we can run pythons for other OSes
+    # currently are NT and CYGWIN, so we only need to handle those
+    # cases.
+    local target-os = [ feature.get-values target-os : $(properties) ] ;
+    # oddly, host-os isn't in properties, so grab the default value.
+    local host-os = [ feature.defaults host-os ] ; 
+    host-os = $(host-os:G=) ;
+    if $(target-os) != $(host-os)
+    {
+        PYTHONPATH = 
+          [ sequence.transform $(host-os)-to-$(target-os)-path : $(PYTHONPATH) ] ;
+    }
+    local path-separator = 
+      [ os.path-separator [ translate-os $(target-os) ] ] ;
+    local set-PYTHONPATH = 
+      [ common.variable-setting-command PYTHONPATH : $(PYTHONPATH:J=$(path-separator)) ] ;
+    LAUNCHER on $(target) = $(set-PYTHONPATH) [ on $(target) return $(PYTHON) ] ;
 }
 
 rule bpl-test ( name : sources * : requirements * )

Modified: boost/trunk/tools/build/v2/tools/testing.jam
===================================================================
--- boost/trunk/tools/build/v2/tools/testing.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/tools/testing.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -354,7 +354,7 @@
 #   - if 'none', does not remove anything, ever
 #   - if empty, removes 'source'
 #   - if non-empty and not 'none', contains a list of sources to remove.
-rule capture-output ( target : source : properties * : targets-to-remove ? )
+rule capture-output ( target : source : properties * : targets-to-remove * )
 {
     output-file on $(target) = $(target:S=.output) ;
     LOCATE on $(target:S=.output) = [ on $(target) return $(LOCATE) ] ;

Modified: boost/trunk/tools/build/v2/util/os.jam
===================================================================
--- boost/trunk/tools/build/v2/util/os.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/util/os.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -5,6 +5,7 @@
 # (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 
 
 import modules ;
+import string ;
 
 # Return the value(s) of the given environment variable(s) at the time
 # bjam was invoked.
@@ -17,50 +18,77 @@
 .platform = [ modules.peek : OSPLAT ] ;
 .version = [ modules.peek : OSVER ] ;
 
-local rule constant ( c )
+local rule constant ( c : os ? )
 {
+    os ?= $(.name) ;
     # First look for platform-specific name, then general value
-    local variables = .$(c)-$(.name) .$(c) ;
+    local variables = .$(c)-$(os) .$(c) ;
     local result = $($(variables)) ;
     return $(result[1]) ;
 }
 
-rule get-constant  ( )
+rule get-constant  ( os ? )
 {
     # Find the name of the constant being accessed, which is
     # equal to the name used to invoke us.
     local bt = [ BACKTRACE 1 ] ;
     local rulename = [ MATCH ([^.]*)$ : $(bt[4]) ] ;
-    return [ constant $(rulename) ] ;
+    return [ constant $(rulename) : $(os) ] ;
 }
 
 
 # export all the common constants
-.constants = name platform version shared-library-path-variable path-separator ;
+.constants = name platform version shared-library-path-variable path-separator executable-path-variable executable-suffix ;
 for local constant in $(.constants) 
 {
     IMPORT $(__name__) : get-constant : $(__name__) : $(constant) ;
 }
 EXPORT $(__name__) : $(.constants) ;
 
-.shared-library-path-variable-NT = PATH ;
+.executable-path-variable-NT = PATH ;
+# On Windows the case and capitalization of PATH is not always
+# predictable, so let's find out what variable name was really set.
+if $(.name) = NT
+{
+    for local n in [ VARNAMES .ENVIRON ]
+    {
+        if $(n:L) = path
+        {
+            .executable-path-variable-NT = $(n) ;
+        }
+    }
+}
+
+# Specific constants for various platforms.  There's no need to define
+# any constant whose value would be the same as the default, below.
+.shared-library-path-variable-NT = $(.executable-path-variable-NT) ;
 .path-separator-NT = ";" ;
 .expand-variable-prefix-NT = % ;
 .expand-variable-suffix-NT = % ;
+.executable-suffix-NT = .exe ;
 
 .shared-library-path-variable-CYGWIN = PATH ;
-.path-separator-CYGWIN = ":" ;
-.expand-variable-prefix-CYGWIN = $ ;
-.expand-variable-suffix-CYGWIN = "" ;
 
 .shared-library-path-variable-MACOSX = DYLD_LIBRARY_PATH ;
 
-
+# Default constants
 .shared-library-path-variable = LD_LIBRARY_PATH ;
 .path-separator = ":" ;
 .expand-variable-prefix = $ ;
 .expand-variable-suffix = "" ;
+.executable-path-variable = PATH ;
+.executable-suffix = "" ;
 
+# Return a list of the directories in the PATH.  Yes, that information
+# is (sort of) available in the global module, but jam code can change
+# those values, and it isn't always clear what case/capitalization to
+# use when looking.  This rule is a more reliable way to get there.
+rule executable-path ( )
+{
+    return [ string.words [ environ [ constant executable-path-variable ] ] 
+          : [ constant path-separator ] ] ;
+}
+  
 if $(.name) = NT
 {
     local home = [ environ HOMEDRIVE HOMEPATH ] ;

Modified: boost/trunk/tools/build/v2/util/sequence.jam
===================================================================
--- boost/trunk/tools/build/v2/util/sequence.jam	2007-03-26 21:40:38 UTC (rev 14043)
+++ boost/trunk/tools/build/v2/util/sequence.jam	2007-03-26 21:47:29 UTC (rev 14044)
@@ -46,7 +46,17 @@
     return $(result) ;
 }
 
+rule reverse ( s * )
+{
+    local r ;
+    for local x in $(s)
+    {
+        r = $(x) $(r) ;
+    }
+    return $(r) ;
+}
 
+
 rule less ( a b )
 {
     if $(a) < $(b)
@@ -304,5 +314,7 @@
         
         assert.result e-3 h-3 
           : sequence.select-highest-ranked e-1 e-3 h-3 m-2 : 1 3 3 2 ;
+        
+        assert.result 7 6 5 4 3 2 1 : sequence.reverse 1 2 3 4 5 6 7 ;
     }
 }




More information about the pkg-boost-commits mailing list