1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- #ifndef BOOST_IOSTREAMS_DETAIL_COUNTED_ARRAY_HPP_INCLUDED
- #define BOOST_IOSTREAMS_DETAIL_COUNTED_ARRAY_HPP_INCLUDED
- #include <algorithm> // min.
- #include <cstddef> // size_t
- #include <string> // char_traits
- #include <boost/iostreams/categories.hpp>
- #include <boost/iostreams/detail/char_traits.hpp>
- #include <boost/iostreams/detail/ios.hpp> // streamsize.
- namespace boost { namespace iostreams { namespace detail {
- template<typename Ch>
- class counted_array_source {
- public:
- typedef Ch char_type;
- typedef source_tag category;
- counted_array_source(const Ch* buf, std::streamsize size)
- : buf_(buf), ptr_(0), end_(size)
- { }
- std::streamsize read(Ch* s, std::streamsize n)
- {
- using namespace std;
- streamsize result = (std::min)(n, end_ - ptr_);
- char_traits<char_type>::copy(
- s,
- buf_ + ptr_,
- static_cast<size_t>(result)
- );
- ptr_ += result;
- return result;
- }
- std::streamsize count() const { return ptr_; }
- private:
- const Ch* buf_;
- std::streamsize ptr_, end_;
- };
- template<typename Ch>
- struct counted_array_sink {
- public:
- typedef Ch char_type;
- typedef sink_tag category;
- counted_array_sink(Ch* buf, std::streamsize size)
- : buf_(buf), ptr_(0), end_(size)
- { }
- std::streamsize write(const Ch* s, std::streamsize n)
- {
- using namespace std;
- std::streamsize result = (std::min)(n, end_ - ptr_);
- char_traits<char_type>::copy(
- buf_ + ptr_,
- s,
- static_cast<size_t>(result)
- );
- ptr_ += result;
- return result;
- }
- std::streamsize count() const { return ptr_; }
- private:
- Ch* buf_;
- std::streamsize ptr_, end_;
- };
- } } }
- #endif
|