Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r55477 - in branches/release: boost/wave boost/wave/cpplexer boost/wave/cpplexer/re2clex boost/wave/util libs/wave
From: hartmut.kaiser_at_[hidden]
Date: 2009-08-08 18:08:01


Author: hkaiser
Date: 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
New Revision: 55477
URL: http://svn.boost.org/trac/boost/changeset/55477

Log:
Wave: merged most urgent patches from trunk
Text files modified:
   branches/release/boost/wave/cpplexer/cpp_lex_token.hpp | 3
   branches/release/boost/wave/cpplexer/re2clex/cpp_re2c_lexer.hpp | 6
   branches/release/boost/wave/util/cpp_include_paths.hpp | 8
   branches/release/boost/wave/util/cpp_macromap.hpp | 13 +
   branches/release/boost/wave/util/flex_string.hpp | 251 ++++++++++++++++++++++++++++++---------
   branches/release/boost/wave/util/unput_queue_iterator.hpp | 4
   branches/release/boost/wave/wave_config.hpp | 57 ++++----
   branches/release/boost/wave/wave_version.hpp | 4
   branches/release/libs/wave/ChangeLog | 10 +
   9 files changed, 252 insertions(+), 104 deletions(-)

Modified: branches/release/boost/wave/cpplexer/cpp_lex_token.hpp
==============================================================================
--- branches/release/boost/wave/cpplexer/cpp_lex_token.hpp (original)
+++ branches/release/boost/wave/cpplexer/cpp_lex_token.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -23,6 +23,7 @@
 
 #include <boost/throw_exception.hpp>
 #include <boost/pool/singleton_pool.hpp>
+#include <boost/detail/atomic_count.hpp>
 
 // this must occur after all of the includes and before any code appears
 #ifdef BOOST_HAS_ABI_HEADERS
@@ -131,7 +132,7 @@
     token_id id; // the token id
     string_type value; // the text, which was parsed into this token
     position_type pos; // the original file position
- std::size_t refcnt;
+ boost::detail::atomic_count refcnt;
 };
 
 ///////////////////////////////////////////////////////////////////////////////

Modified: branches/release/boost/wave/cpplexer/re2clex/cpp_re2c_lexer.hpp
==============================================================================
--- branches/release/boost/wave/cpplexer/re2clex/cpp_re2c_lexer.hpp (original)
+++ branches/release/boost/wave/cpplexer/re2clex/cpp_re2c_lexer.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -101,7 +101,11 @@
     include_guards<token_type> guards;
 #endif
         
+#if BOOST_WAVE_SUPPORT_THREADING == 0
     static token_cache<string_type> const cache;
+#else
+ token_cache<string_type> const cache;
+#endif
 };
 
 ///////////////////////////////////////////////////////////////////////////////
@@ -344,11 +348,13 @@
     lexer<IteratorT, PositionT> re2c_lexer;
 };
 
+#if BOOST_WAVE_SUPPORT_THREADING == 0
 ///////////////////////////////////////////////////////////////////////////////
 template <typename IteratorT, typename PositionT>
 token_cache<typename lexer<IteratorT, PositionT>::string_type> const
     lexer<IteratorT, PositionT>::cache =
         token_cache<typename lexer<IteratorT, PositionT>::string_type>();
+#endif
     
 } // namespace re2clex
 

Modified: branches/release/boost/wave/util/cpp_include_paths.hpp
==============================================================================
--- branches/release/boost/wave/util/cpp_include_paths.hpp (original)
+++ branches/release/boost/wave/util/cpp_include_paths.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -57,10 +57,10 @@
 {
     typedef std::pair<FromType, ToType> value_type;
 
-#if defined(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS) ||\
- defined(BOOST_MSVC)&&(BOOST_MSVC<1300) ||\
- defined(BOOST_INTEL_CXX_VERSION)&&defined(_MSC_VER)&&\
- (BOOST_INTEL_CXX_VERSION<=700)
+// _MSC_FULL_VER == 160020506 detects the VC10 Beta 1 compiler
+#if defined(BOOST_NO_POINTER_TO_MEMBER_TEMPLATE_PARAMETERS) || \
+ defined(BOOST_MSVC) && ((BOOST_MSVC < 1300) || (_MSC_FULL_VER == 160020506)) || \
+ defined(BOOST_INTEL_CXX_VERSION) && defined(_MSC_VER) && (BOOST_INTEL_CXX_VERSION <= 700)
 
     BOOST_STATIC_CONSTANT(unsigned, from_offset = offsetof(value_type, first));
     BOOST_STATIC_CONSTANT(unsigned, to_offset = offsetof(value_type, second));

Modified: branches/release/boost/wave/util/cpp_macromap.hpp
==============================================================================
--- branches/release/boost/wave/util/cpp_macromap.hpp (original)
+++ branches/release/boost/wave/util/cpp_macromap.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -862,12 +862,13 @@
         gen_type;
     typedef typename gen_type::return_type iterator_type;
 
-iterator_type first_it = gen_type::generate(first);
-iterator_type last_it = gen_type::generate(last);
-
-on_exit::assign<IteratorT, iterator_type> on_exit(first, first_it);
-ContainerT pending_queue;
-bool seen_newline;
+ ContainerT empty;
+ iterator_type first_it = gen_type::generate(empty, first);
+ iterator_type last_it = gen_type::generate(last);
+
+ on_exit::assign<IteratorT, iterator_type> on_exit(first, first_it);
+ ContainerT pending_queue;
+ bool seen_newline;
     
     while (!pending_queue.empty() || first_it != last_it) {
         expanded.push_back(

Modified: branches/release/boost/wave/util/flex_string.hpp
==============================================================================
--- branches/release/boost/wave/util/flex_string.hpp (original)
+++ branches/release/boost/wave/util/flex_string.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -26,6 +26,10 @@
 // #HK070307:
 // - Once again incorporated the changes from Andrei's latest version of
 // this class
+//
+// #HK090523:
+// - Incorporated the changes from latest version of flex_string as
+// maintained in Loki
 
 #ifndef FLEX_STRING_INC_
 #define FLEX_STRING_INC_
@@ -1442,9 +1446,10 @@
         }
     private:
         const flex_string& s_;
+ Invariant& operator=(const Invariant&);
     };
 #endif
-
+
 public:
     // types
     typedef T traits_type;
@@ -1646,8 +1651,7 @@
 #ifndef NDEBUG
         Invariant checker(*this);
 #endif
- static std::less_equal<const value_type*> le;
- if (le(&*begin(), s) && le(s, &*end())) // aliasing
+ if (IsAliasedRange(s, s + n))
         {
             const size_type offset = s - &*begin();
             Storage::reserve(size() + n);
@@ -1760,6 +1764,51 @@
     }
     
 private:
+ // Care must be taken when dereferencing some iterator types.
+ //
+ // Users can implement this function in their namespace if their storage
+ // uses a special iterator type, the function will be found through ADL.
+ template<class Iterator>
+ const typename std::iterator_traits<Iterator>::value_type*
+ DereferenceValidIterator(Iterator it) const
+ {
+ return &*it;
+ }
+
+ // Care must be taken when dereferencing a reverse iterators, hence this
+ // special case. This isn't in the std namespace so as not to pollute it or
+ // create name clashes.
+ template<typename Iterator>
+ const typename std::iterator_traits<Iterator>::value_type*
+ DereferenceValidIterator(std::reverse_iterator<Iterator> it) const
+ {
+ return &*--it;
+ }
+
+ // Determine if the range aliases the current string.
+ //
+ // This method cannot be const because calling begin/end on copy-on-write
+ // implementations must have side effects.
+ // A const version wouldn't make the string unique through this call.
+ template<class Iterator>
+ bool IsAliasedRange(Iterator beginIterator, Iterator endIterator)
+ {
+ if(!empty() && beginIterator != endIterator)
+ {
+ typedef const typename std::iterator_traits<Iterator>::value_type *
+ pointer;
+
+ pointer myBegin(&*begin());
+ pointer myEnd(&*begin() + size());
+ pointer rangeBegin(DereferenceValidIterator(beginIterator));
+
+ const std::less_equal<pointer> less_equal = std::less_equal<pointer>();
+ if(less_equal(myBegin, rangeBegin) && less_equal(rangeBegin, myEnd))
+ return true;
+ }
+ return false;
+ }
+
     template <int i> class Selector {};
 
     flex_string& InsertImplDiscr(iterator p,
@@ -1768,24 +1817,32 @@
 #ifndef NDEBUG
         Invariant checker(*this);
 #endif
- assert(p >= begin() && p <= end());
- if (capacity() - size() < n)
+ assert(begin() <= p && p <= end());
+ const size_type insertOffset(p - begin());
+ const size_type originalSize(size());
+ if(n < originalSize - insertOffset)
+ {
+ // The new characters fit within the original string.
+ // The characters that are pushed back need to be moved because
+ // they're aliased.
+ // The appended characters will all be overwritten by the move.
+ append(n, value_type(0));
+ value_type* begin(&*begin());
+ flex_string_details::pod_move(begin + insertOffset,
+ begin + originalSize, begin + insertOffset + n);
+ std::fill(begin + insertOffset, begin + insertOffset + n, c);
+ }
+ else
         {
- const size_type sz = p - begin();
- reserve(size() + n);
- p = begin() + sz;
- }
- const iterator oldEnd = end();
- if (p + n < oldEnd)
- {
- append(oldEnd - n, oldEnd);
- flex_string_details::pod_move(&*p, &*oldEnd - n, &*p + n);
- std::fill(p, p + n, c);
- }
- else {
- append(n - (end() - p), c);
- append(p, oldEnd);
- std::fill(p, oldEnd, c);
+ // The new characters exceed the original string.
+ // The characters that are pushed back can simply be copied since
+ // they aren't aliased.
+ // The appended characters will partly be overwritten by the copy.
+ append(n, c);
+ value_type* begin(&*begin());
+ flex_string_details::pod_copy(begin + insertOffset,
+ begin + originalSize, begin + insertOffset + n);
+ std::fill(begin + insertOffset, begin + originalSize, c);
         }
         return *this;
     }
@@ -1795,7 +1852,7 @@
         InputIterator b, InputIterator e, Selector<0>)
     {
         InsertImpl(i, b, e,
- std::iterator_traits<InputIterator>::iterator_category());
+ typename std::iterator_traits<InputIterator>::iterator_category());
         return *this;
     }
 
@@ -1803,12 +1860,29 @@
     void InsertImpl(iterator i,
         FwdIterator s1, FwdIterator s2, std::forward_iterator_tag)
     {
+ if(s1 == s2)
+ {
+ // Insert an empty range.
+ return;
+ }
+
+ if(IsAliasedRange(s1, s2))
+ {
+ // The source range is contained in the current string, copy it
+ // and recurse.
+ const flex_string temporary(s1, s2);
+ InsertImpl(i, temporary.begin(), temporary.end(),
+ typename std::iterator_traits<FwdIterator>::iterator_category());
+ return;
+ }
+
 #ifndef NDEBUG
         Invariant checker(*this);
 #endif
         const size_type pos = i - begin();
         const typename std::iterator_traits<FwdIterator>::difference_type n2 =
             std::distance(s1, s2);
+
         assert(n2 >= 0);
         using namespace flex_string_details;
         assert(pos <= size());
@@ -1817,10 +1891,8 @@
             capacity() - size();
         if (maxn2 < n2)
         {
- // realloc the string
- static const std::less_equal<const value_type*> le =
- std::less_equal<const value_type*>();
- assert(!(le(&*begin(), &*s1) && le(&*s1, &*end())));
+ // Reallocate the string.
+ assert(!IsAliasedRange(s1, s2));
             reserve(size() + n2);
             i = begin() + pos;
         }
@@ -1845,16 +1917,17 @@
     }
 
     template <class InputIterator>
- void InsertImpl(iterator i1, iterator i2,
- InputIterator b, InputIterator e, std::input_iterator_tag)
- {
- flex_string temp(begin(), i1);
- for (; b != e; ++b)
+ void InsertImpl(iterator insertPosition,
+ InputIterator inputBegin, InputIterator inputEnd,
+ std::input_iterator_tag)
+ {
+ flex_string temporary(begin(), insertPosition);
+ for (; inputBegin != inputEnd; ++inputBegin)
         {
- temp.push_back(*b);
+ temporary.push_back(*inputBegin);
         }
- temp.append(i2, end());
- swap(temp);
+ temporary.append(insertPosition, end());
+ swap(temporary);
     }
 
 public:
@@ -1965,7 +2038,7 @@
         InputIterator b, InputIterator e, Selector<0>)
     {
         ReplaceImpl(i1, i2, b, e,
- std::iterator_traits<InputIterator>::iterator_category());
+ typename std::iterator_traits<InputIterator>::iterator_category());
         return *this;
     }
 
@@ -1983,29 +2056,25 @@
         std::distance(s1, s2);
         assert(n2 >= 0);
 
- // Handle aliased replace
- static const std::less_equal<const value_type*> le =
- std::less_equal<const value_type*>();
- const bool aliased = le(&*begin(), &*s1) && le(&*s1, &*end());
- if (aliased /* && capacity() < size() - n1 + n2 */)
- {
- // Aliased replace, copy to new string
- flex_string temp;
- temp.reserve(size() - n1 + n2);
- temp.append(begin(), i1).append(s1, s2).append(i2, end());
- swap(temp);
+ if (IsAliasedRange(s1, s2))
+ {
+ // Aliased replace, copy to new string.
+ flex_string temporary;
+ temporary.reserve(size() - n1 + n2);
+ temporary.append(begin(), i1).append(s1, s2).append(i2, end());
+ swap(temporary);
             return;
         }
 
         if (n1 > n2)
         {
- // shrinks
+ // Shrinks
             std::copy(s1, s2, i1);
             erase(i1 + n2, i2);
         }
         else
         {
- // grows
+ // Grows
             flex_string_details::copy_n(s1, n1, i1);
             std::advance(s1, n1);
             insert(i2, s1, s2);
@@ -2063,10 +2132,13 @@
     
     size_type find(const flex_string& str, size_type pos = 0) const
     { return find(str.data(), pos, str.length()); }
-
+
     size_type find (const value_type* s, size_type pos, size_type n) const
     {
- for (; pos <= size(); ++pos)
+ const size_type size_(size());
+ if (n + pos > size_)
+ return npos;
+ for (; pos < size_; ++pos)
         {
             if (traits_type::compare(&*begin() + pos, s, n) == 0)
             {
@@ -2255,12 +2327,8 @@
     {
         Enforce(pos1 <= size(), (std::out_of_range*)0, "");
         Procust(n1, size() - pos1);
- const int r = traits_type::compare(data()+pos1, s, Min(n1, n2));
- return
- r != 0 ? r :
- n1 > n2 ? 1 :
- n1 < n2 ? -1 :
- 0;
+ const int r = traits_type::compare(pos1 + data(), s, Min(n1, n2));
+ return r != 0 ? r : n1 > n2 ? 1 : n1 < n2 ? -1 : 0;
     }
 
     std::ptrdiff_t compare(size_type pos1, size_type n1,
@@ -2273,7 +2341,11 @@
 
     std::ptrdiff_t compare(const value_type* s) const
     {
- return traits_type::compare(data(), s, traits_type::length(s));
+ // Could forward to compare(0, size(), s, traits_type::length(s))
+ // but that does two extra checks
+ const size_type n1(size()), n2(traits_type::length(s));
+ const int r = traits_type::compare(data(), s, Min(n1, n2));
+ return r != 0 ? r : n1 > n2 ? 1 : n1 < n2 ? -1 : 0;
     }
 };
 
@@ -2427,8 +2499,12 @@
     const flex_string<E, T, A, S>& rhs)
 { return !(lhs < rhs); }
 
-// subclause 21.3.7.8:
-//void swap(flex_string<E, T, A, S>& lhs, flex_string<E, T, A, S>& rhs); // to do
+template <typename E, class T, class A, class S>
+void swap(flex_string<E, T, A, S>& lhs, flex_string<E, T, A, S>& rhs)
+{
+ // subclause 21.3.7.8:
+ lhs.swap(rhs);
+}
 
 template <typename E, class T, class A, class S>
 inline std::basic_istream<typename flex_string<E, T, A, S>::value_type,
@@ -2447,6 +2523,23 @@
     const flex_string<E, T, A, S>& str)
 { return os << str.c_str(); }
 
+
+// The getline below implementations are from the SGI STL (http://www.sgi.com/tech/stl/)
+// and come with the following copyright:
+//
+// Permission to use, copy, modify, distribute and sell this software and its
+// documentation for any purpose is hereby granted without fee, provided that
+// the below copyright notice appears in all copies and that both the copyright
+// notice and this permission notice appear in supporting documentation. Silicon
+// Graphics makes no representations about the suitability of this software for
+// any purpose. It is provided "as is" without express or implied warranty.
+//
+// Copyright © 1997-1999
+// Silicon Graphics Computer Systems, Inc.
+//
+// Copyright © 1994
+// Hewlett-Packard Company
+
 template <typename E, class T, class A, class S>
 std::basic_istream<typename flex_string<E, T, A, S>::value_type,
     typename flex_string<E, T, A, S>::traits_type>&
@@ -2454,7 +2547,42 @@
     std::basic_istream<typename flex_string<E, T, A, S>::value_type,
         typename flex_string<E, T, A, S>::traits_type>& is,
     flex_string<E, T, A, S>& str,
- typename flex_string<E, T, A, S>::value_type delim);
+ typename flex_string<E, T, A, S>::value_type delim)
+{
+ size_t nread = 0;
+ typename std::basic_istream<typename flex_string<E, T, A, S>::value_type,
+ typename flex_string<E, T, A, S>::traits_type>::sentry sentry(is, true);
+
+ if (sentry) {
+ std::basic_streambuf<typename flex_string<E, T, A, S>::value_type,
+ typename flex_string<E, T, A, S>::traits_type>* buf = is.rdbuf();
+ str.clear();
+
+ while (nread < str.max_size()) {
+ int c1 = buf->sbumpc();
+ if (flex_string<E, T, A, S>::traits_type::eq_int_type(c1,
+ flex_string<E, T, A, S>::traits_type::eof()))
+ {
+ is.setstate(std::ios_base::eofbit);
+ break;
+ }
+ else {
+ ++nread;
+ typename flex_string<E, T, A, S>::value_type c =
+ flex_string<E, T, A, S>::traits_type::to_char_type(c1);
+
+ if (!flex_string<E, T, A, S>::traits_type::eq(c, delim))
+ str.push_back(c);
+ else
+ break; // Character is extracted but not appended.
+ }
+ }
+ }
+ if (nread == 0 || nread >= str.max_size())
+ is.setstate(std::ios_base::failbit);
+
+ return is;
+}
 
 template <typename E, class T, class A, class S>
 std::basic_istream<typename flex_string<E, T, A, S>::value_type,
@@ -2462,7 +2590,10 @@
 getline(
     std::basic_istream<typename flex_string<E, T, A, S>::value_type,
         typename flex_string<E, T, A, S>::traits_type>& is,
- flex_string<E, T, A, S>& str);
+ flex_string<E, T, A, S>& str)
+{
+ return getline(is, str, is.widen('\n'));
+}
 
 template <typename E1, class T, class A, class S>
 const typename flex_string<E1, T, A, S>::size_type

Modified: branches/release/boost/wave/util/unput_queue_iterator.hpp
==============================================================================
--- branches/release/boost/wave/util/unput_queue_iterator.hpp (original)
+++ branches/release/boost/wave/util/unput_queue_iterator.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -283,13 +283,13 @@
         static return_type
         generate(iterator_type &it)
         {
- return return_t(it.base(), last);
+ return return_type(it.base(), last);
         }
 
         static return_type
         generate(ContainerT &queue, iterator_type &it)
         {
- return return_t(it.base(), queue);
+ return return_type(it.base(), queue);
         }
     };
     

Modified: branches/release/boost/wave/wave_config.hpp
==============================================================================
--- branches/release/boost/wave/wave_config.hpp (original)
+++ branches/release/boost/wave/wave_config.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -158,20 +158,45 @@
 #endif
 
 ///////////////////////////////////////////////////////////////////////////////
+// Configure Wave thread support, Boost.Spirit and Boost.Pool are configured
+// based on these settings automatically
+//
+// If BOOST_WAVE_SUPPORT_THREADING is not defined, Wave will use the global
+// Boost build settings (BOOST_HAS_THREADS), if it is defined its value
+// defines, whether threading will be enabled or not (should be set to '0'
+// or '1').
+#if !defined(BOOST_WAVE_SUPPORT_THREADING)
+#if defined(BOOST_HAS_THREADS)
+#define BOOST_WAVE_SUPPORT_THREADING 1
+#else
+#define BOOST_WAVE_SUPPORT_THREADING 0
+#endif
+#endif
+
+#if BOOST_WAVE_SUPPORT_THREADING != 0
+#define BOOST_SPIRIT_THREADSAFE 1
+#define PHOENIX_THREADSAFE 1
+#else
+// disable thread support in Boost.Pool
+#define BOOST_NO_MT 1
+#endif
+
+///////////////////////////////////////////////////////////////////////////////
 // Define the string type to be used to store the token values and the file
 // names inside a file_position template class
 //
 #if !defined(BOOST_WAVE_STRINGTYPE)
 
+// VC7 isn't able to compile the flex_string class, fall back to std::string
+// CW up to 8.3 chokes as well *sigh*
+// Tru64/CXX has linker problems when using flex_string
 #if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || \
     BOOST_WORKAROUND(__MWERKS__, < 0x3200) || \
     (defined(__DECCXX) && defined(__alpha)) || \
     defined(BOOST_WAVE_STRINGTYPE_USE_STDSTRING)
     
-// VC7 isn't able to compile the flex_string class, fall back to std::string
-// CW up to 8.3 chokes as well *sigh*
-// Tru64/CXX has linker problems when using flex_string
 #define BOOST_WAVE_STRINGTYPE std::string
+
 #if !defined(BOOST_WAVE_STRINGTYPE_USE_STDSTRING)
 #define BOOST_WAVE_STRINGTYPE_USE_STDSTRING 1
 #endif
@@ -332,7 +357,7 @@
 // Decide, whether to support long long integers in the preprocessor.
 //
 // The C++ standard requires the preprocessor to use one of the following
-// types for integer literals: long or unsigned long depending on a optional
+// types for integer literals: long or unsigned long depending on an optional
 // suffix ('u', 'l', 'ul', or 'lu')
 //
 // Sometimes it's required to preprocess integer literals bigger than that
@@ -366,30 +391,6 @@
 }}
 
 ///////////////////////////////////////////////////////////////////////////////
-// Configure Wave thread support, Boost.Spirit and Boost.Pool are configured
-// based on these settings automatically
-//
-// If BOOST_WAVE_SUPPORT_THREADING is not defined, Wave will use the global
-// Boost build settings (BOOST_HAS_THREADS), if it is defined its value
-// defines, whether threading will be enabled or not (should be set to '0'
-// or '1').
-#if !defined(BOOST_WAVE_SUPPORT_THREADING)
-#if defined(BOOST_HAS_THREADS)
-#define BOOST_WAVE_SUPPORT_THREADING 1
-#else
-#define BOOST_WAVE_SUPPORT_THREADING 0
-#endif
-#endif
-
-#if BOOST_WAVE_SUPPORT_THREADING != 0
-#define BOOST_SPIRIT_THREADSAFE 1
-#define PHOENIX_THREADSAFE 1
-#else
-// disable thread support in Boost.Pool
-#define BOOST_NO_MT 1
-#endif
-
-///////////////////////////////////////////////////////////////////////////////
 // Wave needs at least 4 parameters for phoenix actors
 #if !defined(PHOENIX_LIMIT)
 #define PHOENIX_LIMIT 6

Modified: branches/release/boost/wave/wave_version.hpp
==============================================================================
--- branches/release/boost/wave/wave_version.hpp (original)
+++ branches/release/boost/wave/wave_version.hpp 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -16,11 +16,11 @@
 // BOOST_WAVE_VERSION & 0x0000FF is the sub-minor version
 // BOOST_WAVE_VERSION & 0x00FF00 is the minor version
 // BOOST_WAVE_VERSION & 0xFF0000 is the major version
-#define BOOST_WAVE_VERSION 0x020000
+#define BOOST_WAVE_VERSION 0x020002
 
 // The following defines contain the same information as above
 #define BOOST_WAVE_VERSION_MAJOR 2
 #define BOOST_WAVE_VERSION_MINOR 0
-#define BOOST_WAVE_VERSION_SUBMINOR 0
+#define BOOST_WAVE_VERSION_SUBMINOR 2
 
 #endif // !defined(WAVE_VERSION_H_9D79ABDB_AC54_4C0A_89B1_F70A2DCFE21E_INCLUDED)

Modified: branches/release/libs/wave/ChangeLog
==============================================================================
--- branches/release/libs/wave/ChangeLog (original)
+++ branches/release/libs/wave/ChangeLog 2009-08-08 18:08:00 EDT (Sat, 08 Aug 2009)
@@ -22,10 +22,18 @@
 
 CHANGELOG
 
+Boost V1.40.0
+- V2.0.2
+- Fixed a long standing race condition inhibiting to use Wave in multi threaded
+ environments.
+- Incorporated the changes from latest version of the flex_string class (#2946).
+- Fixed another race condition triggering problems using Wave in multi-threaded
+ environments.
+
 Boost V1.39.0
 - V2.0.1
 - Fixed Wave to compile with BOOST_FILESYSTEM_NO_DEPRECATED defined (i.e. the
- library doesn't use the depracated filesystem interface anymore).
+ library doesn't use the deprecated filesystem interface anymore).
 
 Boost V1.37.0
 - Updated examples to reflect the recent changes in the used multi_pass


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk