Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r82201 - in branches/release/boost/archive: . impl iterators
From: ramey_at_[hidden]
Date: 2012-12-24 13:23:50


Author: ramey
Date: 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
New Revision: 82201
URL: http://svn.boost.org/trac/boost/changeset/82201

Log:
fixed problem with base64 iterators
Properties modified:
   branches/release/boost/archive/ (props changed)
Text files modified:
   branches/release/boost/archive/archive_exception.hpp | 10 +-
   branches/release/boost/archive/impl/basic_text_iprimitive.ipp | 18 ++--
   branches/release/boost/archive/impl/basic_text_oprimitive.ipp | 2
   branches/release/boost/archive/iterators/binary_from_base64.hpp | 2
   branches/release/boost/archive/iterators/istream_iterator.hpp | 24 +++++-
   branches/release/boost/archive/iterators/transform_width.hpp | 138 ++++++++++++++++++++-------------------
   6 files changed, 104 insertions(+), 90 deletions(-)

Modified: branches/release/boost/archive/archive_exception.hpp
==============================================================================
--- branches/release/boost/archive/archive_exception.hpp (original)
+++ branches/release/boost/archive/archive_exception.hpp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -43,6 +43,8 @@
 class BOOST_ARCHIVE_DECL(BOOST_PP_EMPTY()) archive_exception :
     public virtual std::exception
 {
+protected:
+ char m_buffer[128];
 public:
     typedef enum {
         no_exception, // initialized without code
@@ -74,8 +76,6 @@
                             // type has been instantiated in more than one module.
         output_stream_error // error on input stream
     } exception_code;
-protected:
- std::string m_msg;
 public:
     exception_code code;
     archive_exception(
@@ -83,9 +83,11 @@
         const char * e1 = NULL,
         const char * e2 = NULL
     );
- ~archive_exception() throw ();
- virtual const char *what( ) const throw();
+ virtual ~archive_exception() throw();
+ virtual const char *what() const throw();
 protected:
+ unsigned int
+ append(unsigned int l, const char * a);
     archive_exception();
 };
 

Modified: branches/release/boost/archive/impl/basic_text_iprimitive.ipp
==============================================================================
--- branches/release/boost/archive/impl/basic_text_iprimitive.ipp (original)
+++ branches/release/boost/archive/impl/basic_text_iprimitive.ipp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -86,23 +86,21 @@
             ,CharType
>
         binary;
-
- binary ti_begin = binary(
+
+ binary i = binary(
         BOOST_MAKE_PFTO_WRAPPER(
             iterators::istream_iterator<CharType>(is)
         )
     );
-
+
     char * caddr = static_cast<char *>(address);
     
     // take care that we don't increment anymore than necessary
- while(--count > 0){
- *caddr++ = static_cast<char>(*ti_begin);
- ++ti_begin;
+ while(count-- > 0){
+ *caddr++ = static_cast<char>(*i++);
     }
- *caddr++ = static_cast<char>(*ti_begin);
-
- iterators::istream_iterator<CharType> i;
+
+ // skip over any excess input
     for(;;){
         BOOST_DEDUCED_TYPENAME IStream::int_type r;
         r = is.get();
@@ -112,7 +110,7 @@
             break;
     }
 }
-
+
 template<class IStream>
 BOOST_ARCHIVE_OR_WARCHIVE_DECL(BOOST_PP_EMPTY())
 basic_text_iprimitive<IStream>::basic_text_iprimitive(

Modified: branches/release/boost/archive/impl/basic_text_oprimitive.ipp
==============================================================================
--- branches/release/boost/archive/impl/basic_text_oprimitive.ipp (original)
+++ branches/release/boost/archive/impl/basic_text_oprimitive.ipp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -51,7 +51,7 @@
                     8
>
>
- ,72
+ ,76
             ,const char // cwpro8 needs this
>
         base64_text;

Modified: branches/release/boost/archive/iterators/binary_from_base64.hpp
==============================================================================
--- branches/release/boost/archive/iterators/binary_from_base64.hpp (original)
+++ branches/release/boost/archive/iterators/binary_from_base64.hpp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -43,7 +43,7 @@
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,
             -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,
- 52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,
+ 52,53,54,55,56,57,58,59,60,61,-1,-1,-1, 0,-1,-1, // render '=' as 0
             -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13,14,
             15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,
             -1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,

Modified: branches/release/boost/archive/iterators/istream_iterator.hpp
==============================================================================
--- branches/release/boost/archive/iterators/istream_iterator.hpp (original)
+++ branches/release/boost/archive/iterators/istream_iterator.hpp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -49,16 +49,17 @@
> super_t;
     typedef BOOST_DEDUCED_TYPENAME std::basic_istream<Elem> istream_type;
  
- //Access the value referred to
- Elem dereference() const {
- return m_current_value;
- }
-
     bool equal(const this_t & rhs) const {
         // note: only works for comparison against end of stream
         return m_istream == rhs.m_istream;
     }
 
+/*
+ //Access the value referred to
+ Elem dereference() const {
+ return m_current_value;
+ }
+
     void increment(){
         if(NULL != m_istream){
             m_current_value = static_cast<Elem>(m_istream->get());
@@ -67,6 +68,17 @@
             }
         }
     }
+*/
+ //Access the value referred to
+ Elem dereference() const {
+ return m_istream->peek();
+ }
+
+ void increment(){
+ if(NULL != m_istream){
+ m_istream->ignore(1);
+ }
+ }
 
     istream_type *m_istream;
     Elem m_current_value;
@@ -74,7 +86,7 @@
     istream_iterator(istream_type & is) :
         m_istream(& is)
     {
- increment();
+ //increment();
     }
 
     istream_iterator() :

Modified: branches/release/boost/archive/iterators/transform_width.hpp
==============================================================================
--- branches/release/boost/archive/iterators/transform_width.hpp (original)
+++ branches/release/boost/archive/iterators/transform_width.hpp 2012-12-24 13:23:49 EST (Mon, 24 Dec 2012)
@@ -24,8 +24,6 @@
 // character and 8 bit bytes. Lowest common multiple is 24 => 4 6 bit characters
 // or 3 8 bit characters
 
-#include <algorithm>
-
 #include <boost/config.hpp> // for BOOST_DEDUCED_TYPENAME & PTFO
 #include <boost/serialization/pfto.hpp>
 
@@ -66,101 +64,105 @@
     typedef transform_width<Base, BitsOut, BitsIn, CharType> this_t;
     typedef BOOST_DEDUCED_TYPENAME iterator_value<Base>::type base_value_type;
 
- CharType fill();
+ void fill();
 
- CharType dereference_impl(){
- if(! m_full){
- m_current_value = fill();
- m_full = true;
- }
- return m_current_value;
+ CharType dereference() const {
+ if(!m_buffer_out_full)
+ const_cast<this_t *>(this)->fill();
+ return m_buffer_out;
     }
 
- CharType dereference() const {
- return const_cast<this_t *>(this)->dereference_impl();
+ bool equal_impl(const this_t & rhs){
+ if(BitsIn < BitsOut) // discard any left over bits
+ return this->base_reference() == rhs.base_reference();
+ else{
+ // BitsIn > BitsOut // zero fill
+ if(this->base_reference() == rhs.base_reference()){
+ m_end_of_sequence = true;
+ return 0 == m_remaining_bits;
+ }
+ return false;
+ }
     }
 
- // test for iterator equality
+ // standard iterator interface
     bool equal(const this_t & rhs) const {
- return
- this->base_reference() == rhs.base_reference();
- ;
+ return const_cast<this_t *>(this)->equal_impl(rhs);
     }
 
     void increment(){
- m_displacement += BitsOut;
-
- while(m_displacement >= BitsIn){
- m_displacement -= BitsIn;
- if(0 == m_displacement)
- m_bufferfull = false;
- if(! m_bufferfull){
- // note: suspect that this is not invoked for borland
- ++(this->base_reference());
- }
- }
- m_full = false;
+ m_buffer_out_full = false;
     }
 
- CharType m_current_value;
- // number of bits left in current input character buffer
- unsigned int m_displacement;
- base_value_type m_buffer;
- // flag to current output character is ready - just used to save time
- bool m_full;
- // flag to indicate that m_buffer has data
- bool m_bufferfull;
+ bool m_buffer_out_full;
+ CharType m_buffer_out;
+
+ // last read element from input
+ base_value_type m_buffer_in;
+
+ // number of bits to left in the input buffer.
+ unsigned int m_remaining_bits;
+
+ // flag to indicate we've reached end of data.
+ bool m_end_of_sequence;
 
 public:
     // make composible buy using templated constructor
     template<class T>
     transform_width(BOOST_PFTO_WRAPPER(T) start) :
         super_t(Base(BOOST_MAKE_PFTO_WRAPPER(static_cast< T >(start)))),
- m_displacement(0),
- m_full(false),
- m_bufferfull(false)
+ m_buffer_out_full(false),
+ m_remaining_bits(0),
+ m_end_of_sequence(false)
     {}
     // intel 7.1 doesn't like default copy constructor
     transform_width(const transform_width & rhs) :
         super_t(rhs.base_reference()),
- m_current_value(rhs.m_current_value),
- m_displacement(rhs.m_displacement),
- m_buffer(rhs.m_buffer),
- m_full(rhs.m_full),
- m_bufferfull(rhs.m_bufferfull)
+ m_buffer_out_full(rhs.m_buffer_out_full),
+ m_remaining_bits(rhs.m_remaining_bits),
+ m_buffer_in(rhs.m_buffer_in),
+ m_end_of_sequence(false)
     {}
 };
 
-template<class Base, int BitsOut, int BitsIn, class CharType>
-CharType transform_width<Base, BitsOut, BitsIn, CharType>::fill(){
- CharType retval = 0;
+template<
+ class Base,
+ int BitsOut,
+ int BitsIn,
+ class CharType
+>
+void transform_width<Base, BitsOut, BitsIn, CharType>::fill() {
     unsigned int missing_bits = BitsOut;
- for(;;){
- unsigned int bcount;
- if(! m_bufferfull){
- m_buffer = * this->base_reference();
- m_bufferfull = true;
- bcount = BitsIn;
+ m_buffer_out = 0;
+ do{
+ if(0 == m_remaining_bits){
+ if(m_end_of_sequence){
+ m_buffer_in = 0;
+ m_remaining_bits = missing_bits;
+ }
+ else{
+ m_buffer_in = * this->base_reference()++;
+ m_remaining_bits = BitsIn;
+ }
         }
- else
- bcount = BitsIn - m_displacement;
- unsigned int i = (std::min)(bcount, missing_bits);
+
+ // append these bits to the next output
+ // up to the size of the output
+ unsigned int i = std::min(missing_bits, m_remaining_bits);
         // shift interesting bits to least significant position
- unsigned int j = m_buffer >> (bcount - i);
- // strip off uninteresting bits
- // (note presumption of two's complement arithmetic)
- j &= ~(-(1 << i));
+ base_value_type j = m_buffer_in >> (m_remaining_bits - i);
+ // and mask off the un interesting higher bits
+ // note presumption of twos complement notation
+ j &= (1 << i) - 1;
         // append then interesting bits to the output value
- retval <<= i;
- retval |= j;
+ m_buffer_out <<= i;
+ m_buffer_out |= j;
+
+ // and update counters
         missing_bits -= i;
- if(0 == missing_bits)
- break;
- // note: suspect that this is not invoked for borland 5.51
- ++(this->base_reference());
- m_bufferfull = false;
- }
- return retval;
+ m_remaining_bits -= i;
+ }while(0 < missing_bits);
+ m_buffer_out_full = true;
 }
 
 } // namespace iterators


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