}
basic_filebuf& operator=(basic_filebuf&& other) noexcept
{
+ close();
swap(other);
return *this;
}
swap(owns_buffer_, rhs.owns_buffer_);
swap(last_char_[0], rhs.last_char_[0]);
swap(mode_, rhs.mode_);
+
// Fixup last_char references
- if(epptr() == rhs.last_char_)
- setp(last_char_, last_char_);
- if(egptr() == rhs.last_char_)
- rhs.setg(last_char_, gptr() == rhs.last_char_ ? last_char_ : last_char_ + 1, last_char_ + 1);
- if(rhs.epptr() == last_char_)
- setp(rhs.last_char_, rhs.last_char_);
- if(rhs.egptr() == rhs.last_char_)
+ if(pbase() == rhs.last_char_)
+ setp(last_char_, (pptr() == epptr()) ? last_char_ : last_char_ + 1);
+ if(eback() == rhs.last_char_)
+ setg(last_char_, (gptr() == rhs.last_char_) ? last_char_ : last_char_ + 1, last_char_ + 1);
+
+ if(rhs.pbase() == last_char_)
+ rhs.setp(rhs.last_char_, (rhs.pptr() == rhs.epptr()) ? rhs.last_char_ : rhs.last_char_ + 1);
+ if(rhs.eback() == last_char_)
{
rhs.setg(rhs.last_char_,
- rhs.gptr() == last_char_ ? rhs.last_char_ : rhs.last_char_ + 1,
+ (rhs.gptr() == last_char_) ? rhs.last_char_ : rhs.last_char_ + 1,
rhs.last_char_ + 1);
}
}
buffer_ = NULL;
owns_buffer_ = false;
}
+ setg(0, 0, 0);
+ setp(0, 0);
return res ? this : NULL;
}
///
setg(NULL, NULL, NULL);
setp(NULL, NULL);
if(owns_buffer_)
+ {
delete[] buffer_;
+ owns_buffer_ = false;
+ }
buffer_ = s;
buffer_size_ = (n >= 0) ? static_cast<size_t>(n) : 0;
return this;
int overflow(int c = EOF) override
{
- if(!(mode_ & std::ios_base::out))
+ if(!(mode_ & (std::ios_base::out | std::ios_base::app)))
return EOF;
if(!stop_reading())
if(n > 0)
{
if(std::fwrite(pbase(), 1, n, file_) != n)
- return -1;
+ return EOF;
setp(buffer_, buffer_ + buffer_size_);
if(c != EOF)
{
return EOF;
if(!stop_writing())
return EOF;
- if(buffer_size_ == 0)
+ // In text mode we cannot use a buffer size of more than 1 (i.e. single char only)
+ // This is due to the need to seek back in case of a sync to "put back" unread chars.
+ // However determining the number of chars to seek back is impossible in case there are newlines
+ // as we cannot know if those were converted.
+ if(buffer_size_ == 0 || !(mode_ & std::ios_base::binary))
{
const int c = std::fgetc(file_);
if(c == EOF)
///
using filebuf = basic_filebuf<char>;
+ /// Swap the basic_filebuf instances
+ template<typename CharType, typename Traits>
+ void swap(basic_filebuf<CharType, Traits>& lhs, basic_filebuf<CharType, Traits>& rhs)
+ {
+ lhs.swap(rhs);
+ }
+
#endif // windows
} // namespace nowide