bool reload_buffer ()
        {
            const std::size_t lowest_ = lowest ();
            std::size_t read_ = 0;

            if (lowest_ == 0)
            {
                // Resize buffer
                const std::size_t old_size_ = _buffer.size ();
                const std::size_t new_size_ = old_size_ + _increment;

                _buffer.resize (new_size_);
                _stream.read (&_buffer.front () + old_size_, _increment);
                read_ = static_cast<std::size_t>(_stream.gcount ());

                if (read_)
                {
                    read_ += old_size_;
                    _len = read_;
                }
            }
            else
            {
                // Some systems have memcpy in namespace std
                using namespace std;
                const size_t start_ = _buffer.size () - lowest_;
                const size_t len_ = _buffer.size () - start_;

                memcpy (&_buffer.front (), &_buffer[lowest_], start_ *
                    sizeof (char_type));
                _stream.read (&_buffer.front () + start_, len_);
                read_ = static_cast<size_t>(_stream.gcount ());
                subtract (lowest_);

                if (read_)
                {
                    read_ += start_;
                    _len = read_;
                }
                else
                {
                    _len = highest ();
                }
            }

            return read_ != 0;
        }
 shared (istream &stream_, const std::size_t buff_size_,
     const std::size_t increment_) :
     _ref_count (0),
     _increment (increment_),
     _stream (stream_)
 {
     _buffer.resize (buff_size_);
     _stream.read (&_buffer.front (), _buffer.size ());
     _len = static_cast<std::size_t>(_stream.gcount ());
 }