+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains category and mode tags for classifying filters, devices and
-// standard stream and stream buffers types.
-
-#ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED
-#define BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-namespace boost { namespace iostreams {
-
-//------------------Tags for dispatch according to i/o mode-------------------//
-
-struct any_tag { };
-namespace detail { struct two_sequence : virtual any_tag { }; }
-namespace detail { struct random_access : virtual any_tag { }; }
-namespace detail { struct one_head : virtual any_tag { }; }
-namespace detail { struct two_head : virtual any_tag { }; }
-struct input : virtual any_tag { };
-struct output : virtual any_tag { };
-struct bidirectional : virtual input, virtual output, detail::two_sequence { };
-struct dual_use : virtual input, virtual output { }; // Pseudo-mode.
-struct input_seekable : virtual input, virtual detail::random_access { };
-struct output_seekable : virtual output, virtual detail::random_access { };
-struct seekable
- : virtual input_seekable,
- virtual output_seekable,
- detail::one_head
- { };
-struct dual_seekable
- : virtual input_seekable,
- virtual output_seekable,
- detail::two_head
- { };
-struct bidirectional_seekable
- : input_seekable, output_seekable,
- bidirectional, detail::two_head
- { };
-
-//------------------Tags for use as i/o categories----------------------------//
-
-struct device_tag : virtual any_tag { };
-struct filter_tag : virtual any_tag { };
-
- //
- // Tags for optional behavior.
- //
-
-struct peekable_tag : virtual any_tag { }; // Devices.
-struct closable_tag : virtual any_tag { };
-struct flushable_tag : virtual any_tag { };
-struct localizable_tag : virtual any_tag { };
-struct optimally_buffered_tag : virtual any_tag { };
-struct direct_tag : virtual any_tag { }; // Devices.
-struct multichar_tag : virtual any_tag { }; // Filters.
-
-struct source_tag : device_tag, input { };
-struct sink_tag : device_tag, output { };
-struct bidirectional_device_tag : device_tag, bidirectional { };
-struct seekable_device_tag : virtual device_tag, seekable { };
-
-struct input_filter_tag : filter_tag, input { };
-struct output_filter_tag : filter_tag, output { };
-struct bidirectional_filter_tag : filter_tag, bidirectional { };
-struct seekable_filter_tag : filter_tag, seekable { };
-struct dual_use_filter_tag : filter_tag, dual_use { };
-
-struct multichar_input_filter_tag
- : multichar_tag,
- input_filter_tag
- { };
-struct multichar_output_filter_tag
- : multichar_tag,
- output_filter_tag
- { };
-struct multichar_bidirectional_filter_tag
- : multichar_tag,
- bidirectional_filter_tag
- { };
-struct multichar_seekable_filter_tag
- : multichar_tag,
- seekable_filter_tag
- { };
-struct multichar_dual_use_filter_tag
- : filter_tag,
- dual_use
- { };
-
- //
- // Tags for standard streams and streambufs.
- //
-
-struct std_io_tag : virtual localizable_tag { };
-struct istream_tag
- : virtual input_seekable,
- virtual device_tag,
- virtual peekable_tag,
- virtual std_io_tag
- { };
-struct ostream_tag
- : virtual output_seekable,
- virtual device_tag,
- virtual peekable_tag,
- virtual std_io_tag
- { };
-struct iostream_tag
- : seekable_device_tag,
- istream_tag,
- ostream_tag
- { };
-struct streambuf_tag
- : seekable_device_tag,
- peekable_tag,
- std_io_tag
- { };
-struct stringstream_tag
- : dual_seekable,
- device_tag,
- std_io_tag
- { };
-struct stringbuf_tag
- : dual_seekable,
- device_tag,
- std_io_tag
- { };
-
-namespace detail {
-
-struct linked_tag : streambuf_tag { };
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_CATEGORIES_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CHAIN_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CHAIN_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <algorithm> // for_each.
-#include <cassert>
-#include <exception>
-#include <functional> // unary_function.
-#include <iterator> // advance.
-#include <list>
-#include <memory> // allocator, auto_ptr.
-#include <typeinfo>
-#include <stdexcept> // logic_error, out_of_range.
-#include <boost/checked_delete.hpp>
-#include <boost/config.hpp> // BOOST_MSVC, template friends,
-#include <boost/detail/workaround.hpp> // BOOST_NESTED_TEMPLATE
-#include <boost/iostreams/constants.hpp>
-#include <boost/iostreams/detail/access_control.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/push.hpp>
-#include <boost/iostreams/detail/streambuf.hpp> // pubsync.
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/device/null.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/iostreams/traits.hpp> // is_filter.
-#include <boost/iostreams/stream_buffer.hpp>
-#include <boost/next_prior.hpp>
-#include <boost/shared_ptr.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type.hpp>
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1310)
-# include <boost/mpl/int.hpp>
-#endif
-
-// Sometimes type_info objects must be compared by name. Borrowed from
-// Boost.Python and Boost.Function.
-#if (defined(__GNUC__) && __GNUC__ >= 3) || \
- defined(_AIX) || \
- (defined(__sgi) && defined(__host_mips)) || \
- (defined(linux) && defined(__INTEL_COMPILER) && defined(__ICC)) \
- /**/
-# include <cstring>
-# define BOOST_IOSTREAMS_COMPARE_TYPE_ID(X,Y) \
- (std::strcmp((X).name(),(Y).name()) == 0)
-#else
-# define BOOST_IOSTREAMS_COMPARE_TYPE_ID(X,Y) ((X)==(Y))
-#endif
-
-// Deprecated
-#define BOOST_IOSTREAMS_COMPONENT_TYPE(chain, index) \
- chain.component_type( index ) \
- /**/
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
-# define BOOST_IOSTREAMS_COMPONENT(chain, index, target) \
- chain.component< target >( index ) \
- /**/
-#else
-# define BOOST_IOSTREAMS_COMPONENT(chain, index, target) \
- chain.component( index, ::boost::type< target >() ) \
- /**/
-#endif
-
-namespace boost { namespace iostreams {
-
-//--------------Definition of chain and wchain--------------------------------//
-
-namespace detail {
-
-template<typename Chain> class chain_client;
-
-//
-// Concept name: Chain.
-// Description: Represents a chain of stream buffers which provides access
-// to the first buffer in the chain and send notifications when the
-// streambufs are added to or removed from chain.
-// Refines: Closable device with mode equal to typename Chain::mode.
-// Models: chain, converting_chain.
-// Example:
-//
-// class chain {
-// public:
-// typedef xxx chain_type;
-// typedef xxx client_type;
-// typedef xxx mode;
-// bool is_complete() const; // Ready for i/o.
-// template<typename T>
-// void push( const T& t, // Adds a stream buffer to
-// streamsize, // chain, based on t, with
-// streamsize ); // given buffer and putback
-// // buffer sizes. Pass -1 to
-// // request default size.
-// protected:
-// void register_client(client_type* client); // Associate client.
-// void notify(); // Notify client.
-// };
-//
-
-//
-// Description: Represents a chain of filters with an optional device at the
-// end.
-// Template parameters:
-// Self - A class deriving from the current instantiation of this template.
-// This is an example of the Curiously Recurring Template Pattern.
-// Ch - The character type.
-// Tr - The character traits type.
-// Alloc - The allocator type.
-// Mode - A mode tag.
-//
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-class chain_base {
-public:
- typedef Ch char_type;
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
- typedef Alloc allocator_type;
- typedef Mode mode;
- struct category
- : Mode,
- device_tag
- { };
- typedef chain_client<Self> client_type;
- friend class chain_client<Self>;
-private:
- typedef linked_streambuf<Ch> streambuf_type;
- typedef std::list<streambuf_type*> list_type;
- typedef chain_base<Self, Ch, Tr, Alloc, Mode> my_type;
-protected:
- chain_base() : pimpl_(new chain_impl) { }
- chain_base(const chain_base& rhs): pimpl_(rhs.pimpl_) { }
-public:
-
- //----------Buffer sizing-------------------------------------------------//
-
- // Sets the size of the buffer created for the devices to be added to this
- // chain. Does not affect the size of the buffer for devices already
- // added.
- void set_device_buffer_size(int n) { pimpl_->device_buffer_size_ = n; }
-
- // Sets the size of the buffer created for the filters to be added
- // to this chain. Does not affect the size of the buffer for filters already
- // added.
- void set_filter_buffer_size(int n) { pimpl_->filter_buffer_size_ = n; }
-
- // Sets the size of the putback buffer for filters and devices to be added
- // to this chain. Does not affect the size of the buffer for filters or
- // devices already added.
- void set_pback_size(int n) { pimpl_->pback_size_ = n; }
-
- //----------Device interface----------------------------------------------//
-
- std::streamsize read(char_type* s, std::streamsize n);
- std::streamsize write(const char_type* s, std::streamsize n);
- std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
-
- //----------Direct component access---------------------------------------//
-
- const std::type_info& component_type(int n) const
- {
- if (static_cast<size_type>(n) >= size())
- throw std::out_of_range("bad chain offset");
- return (*boost::next(list().begin(), n))->component_type();
- }
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
- // Deprecated.
- template<int N>
- const std::type_info& component_type() const { return component_type(N); }
-
- template<typename T>
- T* component(int n) const { return component(n, boost::type<T>()); }
-
- // Deprecated.
- template<int N, typename T>
- T* component() const { return component<T>(N); }
-#endif
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
- private:
-#endif
- template<typename T>
- T* component(int n, boost::type<T>) const
- {
- if (static_cast<size_type>(n) >= size())
- throw std::out_of_range("bad chain offset");
- streambuf_type* link = *boost::next(list().begin(), n);
- if (BOOST_IOSTREAMS_COMPARE_TYPE_ID(link->component_type(), typeid(T)))
- return static_cast<T*>(link->component_impl());
- else
- return 0;
- }
-public:
-
- //----------Container-like interface--------------------------------------//
-
- typedef typename list_type::size_type size_type;
- streambuf_type& front() { return *list().front(); }
- BOOST_IOSTREAMS_DEFINE_PUSH(push, mode, char_type, push_impl)
- void pop();
- bool empty() const { return list().empty(); }
- size_type size() const { return list().size(); }
- void reset();
-
- //----------Additional i/o functions--------------------------------------//
-
- // Returns true if this chain is non-empty and its final link
- // is a source or sink, i.e., if it is ready to perform i/o.
- bool is_complete() const;
- bool auto_close() const;
- void set_auto_close(bool close);
- bool sync() { return front().BOOST_IOSTREAMS_PUBSYNC() != -1; }
- bool strict_sync();
-private:
- template<typename T>
- void push_impl(const T& t, int buffer_size = -1, int pback_size = -1)
- {
- typedef typename iostreams::category_of<T>::type category;
- typedef typename unwrap_ios<T>::type policy_type;
- typedef stream_buffer<
- policy_type,
- BOOST_IOSTREAMS_CHAR_TRAITS(char_type),
- Alloc, Mode
- > facade_type;
- BOOST_STATIC_ASSERT((is_convertible<category, Mode>::value));
- if (is_complete())
- throw std::logic_error("chain complete");
- streambuf_type* prev = !empty() ? list().back() : 0;
- buffer_size =
- buffer_size != -1 ?
- buffer_size :
- iostreams::optimal_buffer_size(t);
- pback_size =
- pback_size != -1 ?
- pback_size :
- pimpl_->pback_size_;
- std::auto_ptr<facade_type>
- buf(new facade_type(t, buffer_size, pback_size));
- list().push_back(buf.get());
- buf.release();
- if (is_device<policy_type>::value)
- pimpl_->flags_ |= f_complete | f_open;
- if (prev) prev->set_next(list().back());
- notify();
- }
-
- list_type& list() { return pimpl_->links_; }
- const list_type& list() const { return pimpl_->links_; }
- void register_client(client_type* client) { pimpl_->client_ = client; }
- void notify() { if (pimpl_->client_) pimpl_->client_->notify(); }
-
- //----------Nested classes------------------------------------------------//
-
- static void close(streambuf_type* b, BOOST_IOS::openmode m)
- {
- if (m & BOOST_IOS::out)
- b->BOOST_IOSTREAMS_PUBSYNC();
- b->close(m);
- }
-
- static void set_next(streambuf_type* b, streambuf_type* next)
- { b->set_next(next); }
-
- static void set_auto_close(streambuf_type* b, bool close)
- { b->set_auto_close(close); }
-
- struct closer : public std::unary_function<streambuf_type*, void> {
- closer(BOOST_IOS::openmode m) : mode_(m) { }
- void operator() (streambuf_type* b)
- {
- close(b, mode_);
- }
- BOOST_IOS::openmode mode_;
- };
- friend struct closer;
-
- enum flags {
- f_complete = 1,
- f_open = 2,
- f_auto_close = 4
- };
-
- struct chain_impl {
- chain_impl()
- : client_(0), device_buffer_size_(default_device_buffer_size),
- filter_buffer_size_(default_filter_buffer_size),
- pback_size_(default_pback_buffer_size),
- flags_(f_auto_close)
- { }
- ~chain_impl() { try { close(); reset(); } catch (std::exception&) { } }
- void close()
- {
- if ((flags_ & f_open) != 0) {
- stream_buffer< basic_null_device<Ch, Mode> > null;
- if ((flags_ & f_complete) == 0) {
- null.open(basic_null_device<Ch, Mode>());
- set_next(links_.back(), &null);
- }
- links_.front()->BOOST_IOSTREAMS_PUBSYNC();
- if (is_convertible<Mode, input>::value)
- std::for_each( links_.rbegin(), links_.rend(),
- closer(BOOST_IOS::in) );
- if (is_convertible<Mode, output>::value)
- std::for_each( links_.begin(), links_.end(),
- closer(BOOST_IOS::out) );
- flags_ &= ~f_open;
- }
- }
- void reset()
- {
- typedef typename list_type::iterator iterator;
- for ( iterator first = links_.begin(),
- last = links_.end();
- first != last;
- ++first )
- {
- if ( (flags_ & f_complete) == 0 ||
- (flags_ & f_auto_close) == 0 )
- {
- set_auto_close(*first, false);
- }
- streambuf_type* buf = 0;
- std::swap(buf, *first);
- delete buf;
- }
- links_.clear();
- flags_ &= ~f_complete;
- flags_ &= ~f_open;
- }
- list_type links_;
- client_type* client_;
- int device_buffer_size_,
- filter_buffer_size_,
- pback_size_;
- int flags_;
- };
- friend struct chain_impl;
-
- //----------Member data---------------------------------------------------//
-
-private:
- shared_ptr<chain_impl> pimpl_;
-};
-
-} // End namespace detail.
-
-//
-// Macro: BOOST_IOSTREAMS_DECL_CHAIN(name, category)
-// Description: Defines a template derived from chain_base appropriate for a
-// particular i/o category. The template has the following parameters:
-// Ch - The character type.
-// Tr - The character traits type.
-// Alloc - The allocator type.
-// Macro parameters:
-// name_ - The name of the template to be defined.
-// category_ - The i/o category of the template to be defined.
-//
-#define BOOST_IOSTREAMS_DECL_CHAIN(name_, default_char_) \
- template< typename Mode, typename Ch = default_char_, \
- typename Tr = BOOST_IOSTREAMS_CHAR_TRAITS(Ch), \
- typename Alloc = std::allocator<Ch> > \
- class name_ : public boost::iostreams::detail::chain_base< \
- name_<Mode, Ch, Tr, Alloc>, \
- Ch, Tr, Alloc, Mode \
- > \
- { \
- public: \
- struct category : device_tag, Mode { }; \
- typedef Mode mode; \
- private: \
- typedef boost::iostreams::detail::chain_base< \
- name_<Mode, Ch, Tr, Alloc>, \
- Ch, Tr, Alloc, Mode \
- > base_type; \
- public: \
- typedef Ch char_type; \
- typedef Tr traits_type; \
- typedef typename traits_type::int_type int_type; \
- typedef typename traits_type::off_type off_type; \
- name_() { } \
- name_(const name_& rhs) { *this = rhs; } \
- name_& operator=(const name_& rhs) \
- { base_type::operator=(rhs); return *this; } \
- }; \
- /**/
-BOOST_IOSTREAMS_DECL_CHAIN(chain, char)
-BOOST_IOSTREAMS_DECL_CHAIN(wchain, wchar_t)
-#undef BOOST_IOSTREAMS_DECL_CHAIN
-
-//--------------Definition of chain_client------------------------------------//
-
-namespace detail {
-
-//
-// Template name: chain_client
-// Description: Class whose instances provide access to an underlying chain
-// using an interface similar to the chains.
-// Subclasses: the various stream and stream buffer templates.
-//
-template<typename Chain>
-class chain_client {
-public:
- typedef Chain chain_type;
- typedef typename chain_type::char_type char_type;
- typedef typename chain_type::traits_type traits_type;
- typedef typename chain_type::size_type size_type;
- typedef typename chain_type::mode mode;
-
- chain_client(chain_type* chn = 0) : chain_(chn ) { }
- chain_client(chain_client* client) : chain_(client->chain_) { }
- virtual ~chain_client() { }
-
- const std::type_info& component_type(int n) const
- { return chain_->component_type(n); }
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
- // Deprecated.
- template<int N>
- const std::type_info& component_type() const
- { return chain_->BOOST_NESTED_TEMPLATE component_type<N>(); }
-
- template<typename T>
- T* component(int n) const
- { return chain_->BOOST_NESTED_TEMPLATE component<T>(n); }
-
- // Deprecated.
- template<int N, typename T>
- T* component() const
- { return chain_->BOOST_NESTED_TEMPLATE component<N, T>(); }
-#else
- template<typename T>
- T* component(int n, boost::type<T> t) const
- { return chain_->component(n, t); }
-#endif
-
- bool is_complete() const { return chain_->is_complete(); }
- bool auto_close() const { return chain_->auto_close(); }
- void set_auto_close(bool close) { chain_->set_auto_close(close); }
- bool strict_sync() { return chain_->strict_sync(); }
- void set_device_buffer_size(std::streamsize n)
- { chain_->set_device_buffer_size(n); }
- void set_filter_buffer_size(std::streamsize n)
- { chain_->set_filter_buffer_size(n); }
- void set_pback_size(std::streamsize n) { chain_->set_pback_size(n); }
- BOOST_IOSTREAMS_DEFINE_PUSH(push, mode, char_type, push_impl)
- void pop() { chain_->pop(); }
- bool empty() const { return chain_->empty(); }
- size_type size() { return chain_->size(); }
- void reset() { chain_->reset(); }
-
- // Returns a copy of the underlying chain.
- chain_type filters() { return *chain_; }
- chain_type filters() const { return *chain_; }
-protected:
- template<typename T>
- void push_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS())
- { chain_->push(t BOOST_IOSTREAMS_PUSH_ARGS()); }
- chain_type& ref() { return *chain_; }
- void set_chain(chain_type* c)
- { chain_ = c; chain_->register_client(this); }
-#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && \
- (!BOOST_WORKAROUND(__BORLANDC__, < 0x600))
- template<typename S, typename C, typename T, typename A, typename M>
- friend class chain_base;
-#else
- public:
-#endif
- virtual void notify() { }
-private:
- chain_type* chain_;
-};
-
-//--------------Implementation of chain_base----------------------------------//
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-inline std::streamsize chain_base<Self, Ch, Tr, Alloc, Mode>::read
- (char_type* s, std::streamsize n)
-{ return iostreams::read(*list().front(), s, n); }
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-inline std::streamsize chain_base<Self, Ch, Tr, Alloc, Mode>::write
- (const char_type* s, std::streamsize n)
-{ return iostreams::write(*list().front(), s, n); }
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-inline std::streampos chain_base<Self, Ch, Tr, Alloc, Mode>::seek
- (stream_offset off, BOOST_IOS::seekdir way)
-{ return iostreams::seek(*list().front(), off, way); }
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-void chain_base<Self, Ch, Tr, Alloc, Mode>::reset()
-{
- using namespace std;
- pimpl_->close();
- pimpl_->reset();
-}
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-bool chain_base<Self, Ch, Tr, Alloc, Mode>::is_complete() const
-{
- return (pimpl_->flags_ & f_complete) != 0;
-}
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-bool chain_base<Self, Ch, Tr, Alloc, Mode>::auto_close() const
-{
- return (pimpl_->flags_ & f_auto_close) != 0;
-}
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-void chain_base<Self, Ch, Tr, Alloc, Mode>::set_auto_close(bool close)
-{
- pimpl_->flags_ =
- (pimpl_->flags_ & ~f_auto_close) |
- (close ? f_auto_close : 0);
-}
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-bool chain_base<Self, Ch, Tr, Alloc, Mode>::strict_sync()
-{
- typedef typename list_type::iterator iterator;
- bool result = true;
- for ( iterator first = list().begin(),
- last = list().end();
- first != last;
- ++first )
- {
- bool s = (*first)->strict_sync();
- result = result && s;
- }
- return result;
-}
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-void chain_base<Self, Ch, Tr, Alloc, Mode>::pop()
-{
- assert(!empty());
- if (auto_close())
- pimpl_->close();
- streambuf_type* buf = 0;
- std::swap(buf, list().back());
- buf->set_auto_close(false);
- buf->set_next(0);
- delete buf;
- list().pop_back();
- pimpl_->flags_ &= ~f_complete;
- if (auto_close() || list().empty())
- pimpl_->flags_ &= ~f_open;
-}
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHAIN_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_CHAR_TRAITS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_CHAR_TRAITS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>
-#include <cstddef>
-#include <cstdio> // EOF.
-#include <string> // std::char_traits.
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
-# include <cwchar>
-#endif
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std { using ::wint_t; }
-#endif
-
-namespace boost { namespace iostreams {
-
-// Dinkumware that comes with QNX Momentics 6.3.0, 4.0.2, incorrectly defines
-// the EOF and WEOF macros to not std:: qualify the wint_t type (and so does
-// Sun C++ 5.8 + STLport 4). Fix by placing the def in this scope.
-// NOTE: Use BOOST_WORKAROUND?
-#if (defined(__QNX__) && defined(BOOST_DINKUMWARE_STDLIB)) \
- || defined(__SUNPRO_CC)
-using ::std::wint_t;
-#endif
-
-const int WOULD_BLOCK = (int) (EOF - 1);
-
-#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
-const std::wint_t WWOULD_BLOCK = (std::wint_t) (WEOF - 1);
-#endif
-
-template<typename Ch>
-struct char_traits;
-
-template<>
-struct char_traits<char> : BOOST_IOSTREAMS_CHAR_TRAITS(char) {
- static char newline() { return '\n'; }
- static int good() { return '\n'; }
- static int would_block() { return WOULD_BLOCK; }
- static bool is_good(int c) { return c != EOF && c != WOULD_BLOCK; }
- static bool is_eof(int c) { return c == EOF; }
- static bool would_block(int c) { return c == WOULD_BLOCK; }
-};
-
-#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
-template<>
-struct char_traits<wchar_t> : std::char_traits<wchar_t> {
- static wchar_t newline() { return L'\n'; }
- static std::wint_t good() { return L'\n'; }
- static std::wint_t would_block() { return WWOULD_BLOCK; }
- static bool is_good(std::wint_t c) { return c != WEOF && c != WWOULD_BLOCK; }
- static bool is_eof(std::wint_t c) { return c == WEOF; }
- static bool would_block(std::wint_t c) { return c == WWOULD_BLOCK; }
-};
-#endif
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_CHAR_TRAITS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains implementations of get, read, put, write and seek which
-// check a device's mode at runtime instead of compile time.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED
-
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/error.hpp>
-#include <boost/iostreams/get.hpp>
-#include <boost/iostreams/put.hpp>
-#include <boost/iostreams/read.hpp>
-#include <boost/iostreams/seek.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/write.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct read_write_if_impl;
-
-template<typename T>
-struct seek_if_impl;
-
-} // End namespace detail.
-
-template<typename T>
-typename int_type_of<T>::type get_if(T& t)
-{
- typedef typename detail::dispatch<T, input, output>::type tag;
- return detail::read_write_if_impl<tag>::get(t);
-}
-
-template<typename T>
-inline std::streamsize
-read_if(T& t, typename char_type_of<T>::type* s, std::streamsize n)
-{
- typedef typename detail::dispatch<T, input, output>::type tag;
- return detail::read_write_if_impl<tag>::read(t, s, n);
-}
-
-template<typename T>
-bool put_if(T& t, typename char_type_of<T>::type c)
-{
- typedef typename detail::dispatch<T, output, input>::type tag;
- return detail::read_write_if_impl<tag>::put(t, c);
-}
-
-template<typename T>
-inline std::streamsize write_if
- (T& t, const typename char_type_of<T>::type* s, std::streamsize n)
-{
- typedef typename detail::dispatch<T, output, input>::type tag;
- return detail::read_write_if_impl<tag>::write(t, s, n);
-}
-
-template<typename T>
-inline std::streampos
-seek_if( T& t, stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out )
-{
- using namespace detail;
- typedef typename dispatch<T, random_access, any_tag>::type tag;
- return seek_if_impl<tag>::seek(t, off, way, which);
-}
-
-namespace detail {
-
-//------------------Specializations of read_write_if_impl---------------------//
-
-template<>
-struct read_write_if_impl<input> {
- template<typename T>
- static typename int_type_of<T>::type get(T& t)
- { return iostreams::get(t); }
-
- template<typename T>
- static std::streamsize
- read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
- { return iostreams::read(t, s, n); }
-
- template<typename T>
- static bool put(T&, typename char_type_of<T>::type)
- { throw cant_write(); }
-
- template<typename T>
- static std::streamsize
- write(T&, const typename char_type_of<T>::type*, std::streamsize)
- { throw cant_write(); }
-};
-
-template<>
-struct read_write_if_impl<output> {
- template<typename T>
- static typename int_type_of<T>::type get(T&)
- { throw cant_read(); }
-
- template<typename T>
- static std::streamsize
- read(T&, typename char_type_of<T>::type*, std::streamsize)
- { throw cant_read(); }
-
- template<typename T>
- static bool put(T& t, typename char_type_of<T>::type c)
- { return iostreams::put(t, c); }
-
- template<typename T>
- static std::streamsize
- write( T& t, const typename char_type_of<T>::type* s,
- std::streamsize n )
- { return iostreams::write(t, s, n); }
-};
-
-//------------------Specializations of seek_if_impl---------------------------//
-
-template<>
-struct seek_if_impl<random_access> {
- template<typename T>
- static std::streampos
- seek( T& t, stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- { return iostreams::seek(t, off, way, which); }
-};
-
-template<>
-struct seek_if_impl<any_tag> {
- template<typename T>
- static std::streampos
- seek(T&, stream_offset, BOOST_IOS::seekdir, BOOST_IOS::openmode)
- { throw cant_seek(); }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHECKED_OPERATIONS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_CLOSE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_CLOSE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/flush.hpp>
-#include <boost/iostreams/detail/adapter/non_blocking_adapter.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-----------------------------------//
-# include <boost/iostreams/detail/vc6/close.hpp>
-#else // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //--------------------------//
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct close_impl;
-
-} // End namespace detail.
-
-template<typename T>
-void close(T& t, BOOST_IOS::openmode which)
-{ detail::close_impl<T>::close(detail::unwrap(t), which); }
-
-template<typename T, typename Sink>
-void close(T& t, Sink& snk, BOOST_IOS::openmode which)
-{ detail::close_impl<T>::close(detail::unwrap(t), snk, which); }
-
-namespace detail {
-
-//------------------Definition of close_impl----------------------------------//
-
-template<typename T>
-struct close_tag {
- typedef typename category_of<T>::type category;
- typedef typename
- mpl::eval_if<
- is_convertible<category, closable_tag>,
- mpl::if_<
- mpl::or_<
- is_convertible<category, two_sequence>,
- is_convertible<category, dual_use>
- >,
- two_sequence,
- closable_tag
- >,
- mpl::identity<any_tag>
- >::type type;
-};
-
-template<typename T>
-struct close_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- close_impl<BOOST_DEDUCED_TYPENAME close_tag<T>::type>
- >::type
- { };
-
-template<>
-struct close_impl<any_tag> {
- template<typename T>
- static void close(T& t, BOOST_IOS::openmode which)
- {
- if ((which & BOOST_IOS::out) != 0)
- iostreams::flush(t);
- }
-
- template<typename T, typename Sink>
- static void close(T& t, Sink& snk, BOOST_IOS::openmode which)
- {
- if ((which & BOOST_IOS::out) != 0) {
- non_blocking_adapter<Sink> nb(snk);
- iostreams::flush(t, nb);
- }
- }
-};
-
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // Borland.
-template<>
-struct close_impl<closable_tag> {
- template<typename T>
- static void close(T& t, BOOST_IOS::openmode which)
- {
- typedef typename category_of<T>::type category;
- const bool in = is_convertible<category, input>::value &&
- !is_convertible<category, output>::value;
- if (in == ((which & BOOST_IOS::in) != 0))
- t.close();
- }
- template<typename T, typename Sink>
- static void close(T& t, Sink& snk, BOOST_IOS::openmode which)
- {
- typedef typename category_of<T>::type category;
- const bool in = is_convertible<category, input>::value &&
- !is_convertible<category, output>::value;
- if (in == ((which & BOOST_IOS::in) != 0)) {
- non_blocking_adapter<Sink> nb(snk);
- t.close(nb);
- }
- }
-};
-
-template<>
-struct close_impl<two_sequence> {
- template<typename T>
- static void close(T& t, BOOST_IOS::openmode which) { t.close(which); }
- template<typename T, typename Sink>
- static void close(T& t, Sink& snk, BOOST_IOS::openmode which)
- {
- non_blocking_adapter<Sink> nb(snk);
- t.close(nb, which);
- }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-------------------------//
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_CLOSE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/default_arg.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode.
-#include <boost/iostreams/positioning.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-namespace boost { namespace iostreams {
-
-//--------------Definitions of helper templates for device concepts-----------//
-
-template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(char)>
-struct device {
- typedef Ch char_type;
- struct category
- : Mode,
- device_tag,
- closable_tag,
- localizable_tag
- { };
-
- void close()
- {
- using namespace detail;
- BOOST_STATIC_ASSERT((!is_convertible<Mode, two_sequence>::value));
- }
-
- void close(BOOST_IOS::openmode)
- {
- using namespace detail;
- BOOST_STATIC_ASSERT((is_convertible<Mode, two_sequence>::value));
- }
-
- template<typename Locale>
- void imbue(const Locale&) { }
-};
-
-template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
-struct wdevice : device<Mode, Ch> { };
-
-typedef device<input> source;
-typedef wdevice<input> wsource;
-typedef device<output> sink;
-typedef wdevice<output> wsink;
-
-//--------------Definitions of helper templates for simple filter concepts----//
-
-template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(char)>
-struct filter {
- typedef Ch char_type;
- struct category
- : Mode,
- filter_tag,
- closable_tag,
- localizable_tag
- { };
-
- template<typename Device>
- void close(Device&)
- {
- using namespace detail;
- BOOST_STATIC_ASSERT((!is_convertible<Mode, two_sequence>::value));
- BOOST_STATIC_ASSERT((!is_convertible<Mode, dual_use>::value));
- }
-
- template<typename Device>
- void close(Device&, BOOST_IOS::openmode)
- {
- using namespace detail;
- BOOST_STATIC_ASSERT(
- (is_convertible<Mode, two_sequence>::value) ||
- (is_convertible<Mode, dual_use>::value)
- );
- }
-
- template<typename Locale>
- void imbue(const Locale&) { }
-};
-
-template<typename Mode, typename Ch = BOOST_IOSTREAMS_DEFAULT_ARG(wchar_t)>
-struct wfilter : filter<Mode, Ch> { };
-
-typedef filter<input> input_filter;
-typedef wfilter<input> input_wfilter;
-typedef filter<output> output_filter;
-typedef wfilter<output> output_wfilter;
-typedef filter<seekable> seekable_filter;
-typedef wfilter<seekable> seekable_wfilter;
-typedef filter<dual_use> dual_use_filter;
-typedef wfilter<dual_use> dual_use_wfilter;
-
-//------Definitions of helper templates for multi-character filter cncepts----//
-
-template<typename Mode, typename Ch = char>
-struct multichar_filter : filter<Mode, Ch> {
- struct category : filter<Mode, Ch>::category, multichar_tag { };
-};
-
-template<typename Mode, typename Ch = wchar_t>
-struct multichar_wfilter : multichar_filter<Mode, Ch> { };
-
-typedef multichar_filter<input> multichar_input_filter;
-typedef multichar_filter<input> multichar_input_wfilter;
-typedef multichar_filter<output> multichar_output_filter;
-typedef multichar_filter<output> multichar_output_wfilter;
-typedef multichar_filter<dual_use> multichar_dual_use_filter;
-typedef multichar_filter<dual_use> multichar_dual_use_wfilter;
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_CONCEPTS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains constants used by library.
-
-#ifndef BOOST_IOSTREAMS_CONSTANTS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_CONSTANTS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#ifndef BOOST_IOSTREAMS_DEFAULT_DEVICE_BUFFER_SIZE
-# define BOOST_IOSTREAMS_DEFAULT_DEVICE_BUFFER_SIZE 4096
-#endif
-
-#ifndef BOOST_IOSTREAMS_DEFAULT_FILTER_BUFFER_SIZE
-# define BOOST_IOSTREAMS_DEFAULT_FILTER_BUFFER_SIZE 128
-#endif
-
-#ifndef BOOST_IOSTREAMS_DEFAULT_PBACK_BUFFER_SIZE
-# define BOOST_IOSTREAMS_DEFAULT_PBACK_BUFFER_SIZE 4
-#endif
-
-#include <boost/iostreams/detail/ios.hpp> // streamsize.
-
-namespace boost { namespace iostreams {
-
-const std::streamsize default_device_buffer_size =
- BOOST_IOSTREAMS_DEFAULT_DEVICE_BUFFER_SIZE;
-const std::streamsize default_filter_buffer_size =
- BOOST_IOSTREAMS_DEFAULT_FILTER_BUFFER_SIZE;
-const std::streamsize default_pback_buffer_size =
- BOOST_IOSTREAMS_DEFAULT_PBACK_BUFFER_SIZE;
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_CONSTANTS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains the definition of the class template access_control, which
-// allows the type of inheritance from a provided base class to be specified
-// using a template parameter.
-
-
-#ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
-#define BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/select.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-namespace boost { namespace iostreams {
-
-struct protected_ { }; // Represents protected inheritance.
-struct public_ { }; // Represents public inheritance.
-
-
-namespace detail {
-
- // Implements protected inheritance.
- template<typename U>
- struct prot_ : protected U
- {
- prot_() { }
- template<typename V> prot_(V v) : U(v) { }
- };
-
- // Implements public inheritance.
- template<typename U> struct pub_ : public U {
- pub_() { }
- template<typename V> pub_(V v) : U(v) { }
- };
-
-//
-// Used to deduce the base type for the template access_control.
-//
-template<typename T, typename Access>
-struct access_control_base {
- typedef int bad_access_specifier;
- typedef typename
- iostreams::select< // Disambiguation for Tru64
- ::boost::is_same<
- Access, protected_
- >, prot_<T>,
- ::boost::is_same<
- Access, public_
- >, pub_<T>,
- else_, bad_access_specifier
- >::type type;
-};
-
-} // End namespace detail.
-
-//
-// Template name: access_control.
-// Description: Allows the type of inheritance from a provided base class
-// to be specified using an int template parameter.
-// Template parameters:
-// Base - The class from which to inherit (indirectly.)
-// Access - The type of access desired. Must be one of the
-// values access_base::prot or access_base::pub.
-//
-template< typename T, typename Access,
- typename Base = // VC6 workaraound (Compiler Error C2516)
- typename detail::access_control_base<T, Access>::type >
-struct access_control : public Base {
- access_control() { }
- template<typename U> explicit access_control(U u) : Base(u) { }
-};
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_ACCESS_CONTROL_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONCEPT_ADAPTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONCEPT_ADAPTER_HPP_INCLUDED
-
-#include <boost/config.hpp> // SFINAE.
-#include <boost/iostreams/concepts.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/adapter/non_blocking_adapter.hpp>
-#include <boost/iostreams/detail/call_traits.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/error.hpp>
-#include <boost/iostreams/detail/streambuf.hpp> // pubsync.
-#include <boost/iostreams/device/null.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/operations.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/static_assert.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename Category> struct device_wrapper_impl;
-template<typename Category> struct flt_wrapper_impl;
-
-template<typename T>
-class concept_adapter {
-private:
- typedef typename detail::value_type<T>::type value_type;
- typedef typename dispatch<T, input, output>::type input_tag;
- typedef typename dispatch<T, output, input>::type output_tag;
- typedef typename
- mpl::if_<
- is_device<T>,
- device_wrapper_impl<input_tag>,
- flt_wrapper_impl<input_tag>
- >::type input_impl;
- typedef typename
- mpl::if_<
- is_device<T>,
- device_wrapper_impl<output_tag>,
- flt_wrapper_impl<output_tag>
- >::type output_impl;
- typedef typename
- mpl::if_<
- is_device<T>,
- device_wrapper_impl<any_tag>,
- flt_wrapper_impl<any_tag>
- >::type any_impl;
-public:
- typedef typename char_type_of<T>::type char_type;
- typedef typename category_of<T>::type category;
-
- explicit concept_adapter(const reference_wrapper<T>& ref) : t_(ref.get())
- { BOOST_STATIC_ASSERT(is_std_io<T>::value); }
- explicit concept_adapter(const T& t) : t_(t)
- { BOOST_STATIC_ASSERT(!is_std_io<T>::value); }
-
- T& operator*() { return t_; }
- T* operator->() { return &t_; }
-
- std::streamsize read(char_type* s, std::streamsize n)
- { return this->read(s, n, (basic_null_source<char_type>*) 0); }
-
- template<typename Source>
- std::streamsize read(char_type* s, std::streamsize n, Source* src)
- { return input_impl::read(t_, src, s, n); }
-
- std::streamsize write(const char_type* s, std::streamsize n)
- { return this->write(s, n, (basic_null_sink<char_type>*) 0); }
-
- template<typename Sink>
- std::streamsize write(const char_type* s, std::streamsize n, Sink* snk)
- { return output_impl::write(t_, snk, s, n); }
-
- std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- {
- return this->seek( off, way, which,
- (basic_null_device<char_type, seekable>*) 0);
- }
-
- template<typename Device>
- std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which, Device* dev )
- { return any_impl::seek(t_, dev, off, way, which); }
-
- void close(BOOST_IOS::openmode which)
- { this->close(which, (basic_null_device<char_type, seekable>*) 0); }
-
- template<typename Device>
- void close(BOOST_IOS::openmode which, Device* dev)
- { any_impl::close(t_, dev, which); }
-
- bool flush( BOOST_IOSTREAMS_BASIC_STREAMBUF(char_type,
- BOOST_IOSTREAMS_CHAR_TRAITS(char_type))* sb )
- {
- bool result = any_impl::flush(t_, sb);
- if (sb && sb->BOOST_IOSTREAMS_PUBSYNC() == -1)
- result = false;
- return result;
- }
-
- template<typename Locale> // Avoid dependency on <locale>
- void imbue(const Locale& loc) { iostreams::imbue(t_, loc); }
-
- std::streamsize optimal_buffer_size() const
- { return iostreams::optimal_buffer_size(t_); }
-public:
- value_type t_;
-};
-
-//------------------Specializations of device_wrapper_impl--------------------//
-
-template<>
-struct device_wrapper_impl<any_tag> {
- template<typename Device, typename Dummy>
- static std::streampos
- seek( Device& dev, Dummy*, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which )
- {
- typedef typename category_of<Device>::type category;
- return seek(dev, off, way, which, category());
- }
-
- template<typename Device>
- static std::streampos
- seek( Device&, stream_offset, BOOST_IOS::seekdir,
- BOOST_IOS::openmode, any_tag )
- {
- throw cant_seek();
- }
-
- template<typename Device>
- static std::streampos
- seek( Device& dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which,
- random_access )
- {
- return iostreams::seek(dev, off, way, which);
- }
-
- template<typename Device, typename Dummy>
- static void close(Device& dev, Dummy*, BOOST_IOS::openmode which)
- { iostreams::close(dev, which); }
-
- template<typename Device, typename Dummy>
- static bool flush(Device& dev, Dummy*)
- { return iostreams::flush(dev); }
-};
-
-
-template<>
-struct device_wrapper_impl<input> : device_wrapper_impl<any_tag> {
- template<typename Device, typename Dummy>
- static std::streamsize
- read( Device& dev, Dummy*, typename char_type_of<Device>::type* s,
- std::streamsize n )
- { return iostreams::read(dev, s, n); }
-
- template<typename Device, typename Dummy>
- static std::streamsize
- write( Device&, Dummy*, const typename char_type_of<Device>::type*,
- std::streamsize )
- { throw cant_write(); }
-};
-
-template<>
-struct device_wrapper_impl<output> {
- template<typename Device, typename Dummy>
- static std::streamsize
- read(Device&, Dummy*, typename char_type_of<Device>::type*, std::streamsize)
- { throw cant_read(); }
-
- template<typename Device, typename Dummy>
- static std::streamsize
- write( Device& dev, Dummy*, const typename char_type_of<Device>::type* s,
- std::streamsize n )
- { return iostreams::write(dev, s, n); }
-};
-
-//------------------Specializations of flt_wrapper_impl--------------------//
-
-template<>
-struct flt_wrapper_impl<any_tag> {
- template<typename Filter, typename Device>
- static std::streampos
- seek( Filter& f, Device* dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which )
- {
- typedef typename category_of<Filter>::type category;
- return seek(f, dev, off, way, which, category());
- }
-
- template<typename Filter, typename Device>
- static std::streampos
- seek( Filter&, Device*, stream_offset,
- BOOST_IOS::seekdir, BOOST_IOS::openmode, any_tag )
- { throw cant_seek(); }
-
- template<typename Filter, typename Device>
- static std::streampos
- seek( Filter& f, Device* dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which,
- random_access tag )
- {
- typedef typename category_of<Filter>::type category;
- return seek(f, dev, off, way, which, tag, category());
- }
-
- template<typename Filter, typename Device>
- static std::streampos
- seek( Filter& f, Device* dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which,
- random_access, any_tag )
- { return f.seek(*dev, off, way); }
-
- template<typename Filter, typename Device>
- static std::streampos
- seek( Filter& f, Device* dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which,
- random_access, two_sequence )
- { return f.seek(*dev, off, way, which); }
-
- template<typename Filter, typename Device>
- static void close(Filter& f, Device* dev, BOOST_IOS::openmode which)
- { iostreams::close(f, *dev, which); }
-
- template<typename Filter, typename Device>
- static bool flush(Filter& f, Device* dev)
- { return iostreams::flush(f, *dev); }
-};
-
-template<>
-struct flt_wrapper_impl<input> {
- template<typename Filter, typename Source>
- static std::streamsize
- read( Filter& f, Source* src, typename char_type_of<Filter>::type* s,
- std::streamsize n )
- { return iostreams::read(f, *src, s, n); }
-
- template<typename Filter, typename Sink>
- static std::streamsize
- write( Filter&, Sink*, const typename char_type_of<Filter>::type*,
- std::streamsize )
- { throw cant_write(); }
-};
-
-template<>
-struct flt_wrapper_impl<output> {
- template<typename Filter, typename Source>
- static std::streamsize
- read(Filter&, Source*, typename char_type_of<Filter>::type*,std::streamsize)
- { throw cant_read(); }
-
- template<typename Filter, typename Sink>
- static std::streamsize
- write( Filter& f, Sink* snk, const typename char_type_of<Filter>::type* s,
- std::streamsize n )
- { return iostreams::write(f, *snk, s, n); }
-};
-
-//----------------------------------------------------------------------------//
-
-} } } // End namespaces detail, iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONCEPT_ADAPTER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_MODE_ADAPTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_MODE_ADAPTER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-// Contains the definition of the class template mode_adapter, which allows
-// a filter or device to function as if it has a different i/o mode than that
-// deduced by the metafunction mode_of.
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode, seekdir, int types.
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/operations.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename Mode, typename T>
-class mode_adapter {
-private:
- struct empty_base { };
-public:
- typedef typename wrapped_type<T>::type policy_type;
- typedef typename char_type_of<T>::type char_type;
- struct category
- : Mode,
- device_tag,
- mpl::if_<is_filter<T>, filter_tag, device_tag>,
- mpl::if_<is_filter<T>, multichar_tag, empty_base>,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- closable_tag, // VC6 can't see member close()!
- #endif
- localizable_tag
- { };
- explicit mode_adapter(const policy_type& t) : t_(t) { }
-
- // Device member functions.
-
- std::streamsize read(char_type* s, std::streamsize n);
- std::streamsize write(const char_type* s, std::streamsize n);
- std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which =
- BOOST_IOS::in | BOOST_IOS::out );
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- void close(BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out);
-#endif
-
- // Filter member functions.
-
- template<typename Source>
- std::streamsize read(Source& src, char_type* s, std::streamsize n)
- { return iostreams::read(t_, src, s, n); }
-
- template<typename Sink>
- std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
- { return iostreams::write(t_, snk, s, n); }
-
- template<typename Device>
- std::streampos seek(Device& dev, stream_offset off, BOOST_IOS::seekdir way)
- { return iostreams::seek(t_, dev, off, way); }
-
- template<typename Device>
- std::streampos seek( Device& dev, stream_offset off,
- BOOST_IOS::seekdir way, BOOST_IOS::openmode which )
- { return iostreams::seek(t_, dev, off, way, which); }
-
- template<typename Device>
- void close(Device& dev)
- { iostreams::close(t_, dev); }
-
- template<typename Device>
- void close(Device& dev, BOOST_IOS::openmode which)
- { iostreams::close(t_, dev, which); }
-
- template<typename Locale>
- void imbue(const Locale& loc)
- { iostreams::imbue(t_, loc); }
-private:
- policy_type t_;
-};
-
-//------------------Implementation of mode_adapter----------------------------//
-
-template<typename Mode, typename T>
-std::streamsize mode_adapter<Mode, T>::read
- (char_type* s, std::streamsize n)
-{ return boost::iostreams::read(t_, s, n); }
-
-template<typename Mode, typename T>
-std::streamsize mode_adapter<Mode, T>::write
- (const char_type* s, std::streamsize n)
-{ return boost::iostreams::write(t_, s, n); }
-
-template<typename Mode, typename T>
-std::streampos mode_adapter<Mode, T>::seek
- (stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which)
-{ return boost::iostreams::seek(t_, off, way, which); }
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- template<typename Mode, typename T>
- void mode_adapter<Mode, T>::close(BOOST_IOS::openmode which)
- { iostreams::close(t_, which); }
-#endif
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_MODE_ADAPTER_HPP_INCLUDED //-----//
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
-
-#include <boost/iostreams/detail/ios.hpp> // streamsize, seekdir, openmode.
-#include <boost/iostreams/read.hpp>
-#include <boost/iostreams/seek.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/write.hpp>
-
-namespace boost { namespace iostreams {
-
-template<typename Device>
-class non_blocking_adapter {
-public:
- typedef typename char_type_of<Device>::type char_type;
- struct category
- : mode_of<Device>::type, device_tag
- { };
- explicit non_blocking_adapter(Device& dev) : device_(dev) { }
- std::streamsize read(char_type* s, std::streamsize n)
- {
- std::streamsize result = 0;
- while (result < n) {
- std::streamsize amt = iostreams::read(device_, s, n);
- if (amt == -1)
- break;
- result += amt;
- }
- return result != 0 ? result : -1;
- }
- std::streamsize write(const char_type* s, std::streamsize n)
- {
- std::streamsize result = 0;
- while (result < n) {
- std::streamsize amt =
- iostreams::write(device_, s + result, n - result);
- result += amt;
- }
- return result;
- }
- std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which =
- BOOST_IOS::in | BOOST_IOS::out )
- { return iostreams::seek(device_, off, way, which); }
-public:
- Device& device_;
-};
-
-} } // End namespace iostreams.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_NON_BLOCKING_ADAPTER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_OUTPUT_ITERATOR_ADAPTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_OUTPUT_ITERATOR_ADAPTER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <algorithm> // copy.
-#include <iosfwd> // streamsize.
-#include <boost/iostreams/categories.hpp> // tags.
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename Mode, typename Ch, typename OutIt>
-class output_iterator_adapter {
-public:
- BOOST_STATIC_ASSERT((is_convertible<Mode, output>::value));
- typedef Ch char_type;
- typedef sink_tag category;
- explicit output_iterator_adapter(OutIt out) : out_(out) { }
- std::streamsize write(const char_type* s, std::streamsize n)
- {
- std::copy(s, s + n, out_);
- return n;
- }
-private:
- OutIt out_;
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_OUTPUT_ITERATOR_ADAPTER_HPP_INCLUDED //-----//
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_RANGE_ADAPTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_RANGE_ADAPTER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <algorithm> // min.
-#include <cassert>
-#include <cstddef> // ptrdiff_t.
-#include <iosfwd> // streamsize, streamoff.
-#include <boost/detail/iterator.hpp> // boost::iterator_traits.
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/error.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/utility/enable_if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams { namespace detail {
-
-// Used for simulated tag dispatch.
-template<typename Traversal> struct range_adapter_impl;
-
-//
-// Template name: range_adapter
-// Description: Device based on an instance of boost::iterator_range.
-// Template paramters:
-// Mode - A mode tag.
-// Range - An instance of iterator_range.
-//
-template<typename Mode, typename Range>
-class range_adapter {
-private:
- typedef typename Range::iterator iterator;
- typedef boost::detail::iterator_traits<iterator> iter_traits;
- typedef typename iter_traits::iterator_category iter_cat;
-public:
- typedef typename Range::value_type char_type;
- struct category : Mode, device_tag { };
- typedef typename
- mpl::if_<
- is_convertible<
- iter_cat,
- std::random_access_iterator_tag
- >,
- std::random_access_iterator_tag,
- std::forward_iterator_tag
- >::type tag;
- typedef range_adapter_impl<tag> impl;
-
- explicit range_adapter(const Range& rng);
- range_adapter(iterator first, iterator last);
- std::streamsize read(char_type* s, std::streamsize n);
- std::streamsize write(const char_type* s, std::streamsize n);
- std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
-private:
- iterator first_, cur_, last_;
-};
-
-//------------------Implementation of range_adapter---------------------------//
-
-template<typename Mode, typename Range>
-range_adapter<Mode, Range>::range_adapter(const Range& rng)
- : first_(rng.begin()), cur_(rng.begin()), last_(rng.end()) { }
-
-template<typename Mode, typename Range>
-range_adapter<Mode, Range>::range_adapter(iterator first, iterator last)
- : first_(first), cur_(first), last_(last) { }
-
-template<typename Mode, typename Range>
-inline std::streamsize range_adapter<Mode, Range>::read
- (char_type* s, std::streamsize n)
-{ return impl::read(cur_, last_, s, n); }
-
-template<typename Mode, typename Range>
-inline std::streamsize range_adapter<Mode, Range>::write
- (const char_type* s, std::streamsize n)
-{ return impl::write(cur_, last_, s, n); }
-
-
-template<typename Mode, typename Range>
-std::streampos range_adapter<Mode, Range>::seek
- (stream_offset off, BOOST_IOS::seekdir way)
-{
- impl::seek(first_, cur_, last_, off, way);
- return offset_to_position(cur_ - first_);
-}
-
-//------------------Implementation of range_adapter_impl----------------------//
-
-template<>
-struct range_adapter_impl<std::forward_iterator_tag> {
- template<typename Iter, typename Ch>
- static std::streamsize read
- (Iter& cur, Iter& last, Ch* s,std::streamsize n)
- {
- std::streamsize rem = n; // No. of chars remaining.
- while (cur != last && rem-- > 0) *s++ = *cur++;
- return n - rem != 0 ? n - rem : -1;
- }
-
- template<typename Iter, typename Ch>
- static std::streamsize write
- (Iter& cur, Iter& last, const Ch* s, std::streamsize n)
- {
- while (cur != last && n-- > 0) *cur++ = *s++;
- if (cur == last && n > 0)
- throw write_area_exhausted();
- return n;
- }
-};
-
-template<>
-struct range_adapter_impl<std::random_access_iterator_tag> {
- template<typename Iter, typename Ch>
- static std::streamsize read
- (Iter& cur, Iter& last, Ch* s,std::streamsize n)
- {
- std::streamsize result =
- (std::min)(static_cast<std::streamsize>(last - cur), n);
- if (result)
- std::copy(cur, cur + result, s);
- cur += result;
- return result != 0 ? result : -1;
- }
-
- template<typename Iter, typename Ch>
- static std::streamsize write
- (Iter& cur, Iter& last, const Ch* s, std::streamsize n)
- {
- std::streamsize count =
- (std::min)(static_cast<std::streamsize>(last - cur), n);
- std::copy(s, s + count, cur);
- cur += count;
- if (count < n)
- throw write_area_exhausted();
- return n;
- }
-
- template<typename Iter>
- static void seek
- ( Iter& first, Iter& cur, Iter& last, stream_offset off,
- BOOST_IOS::seekdir way )
- {
- using namespace std;
- switch (way) {
- case BOOST_IOS::beg:
- if (off > last - first || off < 0) bad_seek();
- cur = first + off;
- break;
- case BOOST_IOS::cur:
- {
- std::ptrdiff_t newoff = cur - first + off;
- if (newoff > last - first || newoff < 0) bad_seek();
- cur += off;
- break;
- }
- case BOOST_IOS::end:
- if (last - first + off < 0 || off > 0) bad_seek();
- cur = last + off;
- break;
- default:
- assert(0);
- }
- }
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_RANGE_ADAPTER_HPP_INCLUDED //---------------//
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_BOOL_TRAIT_DEF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_BOOL_TRAIT_DEF_HPP_INCLUDED
-
-#include <boost/config.hpp> // BOOST_STATIC_CONSTANT.
-#include <boost/iostreams/detail/template_params.hpp>
-#include <boost/mpl/aux_/lambda_support.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/type_traits/detail/yes_no_type.hpp>
-
-//
-// Macro name: BOOST_IOSTREAMS_BOOL_TRAIT_DEF
-// Description: Used to generate the traits classes is_istream, is_ostream,
-// etc.
-//
-#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x582))
-# define BOOST_IOSTREAMS_TRAIT_NAMESPACE(trait)
-#else
-# define BOOST_IOSTREAMS_TRAIT_NAMESPACE(trait) BOOST_PP_CAT(trait, _impl_)::
-#endif
-#define BOOST_IOSTREAMS_BOOL_TRAIT_DEF(trait, type, arity) \
- namespace BOOST_PP_CAT(trait, _impl_) { \
- BOOST_IOSTREAMS_TEMPLATE_PARAMS(arity, T) \
- type_traits::yes_type helper \
- (const volatile type BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T)*); \
- type_traits::no_type helper(...); \
- template<typename T> \
- struct impl { \
- BOOST_STATIC_CONSTANT(bool, value = \
- (sizeof(BOOST_IOSTREAMS_TRAIT_NAMESPACE(trait) \
- helper(static_cast<T*>(0))) == \
- sizeof(type_traits::yes_type))); \
- }; \
- } \
- template<typename T> \
- struct trait \
- : mpl::bool_<BOOST_PP_CAT(trait, _impl_)::impl<T>::value> \
- { BOOST_MPL_AUX_LAMBDA_SUPPORT(1, trait, (T)) }; \
- /**/
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_BOOL_TRAIT_DEF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003-5.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_BUFFERS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_BUFFERS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <algorithm> // swap.
-#include <memory> // allocator.
-#include <boost/config.hpp> // member templates.
-#include <boost/iostreams/char_traits.hpp>
-#include <boost/iostreams/detail/ios.hpp> // streamsize.
-#include <boost/iostreams/read.hpp>
-#include <boost/iostreams/traits.hpp> // int_type_of.
-#include <boost/iostreams/checked_operations.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-//----------------Buffers-----------------------------------------------------//
-
-//
-// Template name: buffer
-// Description: Character buffer.
-// Template paramters:
-// Ch - The character type.
-// Alloc - The Allocator type.
-//
-template< typename Ch,
- typename Alloc = std::allocator<Ch> >
-class basic_buffer {
-private:
-#ifndef BOOST_NO_STD_ALLOCATOR
- typedef typename Alloc::template rebind<Ch>::other allocator_type;
-#else
- typedef std::allocator<Ch> allocator_type;
-#endif
-public:
- basic_buffer();
- basic_buffer(int buffer_size);
- ~basic_buffer();
- void resize(int buffer_size);
- Ch* begin() const { return buf_; }
- Ch* end() const { return buf_ + size_; }
- Ch* data() const { return buf_; }
- std::streamsize size() const { return size_; }
- void swap(basic_buffer& rhs);
-private:
- // Disallow copying and assignment.
- basic_buffer(const basic_buffer&);
- basic_buffer& operator=(const basic_buffer&);
- Ch* buf_;
- std::streamsize size_;
-};
-
-template<typename Ch, typename Alloc>
-void swap(basic_buffer<Ch, Alloc>& lhs, basic_buffer<Ch, Alloc>& rhs)
-{ lhs.swap(rhs); }
-
-//
-// Template name: buffer
-// Description: Character buffer with two pointers accessible via ptr() and
-// eptr().
-// Template paramters:
-// Ch - A character type.
-//
-template< typename Ch,
- typename Alloc = std::allocator<Ch> >
-class buffer : public basic_buffer<Ch, Alloc> {
-private:
- typedef basic_buffer<Ch, Alloc> base;
-public:
- typedef iostreams::char_traits<Ch> traits_type;
- using base::resize;
- using base::data;
- using base::size;
- typedef Ch* const const_pointer;
- buffer(int buffer_size);
- Ch* & ptr() { return ptr_; }
- const_pointer& ptr() const { return ptr_; }
- Ch* & eptr() { return eptr_; }
- const_pointer& eptr() const { return eptr_; }
- void set(std::streamsize ptr, std::streamsize end);
- void swap(buffer& rhs);
-
- // Returns an int_type as a status code.
- template<typename Source>
- typename int_type_of<Source>::type fill(Source& src)
- {
- using namespace std;
- streamsize keep;
- if ((keep = static_cast<streamsize>(eptr_ - ptr_)) > 0)
- traits_type::move(this->data(), ptr_, keep);
- set(0, keep);
- streamsize result =
- iostreams::read(src, this->data() + keep, this->size() - keep);
- if (result != -1)
- this->set(0, keep + result);
- //return result == this->size() - keep ?
- // traits_type::good() :
- // keep == -1 ?
- // traits_type::eof() :
- // traits_type::would_block();
- return result == -1 ?
- traits_type::eof() :
- result == 0 ?
- traits_type::would_block() :
- traits_type::good();
-
- }
-
- // Returns true if one or more characters were written.
- template<typename Sink>
- bool flush(Sink& dest)
- {
- using namespace std;
- streamsize amt = static_cast<std::streamsize>(eptr_ - ptr_);
- streamsize result = iostreams::write_if(dest, ptr_, amt);
- if (result < amt) {
- traits_type::move( this->data(),
- ptr_ + result,
- amt - result );
- }
- this->set(0, amt - result);
- return result != 0;
- }
-private:
- Ch *ptr_, *eptr_;
-};
-
-template<typename Ch, typename Alloc>
-void swap(buffer<Ch, Alloc>& lhs, buffer<Ch, Alloc>& rhs)
-{ lhs.swap(rhs); }
-
-//--------------Implementation of basic_buffer--------------------------------//
-
-template<typename Ch, typename Alloc>
-basic_buffer<Ch, Alloc>::basic_buffer() : buf_(0), size_(0) { }
-
-template<typename Ch, typename Alloc>
-basic_buffer<Ch, Alloc>::basic_buffer(int buffer_size)
- : buf_(static_cast<Ch*>(allocator_type().allocate(buffer_size, 0))),
- size_(buffer_size) // Cast for SunPro 5.3.
- { }
-
-template<typename Ch, typename Alloc>
-inline basic_buffer<Ch, Alloc>::~basic_buffer()
-{ if (buf_) allocator_type().deallocate(buf_, size_); }
-
-template<typename Ch, typename Alloc>
-inline void basic_buffer<Ch, Alloc>::resize(int buffer_size)
-{
- if (size_ != buffer_size) {
- basic_buffer<Ch, Alloc> temp(buffer_size);
- std::swap(size_, temp.size_);
- std::swap(buf_, temp.buf_);
- }
-}
-
-template<typename Ch, typename Alloc>
-void basic_buffer<Ch, Alloc>::swap(basic_buffer& rhs)
-{
- std::swap(buf_, rhs.buf_);
- std::swap(size_, rhs.size_);
-}
-
-//--------------Implementation of buffer--------------------------------------//
-
-template<typename Ch, typename Alloc>
-buffer<Ch, Alloc>::buffer(int buffer_size)
- : basic_buffer<Ch, Alloc>(buffer_size) { }
-
-template<typename Ch, typename Alloc>
-inline void buffer<Ch, Alloc>::set(std::streamsize ptr, std::streamsize end)
-{
- ptr_ = data() + ptr;
- eptr_ = data() + end;
-}
-
-template<typename Ch, typename Alloc>
-inline void buffer<Ch, Alloc>::swap(buffer& rhs)
-{
- base::swap(rhs);
- std::swap(ptr_, rhs.ptr_);
- std::swap(eptr_, rhs.eptr_);
-}
-
-//----------------------------------------------------------------------------//
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_BUFFERS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_VALUE_TYPE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_VALUE_TYPE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename T>
-struct param_type {
- typedef typename mpl::if_<is_std_io<T>, T&, const T&>::type type;
-};
-
-template<typename T>
-struct value_type {
- typedef typename mpl::if_<is_std_io<T>, T&, T>::type type;
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_VALUE_TYPE_HPP_INCLUDED //-----------//
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// Provides std::char_traits for libraries without templated streams. Should not
-// be confused with <boost/iostreams/char_traits.hpp>, which defines the
-// template boost::iostreams::char_traits.
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <iosfwd>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# include <boost/config.hpp> // Make sure size_t is in std.
-# include <cstddef>
-# include <cstring>
-# include <cstdio>
-#endif
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------------------//
-# define BOOST_IOSTREAMS_CHAR_TRAITS(ch) std::char_traits< ch >
-#else
-# define BOOST_IOSTREAMS_CHAR_TRAITS(ch) boost::iostreams::detail::char_traits
-
-namespace boost { namespace iostreams { namespace detail {
-
-struct char_traits {
- typedef char char_type;
- typedef int int_type;
- typedef std::streampos pos_type;
- typedef std::streamoff off_type;
-
- // Note: this may not be not conforming, since it treats chars as unsigned,
- // but is only used to test for equality.
- static int compare(const char* lhs, const char* rhs, std::size_t n)
- { return std::strncmp(lhs, rhs, n); }
- static char* copy(char *dest, const char *src, std::size_t n)
- { return static_cast<char*>(std::memcpy(dest, src, n)); }
- static char* move(char *dest, const char *src, std::size_t n)
- { return static_cast<char*>(std::memmove(dest, src, n)); }
- static const char* find(const char* s, std::size_t n, const char& c)
- { return (const char*) (const void*) std::memchr(s, c, n); }
- static char to_char_type(const int& c) { return c; }
- static int to_int_type(const char& c) { return c; }
- static bool eq_int_type(const int& lhs, const int& rhs)
- { return lhs == rhs; }
- static int eof() { return EOF; }
- static int not_eof(const int& c) { return c != EOF ? c : '\n'; }
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-----------------------//
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHAR_TRAITS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CLOSER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CLOSER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <exception> // exception.
-#include <boost/iostreams/detail/ios.hpp> // openmode.
-#include <boost/iostreams/operations.hpp> // close
-#include <boost/iostreams/traits.hpp> // is_device.
-#include <boost/mpl/if.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename T>
-struct closer {
- closer(T& t) : t_(&t) { }
- ~closer() { try { t_->close(); } catch (std::exception&) { } }
- T* t_;
-};
-
-template<typename Device>
-struct external_device_closer {
- external_device_closer(Device& dev, BOOST_IOS::openmode which)
- : device_(&dev), which_(which),
- dummy_(true), nothrow_(dummy_)
- { }
- external_device_closer(Device& dev, BOOST_IOS::openmode which, bool& nothrow)
- : device_(&dev), which_(which),
- dummy_(true), nothrow_(nothrow)
- { }
- ~external_device_closer()
- {
- try {
- boost::iostreams::close(*device_, which_);
- } catch (...) {
- if (!nothrow_) {
- nothrow_ = true;
- throw;
- }
- }
- }
- Device* device_;
- BOOST_IOS::openmode which_;
- bool dummy_;
- bool& nothrow_;
-};
-
-template<typename Filter, typename Device>
-struct external_filter_closer {
- external_filter_closer(Filter& flt, Device& dev, BOOST_IOS::openmode which)
- : filter_(flt), device_(dev), which_(which),
- dummy_(true), nothrow_(dummy_)
- { }
- external_filter_closer( Filter& flt, Device& dev,
- BOOST_IOS::openmode which, bool& nothrow )
- : filter_(flt), device_(dev), which_(which),
- dummy_(true), nothrow_(nothrow)
- { }
- ~external_filter_closer()
- {
- try {
- boost::iostreams::close(filter_, device_, which_);
- } catch (...) {
- if (!nothrow_) {
- nothrow_ = true;
- throw;
- }
- }
- }
- Filter& filter_;
- Device& device_;
- BOOST_IOS::openmode which_;
- bool dummy_;
- bool& nothrow_;
-};
-
-template<typename FilterOrDevice, typename DeviceOrDummy = int>
-struct external_closer_traits {
- typedef typename
- mpl::if_<
- is_device<FilterOrDevice>,
- external_device_closer<FilterOrDevice>,
- external_filter_closer<FilterOrDevice, DeviceOrDummy>
- >::type type;
-};
-
-template<typename FilterOrDevice, typename DeviceOrDummy = int>
-struct external_closer
- : external_closer_traits<FilterOrDevice, DeviceOrDummy>::type
-{
- typedef typename
- external_closer_traits<
- FilterOrDevice, DeviceOrDummy
- >::type base_type;
- external_closer(FilterOrDevice& dev, BOOST_IOS::openmode which)
- : base_type(dev, which)
- { BOOST_STATIC_ASSERT(is_device<FilterOrDevice>::value); };
- external_closer( FilterOrDevice& dev, BOOST_IOS::openmode which,
- bool& nothrow )
- : base_type(dev, which, nothrow)
- { BOOST_STATIC_ASSERT(is_device<FilterOrDevice>::value); };
- external_closer( FilterOrDevice& flt, DeviceOrDummy& dev,
- BOOST_IOS::openmode which )
- : base_type(flt, dev, which)
- { BOOST_STATIC_ASSERT(is_filter<FilterOrDevice>::value); };
- external_closer( FilterOrDevice& flt, DeviceOrDummy& dev,
- BOOST_IOS::openmode which, bool& nothrow )
- : base_type(flt, dev, which, nothrow)
- { BOOST_STATIC_ASSERT(is_filter<FilterOrDevice>::value); };
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CLOSER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from <boost/config/auto_link.hpp> and from
-// http://www.boost.org/more/separate_compilation.html, by John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_AUTO_LINK_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_AUTO_LINK_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(BOOST_EXTERNAL_LIB_NAME)
-# if defined(BOOST_MSVC) \
- || defined(__BORLANDC__) \
- || (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) \
- || (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \
- /**/
-# pragma comment(lib, BOOST_EXTERNAL_LIB_NAME)
-# endif
-# undef BOOST_EXTERNAL_LIB_NAME
-#endif
-
-//------------------Enable automatic library variant selection----------------//
-
-#if !defined(BOOST_IOSTREAMS_SOURCE) && \
- !defined(BOOST_ALL_NO_LIB) && \
- !defined(BOOST_IOSTREAMS_NO_LIB) \
- /**/
-
-// Set the name of our library, this will get undef'ed by auto_link.hpp
-// once it's done with it.
-# define BOOST_LIB_NAME boost_iostreams
-
-// If we're importing code from a dll, then tell auto_link.hpp about it.
-# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_IOSTREAMS_DYN_LINK)
-# define BOOST_DYN_LINK
-# endif
-
-// And include the header that does the work.
-# include <boost/config/auto_link.hpp>
-#endif // auto-linking disabled
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_AUTO_LINK_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from <boost/config/auto_link.hpp> and from
-// http://www.boost.org/more/separate_compilation.html, by John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_BZIP2_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_BZIP2_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#if defined(BOOST_BZIP2_BINARY)
-# if defined(BOOST_MSVC) || \
- defined(__BORLANDC__) || \
- (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) || \
- (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \
- /**/
-
-// Specify the name of the .lib file.
-# pragma comment(lib, BOOST_STRINGIZE(BOOST_BZIP2_BINARY))
-# endif
-#else
-# if !defined(BOOST_IOSTREAMS_SOURCE) && \
- !defined(BOOST_ALL_NO_LIB) && \
- !defined(BOOST_IOSTREAMS_NO_LIB) \
- /**/
-
-// Set the name of our library, this will get undef'ed by auto_link.hpp
-// once it's done with it.
-# define BOOST_LIB_NAME boost_bzip2
-
-// If we're importing code from a dll, then tell auto_link.hpp about it.
-# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_IOSTREAMS_DYN_LINK)
-# define BOOST_DYN_LINK
-# endif
-
-// And include the header that does the work.
-# include <boost/config/auto_link.hpp>
-# endif
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_BZIP2_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_CODECVT_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_CODECVT_HPP_INCLUDED
-
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <cstddef>
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-//------------------Support for codecvt with user-defined state types---------//
-
-#if defined(__MSL_CPP__) || defined(__LIBCOMO__) || \
- BOOST_WORKAROUND(_STLPORT_VERSION, <= 0x450) \
- /**/
-# define BOOST_IOSTREAMS_NO_PRIMARY_CODECVT_DEFINITION
-#endif
-
-#if defined(__GLIBCPP__) || defined(__GLIBCXX__) || \
- BOOST_WORKAROUND(_STLPORT_VERSION, > 0x450) \
- /**/
-# define BOOST_IOSTREAMS_EMPTY_PRIMARY_CODECVT_DEFINITION
-#endif
-
-//------------------Check for codecvt ctor taking a reference count-----------//
-
-#if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205)) || \
- BOOST_WORKAROUND(_STLPORT_VERSION, < 0x461) \
- /**/
-# define BOOST_IOSTREAMS_NO_CODECVT_CTOR_FROM_SIZE_T
-#endif
-
-//------------------Normalize codecvt::length---------------------------------//
-
-#if !defined(__MSL_CPP__) && !defined(__LIBCOMO__)
-# define BOOST_IOSTREAMS_CODECVT_CV_QUALIFIER const
-#else
-# define BOOST_IOSTREAMS_CODECVT_CV_QUALIFIER
-#endif
-
-//------------------Check for codecvt::max_length-----------------------------//
-
-#if BOOST_WORKAROUND(_STLPORT_VERSION, < 0x461)
-# define BOOST_IOSTREAMS_NO_CODECVT_MAX_LENGTH
-#endif
-
-//------------------Put mbstate_t and codecvt in std--------------------------//
-
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
-# include <locale>
-#endif
-
-// From Robert Ramey's version of utf8_codecvt_facet.
-namespace std {
-
-#if defined(__LIBCOMO__)
- using ::mbstate_t;
-#elif defined(BOOST_DINKUMWARE_STDLIB) && !defined(__BORLANDC__)
- using ::mbstate_t;
-#elif defined(__SGI_STL_PORT)
-#elif defined(BOOST_NO_STDC_NAMESPACE)
- using ::codecvt;
- using ::mbstate_t;
-#endif
-
-} // End namespace std.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_CODECVT_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp> // BOOST_WORKAROUND.
-
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable:4224) // Parameter previously defined as type.
-# pragma warning(disable:4244) // Conversion: possible loss of data.
-#else
-# if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
-# pragma warn -8008 // Condition always true/false.
-# pragma warn -8071 // Conversion may lose significant digits.
-# pragma warn -8080 // identifier declared but never used.
-# endif
-#endif
-
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from http://www.boost.org/more/separate_compilation.html, by
-// John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_DYN_LINK_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_DYN_LINK_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-//------------------Enable dynamic linking on windows-------------------------//
-
-#ifdef BOOST_HAS_DECLSPEC
-# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_IOSTREAMS_DYN_LINK)
-# ifdef BOOST_IOSTREAMS_SOURCE
-# define BOOST_IOSTREAMS_DECL __declspec(dllexport)
-# else
-# define BOOST_IOSTREAMS_DECL __declspec(dllimport)
-# endif
-# endif
-#endif
-
-#ifndef BOOST_IOSTREAMS_DECL
-# define BOOST_IOSTREAMS_DECL
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_DYN_LINK_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#else
-# if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
-# pragma warn .8008 // Condition always true/false.
-# pragma warn .8071 // Conversion may lose significant digits.
-# pragma warn .8080 // identifier declared but never used.
-# endif
-#endif
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from <boost/config/auto_link.hpp> and from
-// http://www.boost.org/more/separate_compilation.html, by John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_GCC_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_GCC_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_INTEL.
-
-#if defined(__GNUC__) && !defined(BOOST_INTEL)
-# define BOOST_IOSTREAMS_GCC (__GNUC__ * 100 + __GNUC_MINOR__)
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_GCC_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_LIMITS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_LIMITS_HPP_INCLUDED
-
-#ifndef BOOST_IOSTREAMS_MAX_FORWARDING_ARITY
-# define BOOST_IOSTREAMS_MAX_FORWARDING_ARITY 3
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_LIMITS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from <boost/config/auto_link.hpp> and from
-// http://www.boost.org/more/separate_compilation.html, by John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_BROKEN_OVERLOAD_RESOLUTION_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_BROKEN_OVERLOAD_RESOLUTION_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/config/gcc.hpp>
-
-#if !defined(BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION)
-# if BOOST_WORKAROUND(__MWERKS__, <= 0x3003) || \
- BOOST_WORKAROUND(__BORLANDC__, < 0x600) || \
- BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || \
- BOOST_WORKAROUND(BOOST_IOSTREAMS_GCC, <= 295) \
- /**/
-# define BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
-# endif
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_BROKEN_OVERLOAD_RESOLUTION_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from http://www.boost.org/more/separate_compilation.html, by
-// John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_WIDE_STREAMS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_WIDE_STREAMS_HPP_INCLUDED
-
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-#include <cstddef>
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-//------------------Templated stream support----------------------------------//
-
-// From boost/dynamic_bitset.hpp; thanks to Matthias Troyer for cray patch.
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# if defined(__STL_CONFIG_H) && \
- !defined (__STL_USE_NEW_IOSTREAMS) && !defined(__crayx1) \
- /**/
-# define BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# endif
-#endif // #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-
-//------------------Wide stream support---------------------------------------//
-
-#ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
-# if defined(BOOST_IOSTREAMS_NO_STREAM_TEMPLATES) || \
- defined (BOOST_NO_STD_WSTREAMBUF) && \
- ( !defined(__MSL_CPP__) || defined(_MSL_NO_WCHART_CPP_SUPPORT) ) \
- /**/
-# define BOOST_IOSTREAMS_NO_WIDE_STREAMS
-# endif
-#endif // #ifndef BOOST_IOSTREAMS_NO_WIDE_STREAMS
-
-//------------------Locale support--------------------------------------------//
-
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
-# if defined(BOOST_NO_STD_LOCALE) || \
- defined(__CYGWIN__) && \
- ( !defined(__MSL_CPP__) || defined(_MSL_NO_WCHART_CPP_SUPPORT) ) \
- /**/
-# define BOOST_IOSTREAMS_NO_LOCALE
-# endif
-#endif // #ifndef BOOST_IOSTREAMS_NO_LOCALE
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_WIDE_STREAMS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright 2002, 2003 Beman Dawes Boost.Filesystem
-// (C) Copyright Jonathan Turkanis 2004.
-
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_WINDOWS_POSIX_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_WINDOWS_POSIX_HPP_INCLUDED
-
-//------------------From boost/libs/filesystem/src/path_posix_windows.cpp-----//
-
-// BOOST_IOSTREAMS_POSIX or BOOST_IOSTREAMS_WINDOWS specify which API to use.
-#if !defined( BOOST_IOSTREAMS_WINDOWS ) && !defined( BOOST_IOSTREAMS_POSIX )
-# if (defined(_WIN32) || defined(__WIN32__) || defined(WIN32)) && \
- !defined(__CYGWIN__) \
- /**/
-# define BOOST_IOSTREAMS_WINDOWS
-# else
-# define BOOST_IOSTREAMS_POSIX
-# endif
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_WINDOWS_POSIX_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Adapted from <boost/config/auto_link.hpp> and from
-// http://www.boost.org/more/separate_compilation.html, by John Maddock.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_ZLIB_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CONFIG_ZLIB_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_STRINGIZE.
-
-#if defined(BOOST_ZLIB_BINARY)
-# if defined(BOOST_MSVC) || \
- defined(__BORLANDC__) || \
- (defined(__MWERKS__) && defined(_WIN32) && (__MWERKS__ >= 0x3000)) || \
- (defined(__ICL) && defined(_MSC_EXTENSIONS) && (_MSC_VER >= 1200)) \
- /**/
-
-// Specify the name of the .lib file.
-# pragma comment(lib, BOOST_STRINGIZE(BOOST_ZLIB_BINARY))
-# endif
-#else
-# if !defined(BOOST_IOSTREAMS_SOURCE) && \
- !defined(BOOST_ALL_NO_LIB) && \
- !defined(BOOST_IOSTREAMS_NO_LIB) \
- /**/
-
-// Set the name of our library, this will get undef'ed by auto_link.hpp
-// once it's done with it.
-# define BOOST_LIB_NAME boost_zlib
-
-// If we're importing code from a dll, then tell auto_link.hpp about it.
-# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_IOSTREAMS_DYN_LINK)
-# define BOOST_DYN_LINK
-# endif
-
-// And include the header that does the work.
-# include <boost/config/auto_link.hpp>
-# endif
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CONFIG_ZLIB_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_DEFAULT_ARG_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_DEFAULT_ARG_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>
-#include <boost/detail/workaround.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-# include <boost/mpl/identity.hpp>
-# define BOOST_IOSTREAMS_DEFAULT_ARG(arg) mpl::identity< arg >::type
-#else
-# define BOOST_IOSTREAMS_DEFAULT_ARG(arg) arg
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_DEFAULT_ARG_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_DISPATCH_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_DISPATCH_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_DEDUCED_TYPENAME.
-#include <boost/iostreams/detail/select.hpp>
-#include <boost/iostreams/traits.hpp> // category_of.
-#include <boost/mpl/void.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-namespace boost { namespace iostreams {namespace detail {
-
-template< typename T, typename Tag1, typename Tag2,
- typename Tag3 = mpl::void_, typename Tag4 = mpl::void_,
- typename Tag5 = mpl::void_, typename Tag6 = mpl::void_,
- typename Category =
- BOOST_DEDUCED_TYPENAME category_of<T>::type >
-struct dispatch
- : iostreams::select< // Disambiguation for Tru64.
- is_convertible<Category, Tag1>, Tag1,
- is_convertible<Category, Tag2>, Tag2,
- is_convertible<Category, Tag3>, Tag3,
- is_convertible<Category, Tag4>, Tag4,
- is_convertible<Category, Tag5>, Tag5,
- is_convertible<Category, Tag6>, Tag6
- >
- { };
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_DISPATCH_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2004
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains the definition of the class template
-// boost::iostreams::detail::double_object, which is similar to compressed pair
-// except that both members of the pair have the same type, and
-// compression occurs only if requested using a boolean template
-// parameter.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_DOUBLE_OBJECT_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_DOUBLE_OBJECT_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <algorithm> // swap.
-#include <boost/detail/workaround.hpp>
-#include <boost/mpl/if.hpp>
-#if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
-# include <msl_utility>
-#else
-# include <boost/call_traits.hpp>
-#endif
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename T>
-class single_object_holder {
-public:
-#if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
- typedef Metrowerks::call_traits<T> traits_type;
-#else
- typedef boost::call_traits<T> traits_type;
-#endif
- typedef typename traits_type::param_type param_type;
- typedef typename traits_type::reference reference;
- typedef typename traits_type::const_reference const_reference;
- single_object_holder() { }
- single_object_holder(param_type t) : first_(t) { }
- reference first() { return first_; }
- const_reference first() const { return first_; }
- reference second() { return first_; }
- const_reference second() const { return first_; }
- void swap(single_object_holder& o)
- { std::swap(first_, o.first_); }
-private:
- T first_;
-};
-
-template<typename T>
-struct double_object_holder {
-public:
-#if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
- typedef Metrowerks::call_traits<T> traits_type;
-#else
- typedef boost::call_traits<T> traits_type;
-#endif
- typedef typename traits_type::param_type param_type;
- typedef typename traits_type::reference reference;
- typedef typename traits_type::const_reference const_reference;
- double_object_holder() { }
- double_object_holder(param_type t1, param_type t2)
- : first_(t1), second_(t2) { }
- reference first() { return first_; }
- const_reference first() const { return first_; }
- reference second() { return second_; }
- const_reference second() const { return second_; }
- void swap(double_object_holder& d)
- {
- std::swap(first_, d.first_);
- std::swap(second_, d.second_);
- }
-private:
- T first_, second_;
-};
-
-template<typename T, typename IsDouble>
-class double_object
- : public mpl::if_<
- IsDouble,
- double_object_holder<T>,
- single_object_holder<T>
- >::type
-{
-private:
- typedef typename
- mpl::if_<
- IsDouble,
- double_object_holder<T>,
- single_object_holder<T>
- >::type base_type;
-public:
-#if BOOST_WORKAROUND(__MWERKS__, > 0x3003)
- typedef Metrowerks::call_traits<T> traits_type;
-#else
- typedef boost::call_traits<T> traits_type;
-#endif
- typedef typename traits_type::param_type param_type;
- typedef typename traits_type::reference reference;
- typedef typename traits_type::const_reference const_reference;
- double_object() : base_type() {}
- double_object(param_type t1, param_type t2)
- : base_type(t1, t2) { }
- bool is_double() const { return IsDouble::value; }
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_DOUBLE_OBJECT_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_ENABLE_IF_STREAM_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_ENABLE_IF_STREAM_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_NO_SFINAE.
-#include <boost/utility/enable_if.hpp>
-#include <boost/iostreams/traits_fwd.hpp> // is_std_io.
-
-#ifndef BOOST_NO_SFINAE
-# define BOOST_IOSTREAMS_ENABLE_IF_STREAM(T) \
- , typename boost::enable_if< boost::iostreams::is_std_io<T> >::type* = 0 \
- /**/
-# define BOOST_IOSTREAMS_DISABLE_IF_STREAM(T) \
- , typename boost::disable_if< boost::iostreams::is_std_io<T> >::type* = 0 \
- /**/
-#else
-# define BOOST_IOSTREAMS_ENABLE_IF_STREAM(T)
-# define BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_ENABLE_IF_STREAM_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_ERROR_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_ERROR_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/ios.hpp> // failure.
-
-namespace boost { namespace iostreams { namespace detail {
-
-inline BOOST_IOSTREAMS_FAILURE cant_read()
-{ return BOOST_IOSTREAMS_FAILURE("no read access"); }
-
-inline BOOST_IOSTREAMS_FAILURE cant_write()
-{ return BOOST_IOSTREAMS_FAILURE("no write access"); }
-
-inline BOOST_IOSTREAMS_FAILURE cant_seek()
-{ return BOOST_IOSTREAMS_FAILURE("no random access"); }
-
-inline BOOST_IOSTREAMS_FAILURE bad_read()
-{ return BOOST_IOSTREAMS_FAILURE("bad read"); }
-
-inline BOOST_IOSTREAMS_FAILURE bad_putback()
-{ return BOOST_IOSTREAMS_FAILURE("putback buffer full"); }
-
-inline BOOST_IOSTREAMS_FAILURE bad_write()
-{ return BOOST_IOSTREAMS_FAILURE("bad write"); }
-
-inline BOOST_IOSTREAMS_FAILURE write_area_exhausted()
-{ return BOOST_IOSTREAMS_FAILURE("write area exhausted"); }
-
-inline BOOST_IOSTREAMS_FAILURE bad_seek()
-{ return BOOST_IOSTREAMS_FAILURE("bad seek"); }
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_ERROR_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_FORWARD_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_FORWARD_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/config/limits.hpp>
-#include <boost/iostreams/detail/push_params.hpp>
-#include <boost/preprocessor/arithmetic/dec.hpp>
-#include <boost/preprocessor/arithmetic/inc.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/preprocessor/repetition/repeat_from_to.hpp>
-#include <boost/preprocessor/tuple/elem.hpp>
-
-//------Macros for defining forwarding constructors and open overloads--------//
-
-//
-// Macro: BOOST_IOSTREAMS_DEFINE_FORWARDING_FUNCTIONS(mode, name, helper).
-// Description: Defines constructors and overloads of 'open' which construct
-// a device using the given argument list and pass it to 'open_impl'.
-// Assumes that 'policy_type' is an alias for the device type.
-// Not supported on Intel 7.1 and VC6.5.
-//
-#define BOOST_IOSTREAMS_FORWARD(class, impl, policy, params, args) \
- class(const policy& t params()) \
- { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
- class(policy& t params()) \
- { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
- class(const ::boost::reference_wrapper<policy>& ref params()) \
- { this->impl(ref args()); } \
- void open(const policy& t params()) \
- { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
- void open(policy& t params()) \
- { this->impl(::boost::iostreams::detail::wrap(t) args()); } \
- void open(const ::boost::reference_wrapper<policy>& ref params()) \
- { this->impl(ref args()); } \
- BOOST_PP_REPEAT_FROM_TO( \
- 1, BOOST_PP_INC(BOOST_IOSTREAMS_MAX_FORWARDING_ARITY), \
- BOOST_IOSTREAMS_FORWARDING_CTOR, (class, impl, policy) \
- ) \
- BOOST_PP_REPEAT_FROM_TO( \
- 1, BOOST_PP_INC(BOOST_IOSTREAMS_MAX_FORWARDING_ARITY), \
- BOOST_IOSTREAMS_FORWARDING_FN, (class, impl, policy) \
- ) \
- /**/
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-# define BOOST_IOSTREAMS_FORWARDING_CTOR_I(z, n, tuple) \
- template< typename U100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), typename U) > \
- BOOST_PP_TUPLE_ELEM(3, 0, tuple) \
- ( U100& u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u)) \
- { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
- ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
- ( u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), u)) ); } \
- /**/
-# define BOOST_IOSTREAMS_FORWARDING_FN_I(z, n, tuple) \
- template< typename U100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), typename U) > \
- void open \
- ( U100& u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_DEC(n), const U, &u)) \
- { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
- ( u100 BOOST_PP_COMMA_IF(BOOST_PP_DEC(n)) \
- BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_DEC(n), u) ); } \
- /**/
-#else
-# define BOOST_IOSTREAMS_FORWARDING_CTOR_I(z, n, tuple)
-# define BOOST_IOSTREAMS_FORWARDING_FN_I(z, n, tuple)
-#endif
-#define BOOST_IOSTREAMS_FORWARDING_CTOR(z, n, tuple) \
- template<BOOST_PP_ENUM_PARAMS_Z(z, n, typename U)> \
- BOOST_PP_TUPLE_ELEM(3, 0, tuple) \
- (BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u)) \
- { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
- ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
- (BOOST_PP_ENUM_PARAMS_Z(z, n, u)) ); } \
- BOOST_IOSTREAMS_FORWARDING_CTOR_I(z, n, tuple) \
- /**/
-#define BOOST_IOSTREAMS_FORWARDING_FN(z, n, tuple) \
- template<BOOST_PP_ENUM_PARAMS_Z(z, n, typename U)> \
- void open(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, const U, &u)) \
- { this->BOOST_PP_TUPLE_ELEM(3, 1, tuple) \
- ( BOOST_PP_TUPLE_ELEM(3, 2, tuple) \
- (BOOST_PP_ENUM_PARAMS_Z(z, n, u)) ); } \
- BOOST_IOSTREAMS_FORWARDING_FN_I(z, n, tuple) \
- /**/
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_FORWARD_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_FSTREAM_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_FSTREAM_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# include <fstream>
-#else
-# include <fstream.h>
-#endif
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# define BOOST_IOSTREAMS_BASIC_IFSTREAM(Ch, Tr) std::basic_ifstream<Ch, Tr>
-# define BOOST_IOSTREAMS_BASIC_OFSTREAM(Ch, Tr) std::basic_ofstream<Ch, Tr>
-# define BOOST_IOSTREAMS_BASIC_FSTREAM(Ch, Tr) std::basic_fstream<Ch, Tr>
-# define BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) std::basic_filebuf<Ch>
-#else
-# define BOOST_IOSTREAMS_BASIC_IFSTREAM(Ch, Tr) std::ifstream
-# define BOOST_IOSTREAMS_BASIC_OFSTREAM(Ch, Tr) std::ofstream
-# define BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) std::filebuf
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_FSTREAM_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_IOS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_IOS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# if !BOOST_WORKAROUND(__MWERKS__, <= 0x3003)
-# include <ios>
-# else
-# include <istream>
-# include <ostream>
-# endif
-#else
-# include <exception>
-# include <iosfwd>
-#endif
-
-namespace boost { namespace iostreams { namespace detail {
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------------------//
-# define BOOST_IOSTREAMS_BASIC_IOS(ch, tr) std::basic_ios< ch, tr >
-# if !BOOST_WORKAROUND(__MWERKS__, <= 0x3003) && \
- !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \
- !BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
- /**/
-
-#define BOOST_IOS std::ios
-#define BOOST_IOSTREAMS_FAILURE std::ios::failure
-
-# else
-
-#define BOOST_IOS std::ios_base
-#define BOOST_IOSTREAMS_FAILURE std::ios_base::failure
-
-# endif
-#else // #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-----------------------//
-
-#define BOOST_IOS std::ios
-#define BOOST_IOSTREAMS_BASIC_IOS(ch, tr) std::ios
-#define BOOST_IOSTREAMS_FAILURE boost::iostreams::detail::failure
-
-class failure : std::exception {
-public:
- explicit failure(const std::string& what_arg) : what_(what_arg) { }
- const char* what() const { return what_.c_str(); }
-private:
- std::string what_;
-};
-
-#endif // #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //----------------------//
-
-} } } // End namespace failure, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_IOS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_IOSTREAM_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_IOSTREAM_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# include <istream>
-# include <ostream>
-#else
-# include <iostream.h>
-#endif
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# define BOOST_IOSTREAMS_BASIC_ISTREAM(ch, tr) std::basic_istream< ch, tr >
-# define BOOST_IOSTREAMS_BASIC_OSTREAM(ch, tr) std::basic_ostream< ch, tr >
-# define BOOST_IOSTREAMS_BASIC_IOSTREAM(ch, tr) std::basic_iostream< ch, tr >
-#else
-# define BOOST_IOSTREAMS_BASIC_STREAMBUF(ch, tr) std::streambuf
-# define BOOST_IOSTREAMS_BASIC_ISTREAM(ch, tr) std::istream
-# define BOOST_IOSTREAMS_BASIC_OSTREAM(ch, tr) std::ostream
-# define BOOST_IOSTREAMS_BASIC_IOSTREAM(ch, tr) std::iostream
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_IOSTREAM_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright David Abrahams 2004.
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_IS_DEREFERENCEABLE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_IS_DEREFERENCEABLE_HPP_INCLUDED
-
-# include <boost/type_traits/detail/bool_trait_def.hpp>
-# include <boost/type_traits/detail/template_arity_spec.hpp>
-# include <boost/type_traits/remove_cv.hpp>
-# include <boost/mpl/aux_/lambda_support.hpp>
-# include <boost/mpl/bool.hpp>
-# include <boost/detail/workaround.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-// is_dereferenceable<T> metafunction
-//
-// Requires: Given x of type T&, if the expression *x is well-formed
-// it must have complete type; otherwise, it must neither be ambiguous
-// nor violate access.
-
-// This namespace ensures that ADL doesn't mess things up.
-namespace is_dereferenceable_
-{
- // a type returned from operator* when no increment is found in the
- // type's own namespace
- struct tag {};
-
- // any soaks up implicit conversions and makes the following
- // operator* less-preferred than any other such operator that
- // might be found via ADL.
- struct any { template <class T> any(T const&); };
-
- // This is a last-resort operator* for when none other is found
- tag operator*(any const&);
-
-# if BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3202)) \
- || BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
-# define BOOST_comma(a,b) (a)
-# else
- // In case an operator++ is found that returns void, we'll use ++x,0
- tag operator,(tag,int);
-# define BOOST_comma(a,b) (a,b)
-# endif
-
- // two check overloads help us identify which operator++ was picked
- char (& check(tag) )[2];
-
- template <class T>
- char check(T const&);
-
- template <class T>
- struct impl
- {
- static typename boost::remove_cv<T>::type& x;
-
- BOOST_STATIC_CONSTANT(
- bool
- , value = sizeof(is_dereferenceable_::check(BOOST_comma(*x,0))) == 1
- );
- };
-}
-
-# undef BOOST_comma
-
-template<typename T>
-struct is_dereferenceable
- BOOST_TT_AUX_BOOL_C_BASE(is_dereferenceable_::impl<T>::value)
-{
- BOOST_TT_AUX_BOOL_TRAIT_VALUE_DECL(is_dereferenceable_::impl<T>::value)
- BOOST_MPL_AUX_LAMBDA_SUPPORT(1,is_dereferenceable,(T))
-};
-
-} }
-
-BOOST_TT_AUX_TEMPLATE_ARITY_SPEC(1, ::boost::iostreams::detail::is_dereferenceable)
-
-} // End namespaces detail, iostreams, boost.
-
-#endif // BOOST_IOSTREAMS_DETAIL_IS_DEREFERENCEABLE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED
-
-#include <boost/iostreams/detail/bool_trait_def.hpp>
-
-namespace boost {
-
-// We avoid dependence on Boost.Range by using a forward declaration.
-template<typename Iterator>
-class iterator_range;
-
-namespace iostreams {
-
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_iterator_range, boost::iterator_range, 1)
-
-} // End namespace iostreams.
-
-} // End namespace boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_IS_ITERATOR_RANGE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Recent changes to Boost.Optional involving assigment broke Boost.Iostreams,
-// in a way which could be remedied only by relying on the deprecated reset
-// functions; with VC6, even reset didn't work. Until this problem is
-// understood, Iostreams will use a private version of optional with a smart
-// pointer interface.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cassert>
-#include <boost/mpl/int.hpp>
-#include <boost/type_traits/aligned_storage.hpp>
-#include <boost/type_traits/alignment_of.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-// Taken from <boost/optional.hpp>.
-template<class T>
-class aligned_storage
-{
- // Borland ICEs if unnamed unions are used for this!
- union dummy_u
- {
- char data[ sizeof(T) ];
- BOOST_DEDUCED_TYPENAME type_with_alignment<
- ::boost::alignment_of<T>::value >::type aligner_;
- } dummy_ ;
-
- public:
-
- void const* address() const { return &dummy_.data[0]; }
- void * address() { return &dummy_.data[0]; }
-};
-
-template<typename T>
-class optional {
-public:
- typedef T element_type;
- optional() : initialized_(false) { }
- optional(const T& t) : initialized_(false) { reset(t); }
- ~optional() { reset(); }
- T& operator*()
- {
- assert(initialized_);
- return *static_cast<T*>(address());
- }
- const T& operator*() const
- {
- assert(initialized_);
- return *static_cast<const T*>(address());
- }
- T* operator->()
- {
- assert(initialized_);
- return static_cast<T*>(address());
- }
- const T* operator->() const
- {
- assert(initialized_);
- return static_cast<const T*>(address());
- }
- T* get()
- {
- assert(initialized_);
- return static_cast<T*>(address());
- }
- const T* get() const
- {
- assert(initialized_);
- return static_cast<const T*>(address());
- }
- void reset()
- {
- if (initialized_) {
- #if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) || \
- BOOST_WORKAROUND(__IBMCPP__, BOOST_TESTED_AT(600)) \
- /**/
- T* t = static_cast<T*>(address());
- t->~T();
- #else
- static_cast<T*>(address())->T::~T();
- #endif
- initialized_ = false;
- }
- }
- void reset(const T& t)
- {
- reset();
- new (address()) T(t);
- initialized_ = true;
- }
-private:
- optional(const optional&);
- optional& operator=(const optional&);
- void* address() { return &storage_; }
- const void* address() const { return &storage_; }
- aligned_storage<T> storage_;
- bool initialized_;
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_OPTIONAL_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_PUSH_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_PUSH_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/adapter/range_adapter.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/enable_if_stream.hpp>
-#include <boost/iostreams/pipeline.hpp>
-#include <boost/iostreams/detail/push_params.hpp>
-#include <boost/iostreams/detail/resolve.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/control/iif.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-//
-// Macro: BOOST_IOSTREAMS_DEFINE_PUSH_CONSTRUCTOR(mode, name, helper).
-// Description: Defines overloads with name 'name' which forward to a function
-// 'helper' which takes a filter or devide by const reference.
-//
-#define BOOST_IOSTREAMS_DEFINE_PUSH_CONSTRUCTOR(name, mode, ch, helper) \
- BOOST_IOSTREAMS_DEFINE_PUSH_IMPL(name, mode, ch, helper, 0, ?) \
- /**/
-
-//
-// Macro: BOOST_IOSTREAMS_DEFINE_PUSH_CONSTRUCTOR(mode, name, helper).
-// Description: Defines constructors which forward to a function
-// 'helper' which takes a filter or device by const reference.
-//
-#define BOOST_IOSTREAMS_DEFINE_PUSH(name, mode, ch, helper) \
- BOOST_IOSTREAMS_DEFINE_PUSH_IMPL(name, mode, ch, helper, 1, void) \
- /**/
-
-//--------------------Definition of BOOST_IOSTREAMS_DEFINE_PUSH_IMPL----------//
-
-#define BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, arg, helper, has_return) \
- this->helper( ::boost::iostreams::detail::resolve<mode, ch>(arg) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); \
- /**/
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && \
- !BOOST_WORKAROUND(__BORLANDC__, < 0x600) \
- /**/
-# ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# define BOOST_IOSTREAMS_DEFINE_PUSH_IMPL(name, mode, ch, helper, has_return, result) \
- template<typename CharType, typename TraitsType> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(::std::basic_streambuf<CharType, TraitsType>& sb BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, sb, helper, has_return); } \
- template<typename CharType, typename TraitsType> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(::std::basic_istream<CharType, TraitsType>& is BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_STATIC_ASSERT((!is_convertible<mode, output>::value)); \
- BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, is, helper, has_return); } \
- template<typename CharType, typename TraitsType> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(::std::basic_ostream<CharType, TraitsType>& os BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_STATIC_ASSERT((!is_convertible<mode, input>::value)); \
- BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, os, helper, has_return); } \
- template<typename CharType, typename TraitsType> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(::std::basic_iostream<CharType, TraitsType>& io BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, io, helper, has_return); } \
- template<typename Iter> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(const iterator_range<Iter>& rng BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_PP_EXPR_IF(has_return, return) \
- this->helper( ::boost::iostreams::detail::range_adapter< \
- mode, iterator_range<Iter> \
- >(rng) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); } \
- template<typename Pipeline, typename Concept> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(const ::boost::iostreams::pipeline<Pipeline, Concept>& p) \
- { p.push(*this); } \
- template<typename T> \
- BOOST_PP_IIF(has_return, result, explicit) \
- name(const T& t BOOST_IOSTREAMS_PUSH_PARAMS() BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)) \
- { this->helper( ::boost::iostreams::detail::resolve<mode, ch>(t) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); } \
- /**/
-# else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# define BOOST_IOSTREAMS_DEFINE_PUSH_IMPL(name, mode, ch, helper, has_return, result) \
- BOOST_PP_IF(has_return, result, explicit) \
- name(::std::streambuf& sb BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, sb, helper, has_return); } \
- BOOST_PP_IF(has_return, result, explicit) \
- name(::std::istream& is BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_STATIC_ASSERT((!is_convertible<mode, output>::value)); \
- BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, is, helper, has_return); } \
- BOOST_PP_IF(has_return, result, explicit) \
- name(::std::ostream& os BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_STATIC_ASSERT((!is_convertible<mode, input>::value)); \
- BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, os, helper, has_return); } \
- BOOST_PP_IF(has_return, result, explicit) \
- name(::std::iostream& io BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_IOSTREAMS_ADAPT_STREAM(mode, ch, io, helper, has_return); } \
- template<typename Iter> \
- BOOST_PP_IF(has_return, result, explicit) \
- name(const iterator_range<Iter>& rng BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { BOOST_PP_EXPR_IF(has_return, return) \
- this->helper( ::boost::iostreams::detail::range_adapter< \
- mode, iterator_range<Iter> \
- >(rng) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); } \
- template<typename Pipeline, typename Concept> \
- BOOST_PP_IF(has_return, result, explicit) \
- name(const ::boost::iostreams::pipeline<Pipeline, Concept>& p) \
- { p.push(*this); } \
- template<typename T> \
- BOOST_PP_EXPR_IF(has_return, result) \
- name(const T& t BOOST_IOSTREAMS_PUSH_PARAMS() BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)) \
- { this->helper( ::boost::iostreams::detail::resolve<mode, ch>(t) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); } \
- /**/
-# endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-#else // #if VC6, VC7.0, Borland 5.x
-# define BOOST_IOSTREAMS_DEFINE_PUSH_IMPL(name, mode, ch, helper, has_return, result) \
- template<typename T> \
- void BOOST_PP_CAT(name, _msvc_impl) \
- ( ::boost::mpl::true_, const T& t BOOST_IOSTREAMS_PUSH_PARAMS() ) \
- { t.push(*this); } \
- template<typename T> \
- void BOOST_PP_CAT(name, _msvc_impl) \
- ( ::boost::mpl::false_, const T& t BOOST_IOSTREAMS_PUSH_PARAMS() ) \
- { this->helper( ::boost::iostreams::detail::resolve<mode, ch>(t) \
- BOOST_IOSTREAMS_PUSH_ARGS() ); } \
- template<typename T> \
- BOOST_PP_IF(has_return, result, explicit) \
- name(const T& t BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { \
- this->BOOST_PP_CAT(name, _msvc_impl) \
- ( ::boost::iostreams::detail::is_pipeline<T>(), \
- t BOOST_IOSTREAMS_PUSH_ARGS() ); \
- } \
- /**/
-#endif // #if VC6, VC7.0, Borland 5.x
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_PUSH_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_PUSH_PARAMS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_PUSH_PARAMS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#define BOOST_IOSTREAMS_PUSH_PARAMS() \
- , int buffer_size = -1 , int pback_size = -1 \
- /**/
-
-#define BOOST_IOSTREAMS_PUSH_ARGS() , buffer_size, pback_size
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_PUSH_PARAMS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // partial spec, put size_t in std.
-#include <cstddef> // std::size_t.
-#include <boost/detail/is_incrementable.hpp>
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/adapter/mode_adapter.hpp>
-#include <boost/iostreams/detail/adapter/output_iterator_adapter.hpp>
-#include <boost/iostreams/detail/adapter/range_adapter.hpp>
-#include <boost/iostreams/detail/config/gcc.hpp>
-#include <boost/iostreams/detail/config/overload_resolution.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/enable_if_stream.hpp>
-#include <boost/iostreams/detail/is_dereferenceable.hpp>
-#include <boost/iostreams/detail/is_iterator_range.hpp>
-#include <boost/iostreams/detail/select.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/device/array.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/bool.hpp> // true_.
-#include <boost/mpl/if.hpp>
-#include <boost/range/iterator_range.hpp>
-#include <boost/type_traits/is_array.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // VC7.1 C4224.
-
-namespace boost { namespace iostreams { namespace detail {
-
-//------------------Definition of resolve-------------------------------------//
-
-#ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //-------------------------//
-
-template<typename Mode, typename Ch, typename T>
-struct resolve_traits {
- typedef typename
- mpl::if_<
- boost::detail::is_incrementable<T>,
- output_iterator_adapter<Mode, Ch, T>,
- const T&
- >::type type;
-};
-
-# ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-------------------------------//
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve( const T& t
- BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)
-
- // I suspect that the compilers which require this workaround may
- // be correct, but I'm not sure why :(
- #if BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION, BOOST_TESTED_AT(810)) ||\
- BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3205)) || \
- BOOST_WORKAROUND(BOOST_IOSTREAMS_GCC, BOOST_TESTED_AT(400)) \
- /**/
- , typename disable_if< is_iterator_range<T> >::type* = 0
- #endif
- )
-{
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(t);
-}
-
-template<typename Mode, typename Ch, typename Tr>
-mode_adapter< Mode, std::basic_streambuf<Ch, Tr> >
-resolve(std::basic_streambuf<Ch, Tr>& sb)
-{ return mode_adapter< Mode, std::basic_streambuf<Ch, Tr> >(wrap(sb)); }
-
-template<typename Mode, typename Ch, typename Tr>
-mode_adapter< Mode, std::basic_istream<Ch, Tr> >
-resolve(std::basic_istream<Ch, Tr>& is)
-{ return mode_adapter< Mode, std::basic_istream<Ch, Tr> >(wrap(is)); }
-
-template<typename Mode, typename Ch, typename Tr>
-mode_adapter< Mode, std::basic_ostream<Ch, Tr> >
-resolve(std::basic_ostream<Ch, Tr>& os)
-{ return mode_adapter< Mode, std::basic_ostream<Ch, Tr> >(wrap(os)); }
-
-template<typename Mode, typename Ch, typename Tr>
-mode_adapter< Mode, std::basic_iostream<Ch, Tr> >
-resolve(std::basic_iostream<Ch, Tr>& io)
-{ return mode_adapter< Mode, std::basic_iostream<Ch, Tr> >(wrap(io)); }
-
-template<typename Mode, typename Ch, std::size_t N>
-array_adapter<Mode, Ch> resolve(Ch (&array)[N])
-{ return array_adapter<Mode, Ch>(array); }
-
-template<typename Mode, typename Ch, typename Iter>
-range_adapter< Mode, boost::iterator_range<Iter> >
-resolve(const boost::iterator_range<Iter>& rng)
-{ return range_adapter< Mode, boost::iterator_range<Iter> >(rng); }
-
-# else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //---------------------//
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve( const T& t
- BOOST_IOSTREAMS_DISABLE_IF_STREAM(T)
- #if defined(__GNUC__)
- , typename disable_if< is_iterator_range<T> >::type* = 0
- #endif
- )
-{
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(t);
-}
-
-template<typename Mode, typename Ch>
-mode_adapter<Mode, std::streambuf>
-resolve(std::streambuf& sb)
-{ return mode_adapter<Mode, std::streambuf>(wrap(sb)); }
-
-template<typename Mode, typename Ch>
-mode_adapter<Mode, std::istream>
-resolve(std::istream& is)
-{ return mode_adapter<Mode, std::istream>(wrap(is)); }
-
-template<typename Mode, typename Ch>
-mode_adapter<Mode, std::ostream>
-resolve(std::ostream& os)
-{ return mode_adapter<Mode, std::ostream>(wrap(os)); }
-
-template<typename Mode, typename Ch>
-mode_adapter<Mode, std::iostream>
-resolve(std::iostream& io)
-{ return mode_adapter<Mode, std::iostream>(wrap(io)); }
-
-template<typename Mode, typename Ch, std::size_t N>
-array_adapter<Mode, Ch> resolve(Ch (&array)[N])
-{ return array_adapter<Mode, Ch>(array); }
-
-template<typename Mode, typename Ch, typename Iter>
-range_adapter< Mode, boost::iterator_range<Iter> >
-resolve(const boost::iterator_range<Iter>& rng)
-{ return range_adapter< Mode, boost::iterator_range<Iter> >(rng); }
-
-# endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------//
-#else // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //----------------//
-
-template<typename Mode, typename Ch, typename T>
-struct resolve_traits {
- // Note: test for is_iterator_range must come before test for output
- // iterator.
- typedef typename
- iostreams::select< // Disambiguation for Tru64.
- is_std_io<T>,
- mode_adapter<Mode, T>,
- is_iterator_range<T>,
- range_adapter<Mode, T>,
- is_dereferenceable<T>,
- output_iterator_adapter<Mode, Ch, T>,
- is_array<T>,
- array_adapter<Mode, T>,
- else_,
- #if !BOOST_WORKAROUND(__BORLANDC__, < 0x600)
- const T&
- #else
- T
- #endif
- >::type type;
-};
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(const T& t, mpl::true_)
-{ // Bad overload resolution.
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(wrap(const_cast<T&>(t)));
-}
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(const T& t, mpl::false_)
-{
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(t);
-}
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(const T& t BOOST_IOSTREAMS_DISABLE_IF_STREAM(T))
-{ return resolve<Mode, Ch>(t, is_std_io<T>()); }
-
-# if !BOOST_WORKAROUND(__BORLANDC__, < 0x600) && \
- !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && \
- !defined(__GNUC__) // ---------------------------------------------------//
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(T& t, mpl::true_)
-{
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(wrap(t));
-}
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(T& t, mpl::false_)
-{
- typedef typename resolve_traits<Mode, Ch, T>::type return_type;
- return return_type(t);
-}
-
-template<typename Mode, typename Ch, typename T>
-typename resolve_traits<Mode, Ch, T>::type
-resolve(T& t BOOST_IOSTREAMS_ENABLE_IF_STREAM(T))
-{ return resolve<Mode, Ch>(t, is_std_io<T>()); }
-
-# endif // Borland 5.x, VC6-7.0 or GCC 2.9x //--------------------------------//
-#endif // #ifndef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION //---------------//
-
-} } } // End namespaces detail, iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // VC7.1 4224.
-
-#endif // BOOST_IOSTREAMS_DETAIL_RESOLVE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains the metafunction select, which mimics the effect of a chain of
-// nested mpl if_'s.
-//
-// -----------------------------------------------------------------------------
-//
-// Usage:
-//
-// typedef typename select<
-// case1, type1,
-// case2, type2,
-// ...
-// true_, typen
-// >::type selection;
-//
-// Here case1, case2, ... are models of MPL::IntegralConstant with value type
-// bool, and n <= 10.
-
-#ifndef BOOST_IOSTREAMS_SELECT_HPP_INCLUDED
-#define BOOST_IOSTREAMS_SELECT_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/type_traits/is_base_and_derived.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/mpl/void.hpp>
-
-namespace boost { namespace iostreams {
-
-typedef mpl::true_ else_;
-
-template< typename Case1 = mpl::true_,
- typename Type1 = mpl::void_,
- typename Case2 = mpl::true_,
- typename Type2 = mpl::void_,
- typename Case3 = mpl::true_,
- typename Type3 = mpl::void_,
- typename Case4 = mpl::true_,
- typename Type4 = mpl::void_,
- typename Case5 = mpl::true_,
- typename Type5 = mpl::void_,
- typename Case6 = mpl::true_,
- typename Type6 = mpl::void_,
- typename Case7 = mpl::true_,
- typename Type7 = mpl::void_,
- typename Case8 = mpl::true_,
- typename Type8 = mpl::void_,
- typename Case9 = mpl::true_,
- typename Type9 = mpl::void_,
- typename Case10 = mpl::true_,
- typename Type10 = mpl::void_ >
-struct select {
- typedef typename
- mpl::eval_if<
- Case1, mpl::identity<Type1>, mpl::eval_if<
- Case2, mpl::identity<Type2>, mpl::eval_if<
- Case3, mpl::identity<Type3>, mpl::eval_if<
- Case4, mpl::identity<Type4>, mpl::eval_if<
- Case5, mpl::identity<Type5>, mpl::eval_if<
- Case6, mpl::identity<Type6>, mpl::eval_if<
- Case7, mpl::identity<Type7>, mpl::eval_if<
- Case8, mpl::identity<Type8>, mpl::eval_if<
- Case9, mpl::identity<Type9>, mpl::if_<
- Case10, Type10, mpl::void_ > > > > > > > > >
- >::type type;
-};
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_SELECT_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2004.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-//
-// Intended as an alternative to type_traits::yes_type and type_traits::no_type.
-// Provides an arbitrary number of types (case_<0>, case_<1>, ...) for
-// determining the results of overload resultion using 'sizeof', plus a uniform
-// means of using the result. yes_type and no_type are typedefs for case_<1>
-// and case_<0>. A single case with negative argument, case_<-1>, is also
-// provided, for convenience.
-//
-// This header may be included any number of times, with
-// BOOST_SELECT_BY_SIZE_MAX_CASE defined to be the largest N such that case_<N>
-// is needed for a particular application. It defaults to 20.
-//
-// This header depends only on Boost.Config and Boost.Preprocessor. Dependence
-// on Type Traits or MPL was intentionally avoided, to leave open the
-// possibility that select_by_size could be used by these libraries.
-//
-// Example usage:
-//
-// #define BOOST_SELECT_BY_SIZE_MAX_CASE 7 // (Needed when default was 2)
-// #include <boost/utility/select_by_size.hpp>
-//
-// using namespace boost::utility;
-//
-// case_<0> helper(bool);
-// case_<1> helper(int);
-// case_<2> helper(unsigned);
-// case_<3> helper(long);
-// case_<4> helper(unsigned long);
-// case_<5> helper(float);
-// case_<6> helper(double);
-// case_<7> helper(const char*);
-//
-// struct test {
-// static const int value =
-// select_by_size< sizeof(helper(9876UL)) >::value;
-// BOOST_STATIC_ASSERT(value == 4);
-// };
-//
-// For compilers with integral constant expression problems, e.g. Borland 5.x,
-// one can also write
-//
-// struct test {
-// BOOST_SELECT_BY_SIZE(int, value, helper(9876UL));
-// };
-//
-// to define a static integral constant 'value' equal to
-//
-// select_by_size< sizeof(helper(9876UL)) >::value.
-//
-
-// Include guards surround all contents of this header except for explicit
-// specializations of select_by_size for case_<N> with N > 2.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_SELECT_BY_SIZE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_SELECT_BY_SIZE_HPP_INCLUDED
-
-// The lowest N for which select_by_size< sizeof(case_<N>) > has not been
-// specialized.
-#define SELECT_BY_SIZE_MAX_SPECIALIZED 20
-
-#include <boost/config.hpp> // BOOST_STATIC_CONSTANT.
-#include <boost/preprocessor/cat.hpp>
-#include <boost/preprocessor/iteration/local.hpp>
-
-/* Alternative implementation using max_align.
-
-#include <boost/type_traits/alignment_of.hpp>
-#include <boost/type_traits/type_with_alignment.hpp>
-
-namespace boost { namespace utility {
-
-template<int N>
-struct case_ { char c[(N + 1) * alignment_of<detail::max_align>::value]; };
-
-template<unsigned Size>
-struct select_by_size {
- BOOST_STATIC_CONSTANT(int, value =
- (Size / alignment_of<detail::max_align>::value - 1));
-};
-
-} } // End namespaces utility, boost.
-
-*/ // End alternate implementation.
-
-namespace boost { namespace iostreams { namespace detail {
-
-//--------------Definition of case_-------------------------------------------//
-
-template<int N> struct case_ { char c1; case_<N - 1> c2; };
-template<> struct case_<-1> { char c; };
-typedef case_<true> yes_type;
-typedef case_<false> no_type;
-
-//--------------Declaration of select_by_size---------------------------------//
-
-template<unsigned Size> struct select_by_size;
-
-} } } // End namespaces detail, iostreams, boost.
-
-//--------------Definition of SELECT_BY_SIZE_SPEC-----------------------------//
-
-// Sepecializes select_by_size for sizeof(case<n-1>). The decrement is used
-// here because the preprocessor library doesn't handle negative integers.
-#define SELECT_BY_SIZE_SPEC(n) \
- namespace boost { namespace iostreams { namespace detail { \
- static const int BOOST_PP_CAT(sizeof_case_, n) = sizeof(case_<n - 1>); \
- template<> \
- struct select_by_size< BOOST_PP_CAT(sizeof_case_, n) > { \
- struct type { BOOST_STATIC_CONSTANT(int, value = n - 1); }; \
- BOOST_STATIC_CONSTANT(int, value = type::value); \
- }; \
- } } } \
- /**/
-
-//--------------Default specializations of select_by_size---------------------//
-
-#define BOOST_PP_LOCAL_MACRO(n) SELECT_BY_SIZE_SPEC(n)
-#define BOOST_PP_LOCAL_LIMITS (0, 20)
-#include BOOST_PP_LOCAL_ITERATE()
-#undef BOOST_PP_LOCAL_MACRO
-
-//--------------Definition of SELECT_BY_SIZE----------------------------------//
-
-#define BOOST_SELECT_BY_SIZE(type_, name, expr) \
- BOOST_STATIC_CONSTANT( \
- unsigned, \
- BOOST_PP_CAT(boost_select_by_size_temp_, name) = sizeof(expr) \
- ); \
- BOOST_STATIC_CONSTANT( \
- type_, \
- name = \
- ( ::boost::iostreams::detail::select_by_size< \
- BOOST_PP_CAT(boost_select_by_size_temp_, name) \
- >::value ) \
- ) \
- /**/
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_SELECT_BY_SIZE_HPP_INCLUDED
-
-//----------Specializations of SELECT_BY_SIZE (outside main inclued guards)---//
-
-#if BOOST_SELECT_BY_SIZE_MAX_CASE > SELECT_BY_SIZE_MAX_SPECIALIZED
-
-#define BOOST_PP_LOCAL_MACRO(n) SELECT_BY_SIZE_SPEC(n)
-#define BOOST_PP_LOCAL_LIMITS \
- (SELECT_BY_SIZE_MAX_SPECIALIZED, BOOST_SELECT_BY_SIZE_MAX_CASE) \
- /**/
-#include BOOST_PP_LOCAL_ITERATE()
-#undef BOOST_PP_LOCAL_MACRO
-#undef SELECT_BY_SIZE_MAX_SPECIALIZED
-#define SELECT_BY_SIZE_MAX_SPECIALIZED BOOST_SELECT_BY_SIZE_MAX_CASE
-
-#endif
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_STREAMBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_STREAMBUF_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# include <streambuf>
-#else
-# include <streambuf.h>
-#endif
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
-# define BOOST_IOSTREAMS_BASIC_STREAMBUF(ch, tr) std::basic_streambuf< ch, tr >
-# define BOOST_IOSTREAMS_PUBSYNC pubsync
-# define BOOST_IOSTREAMS_PUBSEEKOFF pubseekoff
-# define BOOST_IOSTREAMS_PUBSEEKPOS pubseekpos
-#else
-# define BOOST_IOSTREAMS_BASIC_STREAMBUF(ch, tr) std::streambuf
-# define BOOST_IOSTREAMS_PUBSYNC sync
-# define BOOST_IOSTREAMS_PUBSEEKOFF seekoff
-# define BOOST_IOSTREAMS_PUBSEEKPOS seekpos
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_STREAMBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_CHAINBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_CHAINBUF_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC, template friends.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/chain.hpp>
-#include <boost/iostreams/detail/access_control.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/streambuf/linked_streambuf.hpp>
-#include <boost/iostreams/detail/translate_int_type.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/noncopyable.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-//--------------Definition of chainbuf----------------------------------------//
-
-//
-// Template name: chainbuf.
-// Description: Stream buffer which operates by delegating to the first
-// linked_streambuf in a chain.
-// Template paramters:
-// Chain - The chain type.
-//
-template<typename Chain, typename Mode, typename Access>
-class chainbuf
- : public BOOST_IOSTREAMS_BASIC_STREAMBUF(
- typename Chain::char_type,
- typename Chain::traits_type
- ),
- public access_control<typename Chain::client_type, Access>,
- private noncopyable
-{
-private:
- typedef access_control<chain_client<Chain>, Access> client_type;
-public:
- typedef typename Chain::char_type char_type;
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(typename Chain::traits_type)
-protected:
- typedef linked_streambuf<char_type, traits_type> delegate_type;
- chainbuf() { client_type::set_chain(&chain_); }
- int_type underflow()
- { sentry t(this); return translate(delegate().underflow()); }
- int_type pbackfail(int_type c)
- { sentry t(this); return translate(delegate().pbackfail(c)); }
- std::streamsize xsgetn(char_type* s, std::streamsize n)
- { sentry t(this); return delegate().xsgetn(s, n); }
- int_type overflow(int_type c)
- { sentry t(this); return translate(delegate().overflow(c)); }
- std::streamsize xsputn(const char_type* s, std::streamsize n)
- { sentry t(this); return delegate().xsputn(s, n); }
- int sync() { sentry t(this); return delegate().sync(); }
- pos_type seekoff( off_type off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which =
- BOOST_IOS::in | BOOST_IOS::out )
- { sentry t(this); return delegate().seekoff(off, way, which); }
- pos_type seekpos( pos_type sp,
- BOOST_IOS::openmode which =
- BOOST_IOS::in | BOOST_IOS::out )
- { sentry t(this); return delegate().seekpos(sp, which); }
-protected:
- typedef BOOST_IOSTREAMS_BASIC_STREAMBUF(
- typename Chain::char_type,
- typename Chain::traits_type
- ) base_type;
-//#if !BOOST_WORKAROUND(__GNUC__, == 2)
-// BOOST_IOSTREAMS_USING_PROTECTED_STREAMBUF_MEMBERS(base_type)
-//#endif
-private:
-
- // Translate from std int_type to chain's int_type.
- typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type) std_traits;
- typedef typename Chain::traits_type chain_traits;
- static typename chain_traits::int_type
- translate(typename std_traits::int_type c)
- { return translate_int_type<std_traits, chain_traits>(c); }
-
- delegate_type& delegate()
- { return static_cast<delegate_type&>(chain_.front()); }
- void get_pointers()
- {
- this->setg(delegate().eback(), delegate().gptr(), delegate().egptr());
- this->setp(delegate().pbase(), delegate().epptr());
- this->pbump((int) (delegate().pptr() - delegate().pbase()));
- }
- void set_pointers()
- {
- delegate().setg(this->eback(), this->gptr(), this->egptr());
- delegate().setp(this->pbase(), this->epptr());
- delegate().pbump((int) (this->pptr() - this->pbase()));
- }
- struct sentry {
- sentry(chainbuf<Chain, Mode, Access>* buf) : buf_(buf)
- { buf_->set_pointers(); }
- ~sentry() { buf_->get_pointers(); }
- chainbuf<Chain, Mode, Access>* buf_;
- };
- friend struct sentry;
- Chain chain_;
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_CHAINBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_DIRECT_STREAMBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_DIRECT_STREAMBUF_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cassert>
-#include <cstddef>
-#include <typeinfo>
-#include <utility> // pair.
-#include <boost/config.hpp> // BOOST_DEDUCED_TYPENAME.
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/ios.hpp>
-#include <boost/iostreams/detail/optional.hpp>
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/streambuf/linked_streambuf.hpp>
-#include <boost/iostreams/detail/error.hpp>
-#include <boost/iostreams/operations.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/iostreams/traits.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template< typename T,
- typename Tr =
- BOOST_IOSTREAMS_CHAR_TRAITS(
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type
- ) >
-class direct_streambuf
- : public linked_streambuf<BOOST_DEDUCED_TYPENAME char_type_of<T>::type, Tr>
-{
-public:
- typedef typename char_type_of<T>::type char_type;
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
-private:
- typedef linked_streambuf<char_type, traits_type> base_type;
- typedef typename category_of<T>::type category;
- typedef BOOST_IOSTREAMS_BASIC_STREAMBUF(
- char_type, traits_type
- ) streambuf_type;
-public: // stream needs access.
- void open(const T& t, int buffer_size, int pback_size);
- bool is_open() const;
- void close();
- bool auto_close() const { return auto_close_; }
- void set_auto_close(bool close) { auto_close_ = close; }
- bool strict_sync() { return true; }
-
- // Declared in linked_streambuf.
- T* component() { return storage_.get(); }
-protected:
-#if !BOOST_WORKAROUND(__GNUC__, == 2)
- BOOST_IOSTREAMS_USING_PROTECTED_STREAMBUF_MEMBERS(base_type)
-#endif
- direct_streambuf();
-
- //--------------Virtual functions-----------------------------------------//
-
- // Declared in linked_streambuf.
- void close(BOOST_IOS::openmode m);
- const std::type_info& component_type() const { return typeid(T); }
- void* component_impl() { return component(); }
-
-#ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
- public:
-#endif
-
- // Declared in basic_streambuf.
- int_type underflow();
- int_type pbackfail(int_type c);
- int_type overflow(int_type c);
- pos_type seekoff( off_type off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which );
- pos_type seekpos(pos_type sp, BOOST_IOS::openmode which);
-private:
- pos_type seek_impl( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which );
- void init_input(any_tag) { }
- void init_input(input);
- void init_output(any_tag) { }
- void init_output(output);
- void init_get_area();
- void init_put_area();
- bool one_head() const;
- bool two_head() const;
- optional<T> storage_;
- char_type *ibeg_, *iend_, *obeg_, *oend_;
- bool auto_close_;
-};
-
-//------------------Implementation of direct_streambuf------------------------//
-
-template<typename T, typename Tr>
-direct_streambuf<T, Tr>::direct_streambuf()
- : ibeg_(0), iend_(0), obeg_(0), oend_(0), auto_close_(true)
-{ this->set_true_eof(true); }
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::open(const T& t, int, int)
-{
- storage_.reset(t);
- init_input(category());
- init_output(category());
- setg(0, 0, 0);
- setp(0, 0);
-}
-
-template<typename T, typename Tr>
-bool direct_streambuf<T, Tr>::is_open() const
-{ return ibeg_ != 0 && !obeg_ != 0; }
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::close()
-{
- using namespace std;
- try { close(BOOST_IOS::in); } catch (std::exception&) { }
- try { close(BOOST_IOS::out); } catch (std::exception&) { }
- storage_.reset();
-}
-
-template<typename T, typename Tr>
-typename direct_streambuf<T, Tr>::int_type
-direct_streambuf<T, Tr>::underflow()
-{
- if (!ibeg_)
- throw cant_read();
- if (!gptr())
- init_get_area();
- return gptr() != iend_ ?
- traits_type::to_int_type(*gptr()) :
- traits_type::eof();
-}
-
-template<typename T, typename Tr>
-typename direct_streambuf<T, Tr>::int_type
-direct_streambuf<T, Tr>::pbackfail(int_type c)
-{
- using namespace std;
- if (!ibeg_)
- throw cant_read();
- if (gptr() != 0 && gptr() != ibeg_) {
- gbump(-1);
- if (!traits_type::eq_int_type(c, traits_type::eof()))
- *gptr() = traits_type::to_char_type(c);
- return traits_type::not_eof(c);
- }
- throw bad_putback();
-}
-
-template<typename T, typename Tr>
-typename direct_streambuf<T, Tr>::int_type
-direct_streambuf<T, Tr>::overflow(int_type c)
-{
- using namespace std;
- if (!obeg_) throw BOOST_IOSTREAMS_FAILURE("no write access");
- if (!pptr()) init_put_area();
- if (!traits_type::eq_int_type(c, traits_type::eof())) {
- if (pptr() == oend_)
- throw BOOST_IOSTREAMS_FAILURE("write area exhausted");
- *pptr() = traits_type::to_char_type(c);
- pbump(1);
- return c;
- }
- return traits_type::not_eof(c);
-}
-
-template<typename T, typename Tr>
-inline typename direct_streambuf<T, Tr>::pos_type
-direct_streambuf<T, Tr>::seekoff
- (off_type off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which)
-{ return seek_impl(off, way, which); }
-
-template<typename T, typename Tr>
-inline typename direct_streambuf<T, Tr>::pos_type
-direct_streambuf<T, Tr>::seekpos
- (pos_type sp, BOOST_IOS::openmode)
-{
- return seek_impl( position_to_offset(sp), BOOST_IOS::beg,
- BOOST_IOS::in | BOOST_IOS::out );
-}
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::close(BOOST_IOS::openmode which)
-{
- if (which == BOOST_IOS::in && ibeg_ != 0) {
- setg(0, 0, 0);
- ibeg_ = iend_ = 0;
- }
- if (which == BOOST_IOS::out && obeg_ != 0) {
- sync();
- setp(0, 0);
- obeg_ = oend_ = 0;
- }
- boost::iostreams::close(*storage_, which);
-}
-
-template<typename T, typename Tr>
-typename direct_streambuf<T, Tr>::pos_type direct_streambuf<T, Tr>::seek_impl
- (stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which)
-{
- using namespace std;
- BOOST_IOS::openmode both = BOOST_IOS::in | BOOST_IOS::out;
- if (two_head() && (which & both) == both)
- throw bad_seek();
- stream_offset result = -1;
- bool one = one_head();
- if (one && (pptr() != 0 || gptr()== 0))
- init_get_area(); // Switch to input mode, for code reuse.
- if (one || (which & BOOST_IOS::in) != 0 && ibeg_ != 0) {
- if (!gptr()) setg(ibeg_, ibeg_, iend_);
- ptrdiff_t next = 0;
- switch (way) {
- case BOOST_IOS::beg: next = off; break;
- case BOOST_IOS::cur: next = (gptr() - ibeg_) + off; break;
- case BOOST_IOS::end: next = (iend_ - ibeg_) + off; break;
- default: assert(0);
- }
- if (next < 0 || next > (iend_ - ibeg_))
- throw bad_seek();
- setg(ibeg_, ibeg_ + next, iend_);
- result = next;
- }
- if (!one && (which & BOOST_IOS::out) != 0 && obeg_ != 0) {
- if (!pptr()) setp(obeg_, oend_);
- ptrdiff_t next = 0;
- switch (way) {
- case BOOST_IOS::beg: next = off; break;
- case BOOST_IOS::cur: next = (pptr() - obeg_) + off; break;
- case BOOST_IOS::end: next = (oend_ - obeg_) + off; break;
- default: assert(0);
- }
- if (next < 0 || next > (oend_ - obeg_))
- throw bad_seek();
- pbump(static_cast<int>(next - (pptr() - obeg_)));
- result = next;
- }
- return offset_to_position(result);
-}
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::init_input(input)
-{
- std::pair<char_type*, char_type*> p = input_sequence(*storage_);
- ibeg_ = p.first;
- iend_ = p.second;
-}
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::init_output(output)
-{
- std::pair<char_type*, char_type*> p = output_sequence(*storage_);
- obeg_ = p.first;
- oend_ = p.second;
-}
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::init_get_area()
-{
- setg(ibeg_, ibeg_, iend_);
- if (one_head() && pptr()) {
- gbump(static_cast<int>(pptr() - obeg_));
- setp(0, 0);
- }
-}
-
-template<typename T, typename Tr>
-void direct_streambuf<T, Tr>::init_put_area()
-{
- setp(obeg_, oend_);
- if (one_head() && gptr()) {
- pbump(static_cast<int>(gptr() - ibeg_));
- setg(0, 0, 0);
- }
-}
-
-template<typename T, typename Tr>
-inline bool direct_streambuf<T, Tr>::one_head() const
-{ return ibeg_ && obeg_ && ibeg_ == obeg_; }
-
-template<typename T, typename Tr>
-inline bool direct_streambuf<T, Tr>::two_head() const
-{ return ibeg_ && obeg_ && ibeg_ != obeg_; }
-
-//----------------------------------------------------------------------------//
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_DIRECT_STREAMBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// This material is heavily indebted to the discussion and code samples in
-// A. Langer and K. Kreft, "Standard C++ IOStreams and Locales",
-// Addison-Wesley, 2000, pp. 228-43.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_INDIRECT_STREAMBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_INDIRECT_STREAMBUF_HPP_INCLUDED
-
-#include <algorithm> // min, max.
-#include <cassert>
-#include <exception>
-#include <typeinfo>
-#include <boost/config.hpp> // Member template friends.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/constants.hpp>
-#include <boost/iostreams/detail/adapter/concept_adapter.hpp>
-#include <boost/iostreams/detail/buffer.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/double_object.hpp>
-#include <boost/iostreams/detail/ios.hpp>
-#include <boost/iostreams/detail/optional.hpp>
-#include <boost/iostreams/detail/push.hpp>
-#include <boost/iostreams/detail/streambuf/linked_streambuf.hpp>
-#include <boost/iostreams/operations.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/operations.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC, BCC 5.x
-
-namespace boost { namespace iostreams { namespace detail {
-
-//
-// Description: The implementation of basic_streambuf used by chains.
-//
-template<typename T, typename Tr, typename Alloc, typename Mode>
-class indirect_streambuf
- : public linked_streambuf<BOOST_DEDUCED_TYPENAME char_type_of<T>::type, Tr>
-{
-public:
- typedef typename char_type_of<T>::type char_type;
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
-private:
- typedef typename category_of<T>::type category;
- typedef concept_adapter<T> wrapper;
- typedef detail::basic_buffer<char_type, Alloc> buffer_type;
- typedef indirect_streambuf<T, Tr, Alloc, Mode> my_type;
- typedef detail::linked_streambuf<char_type, traits_type> base_type;
- typedef linked_streambuf<char_type, Tr> streambuf_type;
-public:
- indirect_streambuf();
-
- void open(const T& t BOOST_IOSTREAMS_PUSH_PARAMS());
- bool is_open() const;
- void close();
- bool auto_close() const;
- void set_auto_close(bool close);
- bool strict_sync();
-
- // Declared in linked_streambuf.
- T* component() { return &*obj(); }
-protected:
-#if !BOOST_WORKAROUND(__GNUC__, == 2)
- BOOST_IOSTREAMS_USING_PROTECTED_STREAMBUF_MEMBERS(base_type)
-#endif
-
- //----------virtual functions---------------------------------------------//
-
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
- void imbue(const std::locale& loc);
-#endif
-#ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
- public:
-#endif
- int_type underflow();
- int_type pbackfail(int_type c);
- int_type overflow(int_type c);
- int sync();
- pos_type seekoff( off_type off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which );
- pos_type seekpos(pos_type sp, BOOST_IOS::openmode which);
-
- // Declared in linked_streambuf.
- void set_next(streambuf_type* next);
- void close(BOOST_IOS::openmode m);
- const std::type_info& component_type() const { return typeid(T); }
- void* component_impl() { return component(); }
-private:
-
- //----------Accessor functions--------------------------------------------//
-
- wrapper& obj() { return *storage_; }
- streambuf_type* next() const { return next_; }
- buffer_type& in() { return buffer_.first(); }
- buffer_type& out() { return buffer_.second(); }
- bool can_read() const { return is_convertible<Mode, input>::value; }
- bool can_write() const { return is_convertible<Mode, output>::value; }
- bool output_buffered() const { return (flags_ & f_output_buffered) != 0; }
- bool shared_buffer() const { return is_convertible<Mode, seekable>::value; }
- void set_flags(int f) { flags_ = f; }
-
- //----------State changing functions--------------------------------------//
-
- virtual void init_get_area();
- virtual void init_put_area();
-
- //----------Utility function----------------------------------------------//
-
- pos_type seek_impl( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which );
- void sync_impl();
- void close_impl(BOOST_IOS::openmode);
-
- enum flag_type {
- f_open = 1,
- f_input_closed = f_open << 1,
- f_output_closed = f_input_closed << 1,
- f_output_buffered = f_output_closed << 1,
- f_auto_close = f_output_buffered << 1
- };
-
- optional<wrapper> storage_;
- streambuf_type* next_;
- double_object<
- buffer_type,
- is_convertible<
- Mode,
- two_sequence
- >
- > buffer_;
- std::streamsize pback_size_;
- int flags_;
-};
-
-//--------------Implementation of indirect_streambuf--------------------------//
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-indirect_streambuf<T, Tr, Alloc, Mode>::indirect_streambuf()
- : next_(0), pback_size_(0), flags_(f_auto_close) { }
-
-//--------------Implementation of open, is_open and close---------------------//
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::open
- (const T& t, int buffer_size, int pback_size)
-{
- using namespace std;
-
- // Normalize buffer sizes.
- buffer_size =
- (buffer_size != -1) ?
- buffer_size :
- iostreams::optimal_buffer_size(t);
- pback_size =
- (pback_size != -1) ?
- pback_size :
- default_pback_buffer_size;
-
- // Construct input buffer.
- if (can_read()) {
- pback_size_ = (std::max)(2, pback_size); // STLPort needs 2.
- streamsize size =
- pback_size_ +
- ( buffer_size ? buffer_size: 1 );
- in().resize(size);
- if (!shared_buffer())
- init_get_area();
- }
-
- // Construct output buffer.
- if (can_write() && !shared_buffer()) {
- if (buffer_size != 0)
- out().resize(buffer_size);
- init_put_area();
- }
-
- storage_.reset(wrapper(t));
- flags_ |= f_open;
- if (can_write() && buffer_size > 1)
- flags_ |= f_output_buffered;
- this->set_true_eof(false);
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline bool indirect_streambuf<T, Tr, Alloc, Mode>::is_open() const
-{ return (flags_ & f_open) != 0; }
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::close()
-{
- using namespace std;
- try { close(BOOST_IOS::in); } catch (std::exception&) { }
- try { close(BOOST_IOS::out); } catch (std::exception&) { }
- storage_.reset();
- flags_ = 0;
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-bool indirect_streambuf<T, Tr, Alloc, Mode>::auto_close() const
-{ return (flags_ & f_auto_close) != 0; }
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::set_auto_close(bool close)
-{ flags_ = (flags_ & ~f_auto_close) | (close ? f_auto_close : 0); }
-
-//--------------Implementation virtual functions------------------------------//
-
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::imbue(const std::locale& loc)
-{
- if (is_open()) {
- obj().imbue(loc);
- if (next_)
- next_->pubimbue(loc);
- }
-}
-#endif
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-typename indirect_streambuf<T, Tr, Alloc, Mode>::int_type
-indirect_streambuf<T, Tr, Alloc, Mode>::underflow()
-{
- using namespace std;
- if (!gptr()) init_get_area();
- buffer_type& buf = in();
- if (gptr() < egptr()) return traits_type::to_int_type(*gptr());
-
- // Fill putback buffer.
- streamsize keep = (std::min)( static_cast<streamsize>(gptr() - eback()),
- pback_size_ );
- if (keep)
- traits_type::move( buf.data() + (pback_size_ - keep),
- gptr() - keep, keep );
-
- // Set pointers to reasonable values in case read throws.
- setg( buf.data() + pback_size_ - keep,
- buf.data() + pback_size_,
- buf.data() + pback_size_ );
-
- // Read from source.
- streamsize chars =
- obj().read(buf.data() + pback_size_, buf.size() - pback_size_, next_);
- if (chars == -1) {
- this->set_true_eof(true);
- chars = 0;
- }
- setg(eback(), gptr(), buf.data() + pback_size_ + chars);
- return chars != 0 ?
- traits_type::to_int_type(*gptr()) :
- traits_type::eof();
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-typename indirect_streambuf<T, Tr, Alloc, Mode>::int_type
-indirect_streambuf<T, Tr, Alloc, Mode>::pbackfail(int_type c)
-{
- if (gptr() != eback()) {
- gbump(-1);
- if (!traits_type::eq_int_type(c, traits_type::eof()))
- *gptr() = traits_type::to_char_type(c);
- return traits_type::not_eof(c);
- } else {
- throw bad_putback();
- }
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-typename indirect_streambuf<T, Tr, Alloc, Mode>::int_type
-indirect_streambuf<T, Tr, Alloc, Mode>::overflow(int_type c)
-{
- if ( output_buffered() && pptr() == 0 ||
- shared_buffer() && gptr() != 0 )
- {
- init_put_area();
- }
- if (!traits_type::eq_int_type(c, traits_type::eof())) {
- if (output_buffered()) {
- if (pptr() == epptr()) {
- sync_impl();
- if (pptr() == epptr())
- return traits_type::eof();
- }
- *pptr() = traits_type::to_char_type(c);
- pbump(1);
- } else {
- char_type d = traits_type::to_char_type(c);
- if (obj().write(&d, 1, next_) != 1)
- return traits_type::eof();
- }
- }
- return traits_type::not_eof(c);
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-int indirect_streambuf<T, Tr, Alloc, Mode>::sync()
-{
- try { // sync() is no-throw.
- sync_impl();
- obj().flush(next_);
- return 0;
- } catch (std::exception&) { return -1; }
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-bool indirect_streambuf<T, Tr, Alloc, Mode>::strict_sync()
-{
- try { // sync() is no-throw.
- sync_impl();
- return obj().flush(next_);
- } catch (std::exception&) { return false; }
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline typename indirect_streambuf<T, Tr, Alloc, Mode>::pos_type
-indirect_streambuf<T, Tr, Alloc, Mode>::seekoff
- (off_type off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which)
-{ return seek_impl(off, way, which); }
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline typename indirect_streambuf<T, Tr, Alloc, Mode>::pos_type
-indirect_streambuf<T, Tr, Alloc, Mode>::seekpos
- (pos_type sp, BOOST_IOS::openmode)
-{
- return seek_impl( position_to_offset(sp), BOOST_IOS::beg,
- BOOST_IOS::in | BOOST_IOS::out );
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-typename indirect_streambuf<T, Tr, Alloc, Mode>::pos_type
-indirect_streambuf<T, Tr, Alloc, Mode>::seek_impl
- (stream_offset off, BOOST_IOS::seekdir way, BOOST_IOS::openmode which)
-{
- if (pptr() != 0)
- this->BOOST_IOSTREAMS_PUBSYNC(); // sync() confuses VisualAge 6.
- if (way == BOOST_IOS::cur && gptr())
- off -= static_cast<off_type>(egptr() - gptr());
- setg(0, 0, 0);
- setp(0, 0);
- return obj().seek(off, way, which, next_);
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline void indirect_streambuf<T, Tr, Alloc, Mode>::set_next
- (streambuf_type* next)
-{ next_ = next; }
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline void indirect_streambuf<T, Tr, Alloc, Mode>::close
- (BOOST_IOS::openmode which)
-{
- close_impl(which);
- try { obj().close(which, next_); } catch (std::exception&) { }
-}
-
-//----------State changing functions------------------------------------------//
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-inline void indirect_streambuf<T, Tr, Alloc, Mode>::close_impl
- (BOOST_IOS::openmode which)
-{
- if (which == BOOST_IOS::in && (flags_ & f_input_closed) == 0) {
- setg(0, 0, 0);
- flags_ |= f_input_closed;
- }
- if (which == BOOST_IOS::out && (flags_ & f_output_closed) == 0) {
- sync();
- setp(0, 0);
- flags_ |= f_output_closed;
- }
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::sync_impl()
-{
- std::streamsize avail, amt;
- if ((avail = static_cast<std::streamsize>(pptr() - pbase())) > 0) {
- if ((amt = obj().write(pbase(), avail, next())) == avail)
- setp(out().begin(), out().end());
- else {
- const char_type* ptr = pptr();
- setp(out().begin() + amt, out().end());
- pbump(ptr - pptr());
- }
- }
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::init_get_area()
-{
- if (shared_buffer() && pptr() != 0) {
- sync_impl();
- setp(0, 0);
- }
- setg(in().begin(), in().begin(), in().begin());
-}
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-void indirect_streambuf<T, Tr, Alloc, Mode>::init_put_area()
-{
- using namespace std;
- if (shared_buffer() && gptr() != 0)
- setg(0, 0, 0);
- if (output_buffered())
- setp(out().begin(), out().end());
- else
- setp(0, 0);
-}
-
-//----------------------------------------------------------------------------//
-
-} } } // End namespaces detail, iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC, BCC 5.x
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_INDIRECT_STREAMBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_LINKED_STREAMBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_LINKED_STREAMBUF_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <typeinfo>
-#include <boost/config.hpp> // member template friends.
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode.
-#include <boost/iostreams/detail/streambuf.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename Self, typename Ch, typename Tr, typename Alloc, typename Mode>
-class chain_base;
-
-template<typename Chain, typename Access, typename Mode> class chainbuf;
-
-#define BOOST_IOSTREAMS_USING_PROTECTED_STREAMBUF_MEMBERS(base) \
- using base::eback; using base::gptr; using base::egptr; \
- using base::setg; using base::gbump; using base::pbase; \
- using base::pptr; using base::epptr; using base::setp; \
- using base::pbump; using base::underflow; using base::pbackfail; \
- using base::xsgetn; using base::overflow; using base::sputc; \
- using base::xsputn; using base::sync; using base::seekoff; \
- using base::seekpos; \
- /**/
-
-template<typename Ch, typename Tr = BOOST_IOSTREAMS_CHAR_TRAITS(Ch) >
-class linked_streambuf : public BOOST_IOSTREAMS_BASIC_STREAMBUF(Ch, Tr) {
-protected:
- linked_streambuf() : true_eof_(false) { }
- void set_true_eof(bool eof) { true_eof_ = eof; }
-public:
-
- // Should be called only after receiving an ordinary EOF indication,
- // to confirm that it represents EOF rather than WOULD_BLOCK.
- bool true_eof() const { return true_eof_; }
-protected:
-
- //----------grant friendship to chain_base and chainbuf-------------------//
-
-#ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
- template< typename Self, typename ChT, typename TrT,
- typename Alloc, typename Mode >
- friend class chain_base;
- template<typename Chain, typename Mode, typename Access>
- friend class chainbuf;
-#else
-public:
- typedef BOOST_IOSTREAMS_BASIC_STREAMBUF(Ch, Tr) base;
- BOOST_IOSTREAMS_USING_PROTECTED_STREAMBUF_MEMBERS(base)
-#endif
- virtual void set_next(linked_streambuf<Ch, Tr>* /* next */) { }
- virtual void close(BOOST_IOS::openmode) = 0;
- virtual bool auto_close() const = 0;
- virtual void set_auto_close(bool) = 0;
- virtual bool strict_sync() = 0;
- virtual const std::type_info& component_type() const = 0;
- virtual void* component_impl() = 0;
-private:
- bool true_eof_;
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_LINKED_STREAMBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Graehl 2004.
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Used by mapped_file.cpp.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cstring>
-#include <string>
-#include <boost/config.hpp>
-#include <boost/iostreams/detail/config/windows_posix.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure.
-
-#if defined(BOOST_NO_STDC_NAMESPACE) && !defined(__LIBCOMO__)
-namespace std { using ::strlen; }
-#endif
-
-#ifdef BOOST_IOSTREAMS_WINDOWS
-# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-# include <windows.h>
-#else
-# include <errno.h>
-# include <string.h>
-#endif
-
-namespace boost { namespace iostreams { namespace detail {
-
-inline BOOST_IOSTREAMS_FAILURE system_failure(const char* msg)
-{
- std::string result;
-#ifdef BOOST_IOSTREAMS_WINDOWS
- DWORD err;
- LPVOID lpMsgBuf;
- if ( (err = ::GetLastError()) != NO_ERROR &&
- ::FormatMessageA( FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM,
- NULL,
- err,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- (LPSTR) &lpMsgBuf,
- 0,
- NULL ) != 0 )
- {
- result.reserve(std::strlen(msg) + 2 + std::strlen((LPSTR)lpMsgBuf));
- result.append(msg);
- result.append(": ");
- result.append((LPSTR) lpMsgBuf);
- ::LocalFree(lpMsgBuf);
- } else {
- result += msg;
- }
-#else
- const char* system_msg = errno ? strerror(errno) : "";
- result.reserve(std::strlen(msg) + 2 + std::strlen(system_msg));
- result.append(msg);
- result.append(": ");
- result.append(system_msg);
-#endif
- return BOOST_IOSTREAMS_FAILURE(result);
-}
-
-inline void throw_system_failure(const char* msg)
-{ throw system_failure(msg); }
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_SYSTEM_FAILURE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_TEMPLATE_PARAMS_HPP_INCLUDED
-
-#include <boost/preprocessor/control/expr_if.hpp>
-#include <boost/preprocessor/control/if.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-
-#define BOOST_IOSTREAMS_TEMPLATE_PARAMS(arity, param) \
- BOOST_PP_EXPR_IF(arity, template<) \
- BOOST_PP_ENUM_PARAMS(arity, typename param) \
- BOOST_PP_EXPR_IF(arity, >) \
- /**/
-
-#define BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, param) \
- BOOST_PP_EXPR_IF(arity, <) \
- BOOST_PP_ENUM_PARAMS(arity, param) \
- BOOST_PP_EXPR_IF(arity, >) \
- /**/
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_BUFFERS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_TRANSLATE_INT_TYPE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_TRANSLATE_INT_TYPE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/type_traits/is_same.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<bool IsSame>
-struct translate_int_type_impl;
-
-//
-// Template name: translate_char.
-// Description: Translates a character or an end-of-file indicator from the
-// int_type of one character traits type to the int_type of another.
-//
-template<typename SourceTr, typename TargetTr>
-typename TargetTr::int_type
-translate_int_type(typename SourceTr::int_type c)
-{
- typedef translate_int_type_impl<is_same<SourceTr, TargetTr>::value> impl;
- return impl::template inner<SourceTr, TargetTr>::translate(c);
-}
-
-//----------------------------------------------------------------------------//
-
-template<>
-struct translate_int_type_impl<true> {
- template<typename SourceTr, typename TargetTr>
- struct inner {
- static typename TargetTr::int_type
- translate(typename SourceTr::int_type c) { return c; }
- };
-};
-
-template<>
-struct translate_int_type_impl<false> {
- template<typename SourceTr, typename TargetTr>
- struct inner {
- static typename TargetTr::int_type
- translate(typename SourceTr::int_type c)
- {
- return SourceTr::eq_int_type(SourceTr::eof()) ?
- TargetTr::eof() :
- TargetTr::to_int_type(SourceTr::to_char_type(c));
- }
- };
-};
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_TRANSLATE_INT_TYPE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED
-#define BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // SFINAE, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/enable_if_stream.hpp>
-#include <boost/iostreams/traits_fwd.hpp> // is_std_io.
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/if.hpp>
-#include <boost/ref.hpp>
-
-namespace boost { namespace iostreams { namespace detail {
-
-//------------------Definition of wrap/unwrap traits--------------------------//
-
-template<typename T>
-struct wrapped_type
- : mpl::if_<is_std_io<T>, reference_wrapper<T>, T>
- { };
-
-template<typename T>
-struct unwrapped_type
- : unwrap_reference<T>
- { };
-
-template<typename T>
-struct unwrap_ios
- : mpl::eval_if<
- is_std_io<T>,
- unwrap_reference<T>,
- mpl::identity<T>
- >
- { };
-
-//------------------Definition of wrap----------------------------------------//
-
-#ifndef BOOST_NO_SFINAE //----------------------------------------------------//
- template<typename T>
- inline T wrap(const T& t BOOST_IOSTREAMS_DISABLE_IF_STREAM(T))
- { return t; }
-
- template<typename T>
- inline typename wrapped_type<T>::type
- wrap(T& t BOOST_IOSTREAMS_ENABLE_IF_STREAM(T)) { return boost::ref(t); }
-#else // #ifndef BOOST_NO_SFINAE //-------------------------------------------//
- template<typename T>
- inline typename wrapped_type<T>::type // BCC 5.x needs namespace qualification.
- wrap_impl(const T& t, mpl::true_) { return boost::ref(const_cast<T&>(t)); }
-
- template<typename T>
- inline typename wrapped_type<T>::type // BCC 5.x needs namespace qualification.
- wrap_impl(T& t, mpl::true_) { return boost::ref(t); }
-
- template<typename T>
- inline typename wrapped_type<T>::type
- wrap_impl(const T& t, mpl::false_) { return t; }
-
- template<typename T>
- inline typename wrapped_type<T>::type
- wrap_impl(T& t, mpl::false_) { return t; }
-
- template<typename T>
- inline typename wrapped_type<T>::type
- wrap(const T& t) { return wrap_impl(t, is_std_io<T>()); }
-
- template<typename T>
- inline typename wrapped_type<T>::type
- wrap(T& t) { return wrap_impl(t, is_std_io<T>()); }
-#endif // #ifndef BOOST_NO_SFINAE //------------------------------------------//
-
-//------------------Definition of unwrap--------------------------------------//
-
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310) //----------------------------------//
-
-template<typename T>
-typename unwrapped_type<T>::type&
-unwrap(const reference_wrapper<T>& ref) { return ref.get(); }
-
-template<typename T>
-typename unwrapped_type<T>::type& unwrap(T& t) { return t; }
-
-template<typename T>
-const typename unwrapped_type<T>::type& unwrap(const T& t) { return t; }
-
-#else // #if !BOOST_WORKAROUND(BOOST_MSVC, < 1310) //-------------------------//
-
-// Since unwrap is a potential bottleneck, we avoid runtime tag dispatch.
-template<bool IsRefWrap>
-struct unwrap_impl;
-
-template<>
-struct unwrap_impl<true> {
- template<typename T>
- static typename unwrapped_type<T>::type& unwrap(const T& t)
- { return t.get(); }
-};
-
-template<>
-struct unwrap_impl<false> {
- template<typename T>
- static typename unwrapped_type<T>::type& unwrap(const T& t)
- { return const_cast<T&>(t); }
-};
-
-template<typename T>
-typename unwrapped_type<T>::type&
-unwrap(const T& t)
-{ return unwrap_impl<is_reference_wrapper<T>::value>::unwrap(t); }
-
-#endif // #if !BOOST_WORKAROUND(BOOST_MSVC, < 1310) //------------------------//
-
-} } } // End namespaces detail, iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_DETAIL_WRAP_UNWRAP_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2004.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_ARRAY_HPP_INCLUDED
-#define BOOST_IOSTREAMS_ARRAY_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC, make sure size_t is in std.
-#include <boost/detail/workaround.hpp>
-#include <cstddef> // std::size_t.
-#include <utility> // pair.
-#include <boost/iostreams/categories.hpp>
-#include <boost/preprocessor/cat.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename Mode, typename Ch>
-class array_adapter {
-public:
- typedef Ch char_type;
- typedef std::pair<char_type*, char_type*> pair_type;
- struct category
- : public Mode,
- public device_tag,
- public direct_tag
- { };
- array_adapter(char_type* begin, char_type* end);
- array_adapter(char_type* begin, std::size_t length);
- array_adapter(const char_type* begin, const char_type* end);
- array_adapter(const char_type* begin, std::size_t length);
-#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- template<int N>
- array_adapter(char_type (&ar)[N])
- : begin_(ar), end_(ar + N)
- { }
-#endif
- pair_type input_sequence();
- pair_type output_sequence();
-private:
- char_type* begin_;
- char_type* end_;
-};
-
-} // End namespace detail.
-
-// Local macros, #undef'd below.
-#if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
-# define BOOST_IOSTREAMS_ARRAY_CTOR(name, ch) \
- template<int N> \
- BOOST_PP_CAT(basic_, name)(ch (&ar)[N]) \
- : base_type(ar) { } \
- /**/
-#else
-# define BOOST_IOSTREAMS_ARRAY_CTOR(name, ch)
-#endif
-#define BOOST_IOSTREAMS_ARRAY(name, mode) \
- template<typename Ch> \
- struct BOOST_PP_CAT(basic_, name) : detail::array_adapter<mode, Ch> { \
- private: \
- typedef detail::array_adapter<mode, Ch> base_type; \
- public: \
- typedef typename base_type::char_type char_type; \
- typedef typename base_type::category category; \
- BOOST_PP_CAT(basic_, name)(char_type* begin, char_type* end) \
- : base_type(begin, end) { } \
- BOOST_PP_CAT(basic_, name)(char_type* begin, std::size_t length) \
- : base_type(begin, length) { } \
- BOOST_PP_CAT(basic_, name)(const char_type* begin, const char_type* end) \
- : base_type(begin, end) { } \
- BOOST_PP_CAT(basic_, name)(const char_type* begin, std::size_t length) \
- : base_type(begin, length) { } \
- BOOST_IOSTREAMS_ARRAY_CTOR(name, Ch) \
- }; \
- typedef BOOST_PP_CAT(basic_, name)<char> name; \
- typedef BOOST_PP_CAT(basic_, name)<wchar_t> BOOST_PP_CAT(w, name); \
- /**/
-BOOST_IOSTREAMS_ARRAY(array_source, input_seekable)
-BOOST_IOSTREAMS_ARRAY(array_sink, output_seekable)
-BOOST_IOSTREAMS_ARRAY(array, seekable)
-#undef BOOST_IOSTREAMS_ARRAY_CTOR
-#undef BOOST_IOSTREAMS_ARRAY
-
-
-//------------------Implementation of array_adapter---------------------------//
-
-namespace detail {
-
-template<typename Mode, typename Ch>
-array_adapter<Mode, Ch>::array_adapter
- (char_type* begin, char_type* end)
- : begin_(begin), end_(end)
- { }
-
-template<typename Mode, typename Ch>
-array_adapter<Mode, Ch>::array_adapter
- (char_type* begin, std::size_t length)
- : begin_(begin), end_(begin + length)
- { }
-
-template<typename Mode, typename Ch>
-array_adapter<Mode, Ch>::array_adapter
- (const char_type* begin, const char_type* end)
- : begin_(const_cast<char_type*>(begin)), // Treated as read-only.
- end_(const_cast<char_type*>(end)) // Treated as read-only.
-{ BOOST_STATIC_ASSERT((!is_convertible<Mode, output>::value)); }
-
-template<typename Mode, typename Ch>
-array_adapter<Mode, Ch>::array_adapter
- (const char_type* begin, std::size_t length)
- : begin_(const_cast<char_type*>(begin)), // Treated as read-only.
- end_(const_cast<char_type*>(begin) + length) // Treated as read-only.
-{ BOOST_STATIC_ASSERT((!is_convertible<Mode, output>::value)); }
-
-template<typename Mode, typename Ch>
-typename array_adapter<Mode, Ch>::pair_type
-array_adapter<Mode, Ch>::input_sequence()
-{ BOOST_STATIC_ASSERT((is_convertible<Mode, input>::value));
- return pair_type(begin_, end_); }
-
-template<typename Mode, typename Ch>
-typename array_adapter<Mode, Ch>::pair_type
-array_adapter<Mode, Ch>::output_sequence()
-{ BOOST_STATIC_ASSERT((is_convertible<Mode, output>::value));
- return pair_type(begin_, end_); }
-
-} // End namespace detail.
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_ARRAY_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_BACK_INSERTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_BACK_INSERTER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/ios.hpp> // streamsize.
-#include <boost/iostreams/categories.hpp>
-
-namespace boost { namespace iostreams {
-
-template<typename Container>
-class back_insert_device {
-public:
- typedef typename Container::value_type char_type;
- typedef sink_tag category;
- back_insert_device(Container& cnt) : container(&cnt) { }
- std::streamsize write(const char_type* s, std::streamsize n)
- {
- container->insert(container->end(), s, s + n);
- return n;
- }
-protected:
- Container* container;
-};
-
-template<typename Container>
-back_insert_device<Container> back_inserter(Container& cnt)
-{ return back_insert_device<Container>(cnt); }
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_BACK_INSERTER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-//
-// Contains wrappers for standard file buffers, together
-// with convenience typedefs:
-// - basic_file_source
-// - basic_file_sink
-// - basic_file
-//
-
-#ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FILE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
-# include <locale>
-#endif
-#include <string> // pathnames, char_traits.
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode, seekdir, int types.
-#include <boost/iostreams/detail/fstream.hpp>
-#include <boost/iostreams/operations.hpp> // seek.
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams {
-
-template<typename Ch>
-class basic_file {
-public:
- typedef Ch char_type;
- struct category
- : public seekable_device_tag,
- public closable_tag,
- public localizable_tag
- { };
- basic_file( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in | BOOST_IOS::out,
- BOOST_IOS::openmode base_mode =
- BOOST_IOS::in | BOOST_IOS::out );
- std::streamsize read(char_type* s, std::streamsize n);
- std::streamsize write(const char_type* s, std::streamsize n);
- std::streampos seek( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which =
- BOOST_IOS::in | BOOST_IOS::out );
- void open( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in | BOOST_IOS::out,
- BOOST_IOS::openmode base_mode =
- BOOST_IOS::in | BOOST_IOS::out );
- bool is_open() const;
- void close();
-#ifndef BOOST_IOSTREAMS_NO_LOCALE
- void imbue(const std::locale& loc) { pimpl_->file_.pubimbue(loc); }
-#endif
-private:
- struct impl {
- impl(const std::string& path, BOOST_IOS::openmode mode)
- { file_.open(path.c_str(), mode); }
- ~impl() { if (file_.is_open()) file_.close(); }
- BOOST_IOSTREAMS_BASIC_FILEBUF(Ch) file_;
- };
- shared_ptr<impl> pimpl_;
-};
-
-typedef basic_file<char> file;
-typedef basic_file<wchar_t> wfile;
-
-template<typename Ch>
-struct basic_file_source : private basic_file<Ch> {
- typedef Ch char_type;
- struct category
- : input_seekable,
- device_tag,
- closable_tag
- { };
- using basic_file<Ch>::read;
- using basic_file<Ch>::seek;
- using basic_file<Ch>::is_open;
- using basic_file<Ch>::close;
- basic_file_source( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in )
- : basic_file<Ch>(path, mode & ~BOOST_IOS::out, BOOST_IOS::in)
- { }
- void open( const std::string& path,
- BOOST_IOS::openmode mode = BOOST_IOS::in )
- {
- basic_file<Ch>::open(path, mode & ~BOOST_IOS::out, BOOST_IOS::in);
- }
-};
-
-typedef basic_file_source<char> file_source;
-typedef basic_file_source<wchar_t> wfile_source;
-
-template<typename Ch>
-struct basic_file_sink : private basic_file<Ch> {
- typedef Ch char_type;
- struct category
- : output_seekable,
- device_tag,
- closable_tag
- { };
- using basic_file<Ch>::write;
- using basic_file<Ch>::seek;
- using basic_file<Ch>::is_open;
- using basic_file<Ch>::close;
- basic_file_sink( const std::string& path,
- BOOST_IOS::openmode mode = BOOST_IOS::out )
- : basic_file<Ch>(path, mode & ~BOOST_IOS::in, BOOST_IOS::out)
- { }
- void open( const std::string& path,
- BOOST_IOS::openmode mode = BOOST_IOS::out )
- {
- basic_file<Ch>::open(path, mode & ~BOOST_IOS::in, BOOST_IOS::out);
- }
-};
-
-typedef basic_file_sink<char> file_sink;
-typedef basic_file_sink<wchar_t> wfile_sink;
-
-//------------------Implementation of basic_file------------------------------//
-
-template<typename Ch>
-basic_file<Ch>::basic_file
- ( const std::string& path, BOOST_IOS::openmode mode,
- BOOST_IOS::openmode base_mode )
-{
- open(path, mode, base_mode);
-}
-
-template<typename Ch>
-inline std::streamsize basic_file<Ch>::read
- (char_type* s, std::streamsize n)
-{
- std::streamsize result = pimpl_->file_.sgetn(s, n);
- return result != 0 ? result : -1;
-}
-
-template<typename Ch>
-inline std::streamsize basic_file<Ch>::write
- (const char_type* s, std::streamsize n)
-{ return pimpl_->file_.sputn(s, n); }
-
-template<typename Ch>
-std::streampos basic_file<Ch>::seek
- ( stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode )
-{ return iostreams::seek(pimpl_->file_, off, way); }
-
-template<typename Ch>
-void basic_file<Ch>::open
- ( const std::string& path, BOOST_IOS::openmode mode,
- BOOST_IOS::openmode base_mode )
-{
- pimpl_.reset(new impl(path, mode | base_mode));
-}
-
-template<typename Ch>
-bool basic_file<Ch>::is_open() const { return pimpl_->file_.is_open(); }
-
-template<typename Ch>
-void basic_file<Ch>::close() { pimpl_->file_.close(); }
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC
-
-#endif // #ifndef BOOST_IOSTREAMS_FILE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Inspired by fdstream.hpp, (C) Copyright Nicolai M. Josuttis 2001,
-// available at http://www.josuttis.com/cppcode/fdstream.html.
-
-#ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <string> // file pathnames.
-#include <boost/cstdint.hpp> // intmax_t.
-#include <boost/iostreams/categories.hpp> // tags.
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/windows_posix.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode, seekdir, int types.
-#include <boost/iostreams/positioning.hpp>
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost { namespace iostreams {
-
-class BOOST_IOSTREAMS_DECL file_descriptor {
-public:
-#ifdef BOOST_IOSTREAMS_WINDOWS
- typedef void* handle_type;
-#endif
- typedef char char_type;
- struct category
- : seekable_device_tag,
- closable_tag
- { };
- file_descriptor() : pimpl_(new impl) { }
- explicit file_descriptor(int fd, bool close_on_exit = false)
- : pimpl_(new impl(fd, close_on_exit))
- { }
-#ifdef BOOST_IOSTREAMS_WINDOWS
- explicit file_descriptor(handle_type handle, bool close_on_exit = false)
- : pimpl_(new impl(handle, close_on_exit))
- { }
-#endif
- explicit file_descriptor( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in | BOOST_IOS::out,
- BOOST_IOS::openmode base_mode =
- BOOST_IOS::in | BOOST_IOS::out )
- : pimpl_(new impl)
- { open(path, mode, base_mode); }
- void open( const std::string& path,
- BOOST_IOS::openmode =
- BOOST_IOS::in | BOOST_IOS::out,
- BOOST_IOS::openmode base_mode =
- BOOST_IOS::in | BOOST_IOS::out );
- bool is_open() const { return pimpl_->flags_ != 0; }
- std::streamsize read(char_type* s, std::streamsize n);
- std::streamsize write(const char_type* s, std::streamsize n);
- std::streampos seek(stream_offset off, BOOST_IOS::seekdir way);
- void close();
-private:
- struct impl {
- impl() : fd_(-1), flags_(0) { }
- impl(int fd, bool close_on_exit)
- : fd_(fd), flags_(0)
- { if (close_on_exit) flags_ |= impl::close_on_exit; }
- #ifdef BOOST_IOSTREAMS_WINDOWS
- impl(handle_type handle, bool close_on_exit)
- : handle_(handle), flags_(has_handle)
- { if (close_on_exit) flags_ |= impl::close_on_exit; }
- #endif
- ~impl() {
- if (flags_ & close_on_exit) close_impl(*this);
- }
- enum flags {
- close_on_exit = 1,
- has_handle = 2,
- append = 4
- };
- int fd_;
- #ifdef BOOST_IOSTREAMS_WINDOWS
- handle_type handle_;
- #endif
- int flags_;
- };
- friend struct impl;
-
- static void close_impl(impl&);
-
- shared_ptr<impl> pimpl_;
-};
-
-struct file_descriptor_source : private file_descriptor {
-#ifdef BOOST_IOSTREAMS_WINDOWS
- typedef void* handle_type;
-#endif
- typedef char char_type;
- struct category : public source_tag, closable_tag { };
- using file_descriptor::read;
- using file_descriptor::open;
- using file_descriptor::is_open;
- using file_descriptor::close;
- file_descriptor_source() { }
- explicit file_descriptor_source(int fd, bool close_on_exit = false)
- : file_descriptor(fd, close_on_exit)
- { }
-#ifdef BOOST_IOSTREAMS_WINDOWS
- explicit file_descriptor_source( handle_type handle,
- bool close_on_exit = false )
- : file_descriptor(handle, close_on_exit)
- { }
-#endif
- explicit file_descriptor_source( const std::string& path,
- BOOST_IOS::openmode m = BOOST_IOS::in )
- : file_descriptor(path, m & ~BOOST_IOS::out, BOOST_IOS::in)
- { }
-};
-
-struct file_descriptor_sink : private file_descriptor {
-#ifdef BOOST_IOSTREAMS_WINDOWS
- typedef void* handle_type;
-#endif
- typedef char char_type;
- struct category : public sink_tag, closable_tag { };
- using file_descriptor::write;
- using file_descriptor::open;
- using file_descriptor::is_open;
- using file_descriptor::close;
- file_descriptor_sink() { }
- explicit file_descriptor_sink(int fd, bool close_on_exit = false)
- : file_descriptor(fd, close_on_exit)
- { }
-#ifdef BOOST_IOSTREAMS_WINDOWS
- explicit file_descriptor_sink( handle_type handle,
- bool close_on_exit = false )
- : file_descriptor(handle, close_on_exit)
- { }
-#endif
- explicit file_descriptor_sink( const std::string& path,
- BOOST_IOS::openmode m = BOOST_IOS::out )
- : file_descriptor(path, m & ~BOOST_IOS::in, BOOST_IOS::out)
- { }
-};
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
-
-#endif // #ifndef BOOST_IOSTREAMS_FILE_DESCRIPTOR_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// (C) Copyright Craig Henderson 2002. 'boost/memmap.hpp' from sandbox
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-//
-// This header and its accompanying source file libs/iostreams/memmap.cpp are
-// an adaptation of Craig Henderson's memmory mapped file library. The
-// interface has been revised significantly, but the underlying OS-specific
-// code is essentially the same, with some code from Boost.Filesystem
-// mixed in. (See notations in source.)
-//
-// The following changes have been made:
-//
-// 1. OS-specific code put in a .cpp file.
-// 2. Name of main class changed to mapped_file.
-// 3. mapped_file given an interface similar to std::fstream (open(),
-// is_open(), close()) and std::string (data(), size(), begin(), end()).
-// 4. An additional class readonly_mapped_file has been provided as a
-// convenience.
-// 5. [Obsolete: Error states are reported using filesystem::error_code.]
-// 6. Read-only or read-write states are specified using ios_base::openmode.
-// 7. Access to the underlying file handles and to security parameters
-// has been removed.
-//
-
-#ifndef BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // make sure size_t is in std.
-#include <cstddef> // size_t.
-#include <string> // pathnames.
-#include <utility> // pair.
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/close.hpp>
-#include <boost/iostreams/concepts.hpp>
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode.
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-struct mapped_file_impl;
-
-} // End namespace detail.
-
-struct mapped_file_params {
- explicit mapped_file_params()
- : mode(), offset(0), length(static_cast<std::size_t>(-1)),
- new_file_size(0), hint(0)
- { }
- explicit mapped_file_params(const std::string& path)
- : path(path), mode(), offset(0),
- length(static_cast<std::size_t>(-1)),
- new_file_size(0), hint(0)
- { }
- std::string path;
- BOOST_IOS::openmode mode;
- stream_offset offset;
- std::size_t length;
- stream_offset new_file_size;
- const char* hint;
-};
-
-//------------------Definition of mapped_file_source--------------------------//
-
-class BOOST_IOSTREAMS_DECL mapped_file_source {
-private:
- struct safe_bool_helper { int x; }; // From Bronek Kozicki.
- typedef int safe_bool_helper::* safe_bool;
- friend struct operations<mapped_file_source>;
-public:
- typedef char char_type;
- struct category
- : public source_tag,
- public direct_tag,
- public closable_tag
- { };
- typedef std::size_t size_type;
- typedef const char* iterator;
- BOOST_STATIC_CONSTANT(size_type, max_length = static_cast<size_type>(-1));
-
- mapped_file_source() { }
- explicit mapped_file_source(mapped_file_params);
- explicit mapped_file_source( const std::string& path,
- size_type length = max_length,
- boost::intmax_t offset = 0 );
-
- //--------------Stream interface------------------------------------------//
-
- void open(mapped_file_params params);
- void open( const std::string& path,
- size_type length = max_length,
- boost::intmax_t offset = 0 );
- bool is_open() const;
- void close();
-
- operator safe_bool() const;
- bool operator!() const;
- BOOST_IOS::openmode mode() const;
-
- //--------------Container interface---------------------------------------//
-
- size_type size() const;
- const char* data() const;
- iterator begin() const;
- iterator end() const;
-
- //--------------Query admissible offsets----------------------------------//
-
- // Returns the allocation granularity for virtual memory. Values passed
- // as offsets must be multiples of this value.
- static int alignment();
-private:
- friend class mapped_file;
- typedef detail::mapped_file_impl impl_type;
- void open_impl(mapped_file_params);
-
- boost::shared_ptr<impl_type> pimpl_;
-};
-
-//------------------Definition of mapped_file---------------------------------//
-
-class BOOST_IOSTREAMS_DECL mapped_file {
-private:
- typedef mapped_file_source delegate_type;
- delegate_type delegate_;
- friend struct operations<mapped_file>;
-public:
- typedef char char_type;
- struct category
- : public seekable_device_tag,
- public direct_tag,
- public closable_tag
- { };
- typedef mapped_file_source::size_type size_type;
- typedef char* iterator;
- typedef const char* const_iterator;
- BOOST_STATIC_CONSTANT(size_type, max_length = delegate_type::max_length);
- mapped_file() { }
- explicit mapped_file(mapped_file_params p);
- explicit mapped_file( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in | BOOST_IOS::out,
- size_type length = max_length,
- stream_offset offset = 0 );
-
- //--------------Conversion to readonly_mapped_file------------------------//
-
- operator mapped_file_source&() { return delegate_; }
- operator const mapped_file_source&() const { return delegate_; }
-
- //--------------Stream interface------------------------------------------//
-
- void open(mapped_file_params p);
- void open( const std::string& path,
- BOOST_IOS::openmode mode =
- BOOST_IOS::in | BOOST_IOS::out,
- size_type length = max_length,
- stream_offset offset = 0 );
- bool is_open() const { return delegate_.is_open(); }
- void close() { delegate_.close(); }
- operator delegate_type::safe_bool() const { return delegate_; }
- bool operator!() const { return !is_open(); }
- BOOST_IOS::openmode mode() const { return delegate_.mode(); }
-
- //--------------Container interface---------------------------------------//
-
- size_type size() const { return delegate_.size(); }
- char* data() const
- {
- return (mode() & BOOST_IOS::out) ?
- const_cast<char*>(delegate_.data()) :
- 0;
- }
- const char* const_data() const { return delegate_.data(); }
- iterator begin() const { return data(); }
- const_iterator const_begin() const { return data(); }
- iterator end() const { return data() + size(); }
- const_iterator const_end() const { return data() + size(); }
-
- //--------------Query admissible offsets----------------------------------//
-
- // Returns the allocation granularity for virtual memory. Values passed
- // as offsets must be multiples of this value.
- static int alignment() { return mapped_file_source::alignment(); }
-};
-
-struct BOOST_IOSTREAMS_DECL mapped_file_sink : private mapped_file {
- friend struct operations<mapped_file_sink>;
- typedef char char_type;
- struct category
- : public sink_tag,
- public direct_tag,
- public closable_tag
- { };
- using mapped_file::close;
- explicit mapped_file_sink(mapped_file_params p);
- explicit mapped_file_sink( const std::string& path,
- size_type length = max_length,
- boost::intmax_t offset = 0 );
- void open(mapped_file_params p);
- void open( const std::string& path,
- size_type length = max_length,
- boost::intmax_t offset = 0 );
-};
-
-//------------------Specialization of direct_impl-----------------------------//
-
-template<>
-struct operations<boost::iostreams::mapped_file_source>
- : detail::close_impl<closable_tag>
-{
- static std::pair<char*, char*>
- input_sequence(boost::iostreams::mapped_file_source& src)
- {
- return std::make_pair( const_cast<char*>(src.begin()),
- const_cast<char*>(src.end()) );
- }
-};
-
-template<>
-struct operations<boost::iostreams::mapped_file_sink>
- : detail::close_impl<closable_tag>
-{
- static std::pair<char*, char*>
- output_sequence(boost::iostreams::mapped_file_sink& sink)
- {
- return std::make_pair(sink.begin(), sink.end());
- }
-};
-
-template<>
-struct operations<boost::iostreams::mapped_file>
- : detail::close_impl<closable_tag>
-{
- static std::pair<char*, char*>
- input_sequence(boost::iostreams::mapped_file& file)
- {
- return std::make_pair(file.begin(), file.end());
- }
- static std::pair<char*, char*>
- output_sequence(boost::iostreams::mapped_file& file)
- {
- return std::make_pair(file.begin(), file.end());
- }
-};
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // pops abi_suffix.hpp pragmas
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_MAPPED_FILE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2004.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Inspired by Daryle Walker's nullbuf from his More I/O submission.
-
-#ifndef BOOST_IOSTREAMS_NULL_HPP_INCLUDED
-#define BOOST_IOSTREAMS_NULL_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmode, streamsize.
-#include <boost/iostreams/positioning.hpp>
-
-namespace boost { namespace iostreams {
-
-template<typename Ch, typename Mode>
-class basic_null_device {
-public:
- typedef Ch char_type;
- struct category
- : public Mode,
- public device_tag,
- public closable_tag
- { };
- std::streamsize read(Ch*, std::streamsize) { return 0; }
- std::streamsize write(const Ch*, std::streamsize n) { return n; }
- std::streampos seek( stream_offset, BOOST_IOS::seekdir,
- BOOST_IOS::openmode =
- BOOST_IOS::in | BOOST_IOS::out )
- { return -1; }
- void close(BOOST_IOS::openmode = BOOST_IOS::in | BOOST_IOS::out) { }
-};
-
-template<typename Ch>
-struct basic_null_source : private basic_null_device<Ch, input> {
- typedef Ch char_type;
- typedef source_tag category;
- using basic_null_device<Ch, input>::read;
- using basic_null_device<Ch, input>::close;
-};
-
-typedef basic_null_source<char> null_source;
-typedef basic_null_source<wchar_t> wnull_source;
-
-template<typename Ch>
-struct basic_null_sink : private basic_null_device<Ch, output> {
- typedef Ch char_type;
- typedef sink_tag category;
- using basic_null_device<Ch, output>::write;
- using basic_null_device<Ch, output>::close;
-};
-
-typedef basic_null_sink<char> null_sink;
-typedef basic_null_sink<wchar_t> wnull_sink;
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_NULL_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Note: custom allocators are not supported on VC6, since that compiler
-// had trouble finding the function zlib_base::do_init.
-
-#ifndef BOOST_IOSTREAMS_BZIP2_HPP_INCLUDED
-#define BOOST_IOSTREAMS_BZIP2_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cassert>
-#include <memory> // allocator.
-#include <new> // bad_alloc.
-#include <boost/config.hpp> // MSVC, STATIC_CONSTANT, DEDUCED_TYPENAME, DINKUM.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/constants.hpp> // buffer size.
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/bzip2.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure, streamsize.
-#include <boost/iostreams/filter/symmetric.hpp>
-#include <boost/iostreams/pipeline.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-// Must come last.
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4251 4231 4660)
-#endif
-#include <boost/config/abi_prefix.hpp>
-
-// Temporary fix.
-#undef small
-
-namespace boost { namespace iostreams {
-
-namespace bzip2 {
-
- // Typedefs.
-
-typedef void* (*alloc_func)(void*, int, int);
-typedef void (*free_func)(void*, void*);
-
- // Status codes
-
-BOOST_IOSTREAMS_DECL extern const int ok;
-BOOST_IOSTREAMS_DECL extern const int run_ok;
-BOOST_IOSTREAMS_DECL extern const int flush_ok;
-BOOST_IOSTREAMS_DECL extern const int finish_ok;
-BOOST_IOSTREAMS_DECL extern const int stream_end;
-BOOST_IOSTREAMS_DECL extern const int sequence_error;
-BOOST_IOSTREAMS_DECL extern const int param_error;
-BOOST_IOSTREAMS_DECL extern const int mem_error;
-BOOST_IOSTREAMS_DECL extern const int data_error;
-BOOST_IOSTREAMS_DECL extern const int data_error_magic;
-BOOST_IOSTREAMS_DECL extern const int io_error;
-BOOST_IOSTREAMS_DECL extern const int unexpected_eof;
-BOOST_IOSTREAMS_DECL extern const int outbuff_full;
-BOOST_IOSTREAMS_DECL extern const int config_error;
-
- // Action codes
-
-BOOST_IOSTREAMS_DECL extern const int finish;
-BOOST_IOSTREAMS_DECL extern const int run;
-
- // Default values
-
-const int default_block_size = 9;
-const int default_work_factor = 30;
-const bool default_small = false;
-
-} // End namespace bzip2.
-
-//
-// Class name: bzip2_params.
-// Description: Encapsulates the parameters passed to deflateInit2
-// to customize compression.
-//
-struct bzip2_params {
-
- // Non-explicit constructor for compression.
- bzip2_params( int block_size = bzip2::default_block_size,
- int work_factor = bzip2::default_work_factor )
- : block_size(block_size), work_factor(work_factor)
- { }
-
- // Constructor for decompression.
- bzip2_params(bool small)
- : small(small), work_factor(0)
- { }
-
- union {
- int block_size; // For compression.
- bool small; // For decompression.
- };
- int work_factor;
-};
-
-//
-// Class name: bzip2_error.
-// Description: Subclass of std::ios_base::failure thrown to indicate
-// bzip2 errors other than out-of-memory conditions.
-//
-class BOOST_IOSTREAMS_DECL bzip2_error : public BOOST_IOSTREAMS_FAILURE {
-public:
- explicit bzip2_error(int error);
- int error() const { return error_; }
- static void check(int error);
-private:
- int error_;
-};
-
-namespace detail {
-
-template<typename Alloc>
-struct bzip2_allocator_traits {
-#ifndef BOOST_NO_STD_ALLOCATOR
- typedef typename Alloc::template rebind<char>::other type;
-#else
- typedef std::allocator<char> type;
-#endif
-};
-
-template< typename Alloc,
- typename Base = // VC6 workaround (C2516)
- BOOST_DEDUCED_TYPENAME bzip2_allocator_traits<Alloc>::type >
-struct bzip2_allocator : private Base {
-private:
- typedef typename Base::size_type size_type;
-public:
- BOOST_STATIC_CONSTANT(bool, custom =
- (!is_same<std::allocator<char>, Base>::value));
- typedef typename bzip2_allocator_traits<Alloc>::type allocator_type;
- static void* allocate(void* self, int items, int size);
- static void deallocate(void* self, void* address);
-};
-
-class BOOST_IOSTREAMS_DECL bzip2_base {
-public:
- typedef char char_type;
-protected:
- bzip2_base(const bzip2_params& params);
- ~bzip2_base();
- bzip2_params& params() { return params_; }
- bool& ready() { return ready_; }
- template<typename Alloc>
- void init( bool compress,
- bzip2_allocator<Alloc>& alloc )
- {
- bool custom = bzip2_allocator<Alloc>::custom;
- do_init( compress,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- custom ? bzip2_allocator<Alloc>::allocate : 0,
- custom ? bzip2_allocator<Alloc>::deallocate : 0,
- #endif
- custom ? &alloc : 0 );
- }
- void before( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end );
- void after(const char*& src_begin, char*& dest_begin);
- int compress(int action);
- int decompress();
- void end(bool compress);
-private:
- void do_init( bool compress,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- bzip2::alloc_func,
- bzip2::free_func,
- #endif
- void* derived );
- bzip2_params params_;
- void* stream_; // Actual type: bz_stream*.
- bool ready_;
-};
-
-//
-// Template name: bzip2_compressor_impl
-// Description: Model of SymmetricFilter implementing compression by
-// delegating to the libbzip2 function BZ_bzCompress.
-//
-template<typename Alloc = std::allocator<char> >
-class bzip2_compressor_impl
- : public bzip2_base,
- #if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
- public
- #endif
- bzip2_allocator<Alloc>
-{
-public:
- bzip2_compressor_impl(const bzip2_params&);
- bool filter( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool flush );
- void close();
-private:
- void init();
-};
-
-//
-// Template name: bzip2_compressor
-// Description: Model of SymmetricFilter implementing decompression by
-// delegating to the libbzip2 function BZ_bzDecompress.
-//
-template<typename Alloc = std::allocator<char> >
-class bzip2_decompressor_impl
- : public bzip2_base,
- #if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
- public
- #endif
- bzip2_allocator<Alloc>
-{
-public:
- bzip2_decompressor_impl(bool small = bzip2::default_small);
- bool filter( const char*& begin_in, const char* end_in,
- char*& begin_out, char* end_out, bool flush );
- void close();
-private:
- void init();
- bool eof_; // Guard to make sure filter() isn't called after it returns false.
-};
-
-} // End namespace detail.
-
-//
-// Template name: bzip2_compressor
-// Description: Model of InputFilter and OutputFilter implementing
-// compression using libbzip2.
-//
-template<typename Alloc = std::allocator<char> >
-struct basic_bzip2_compressor
- : symmetric_filter<detail::bzip2_compressor_impl<Alloc>, Alloc>
-{
-private:
- typedef detail::bzip2_compressor_impl<Alloc> impl_type;
- typedef symmetric_filter<impl_type, Alloc> base_type;
-public:
- typedef typename base_type::char_type char_type;
- typedef typename base_type::category category;
- basic_bzip2_compressor( const bzip2_params& = bzip2::default_block_size,
- int buffer_size = default_device_buffer_size );
-};
-BOOST_IOSTREAMS_PIPABLE(basic_bzip2_compressor, 1)
-
-typedef basic_bzip2_compressor<> bzip2_compressor;
-
-//
-// Template name: bzip2_decompressor
-// Description: Model of InputFilter and OutputFilter implementing
-// decompression using libbzip2.
-//
-template<typename Alloc = std::allocator<char> >
-struct basic_bzip2_decompressor
- : symmetric_filter<detail::bzip2_decompressor_impl<Alloc>, Alloc>
-{
-private:
- typedef detail::bzip2_decompressor_impl<Alloc> impl_type;
- typedef symmetric_filter<impl_type, Alloc> base_type;
-public:
- typedef typename base_type::char_type char_type;
- typedef typename base_type::category category;
- basic_bzip2_decompressor( bool small = bzip2::default_small,
- int buffer_size = default_device_buffer_size );
-};
-BOOST_IOSTREAMS_PIPABLE(basic_bzip2_decompressor, 1)
-
-typedef basic_bzip2_decompressor<> bzip2_decompressor;
-
-//----------------------------------------------------------------------------//
-
-//------------------Implementation of bzip2_allocator-------------------------//
-
-namespace detail {
-
-template<typename Alloc, typename Base>
-void* bzip2_allocator<Alloc, Base>::allocate(void* self, int items, int size)
-{
- size_type len = items * size;
- char* ptr =
- static_cast<allocator_type*>(self)->allocate
- (len + sizeof(size_type)
- #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
- , (char*)0
- #endif
- );
- *reinterpret_cast<size_type*>(ptr) = len;
- return ptr + sizeof(size_type);
-}
-
-template<typename Alloc, typename Base>
-void bzip2_allocator<Alloc, Base>::deallocate(void* self, void* address)
-{
- char* ptr = reinterpret_cast<char*>(address) - sizeof(size_type);
- size_type len = *reinterpret_cast<size_type*>(ptr) + sizeof(size_type);
- static_cast<allocator_type*>(self)->deallocate(ptr, len);
-}
-
-//------------------Implementation of bzip2_compressor_impl-------------------//
-
-template<typename Alloc>
-bzip2_compressor_impl<Alloc>::bzip2_compressor_impl(const bzip2_params& p)
- : bzip2_base(p) { }
-
-template<typename Alloc>
-bool bzip2_compressor_impl<Alloc>::filter
- ( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool flush )
-{
- if (!ready()) init();
- before(src_begin, src_end, dest_begin, dest_end);
- int result = compress(flush ? bzip2::finish : bzip2::run);
- after(src_begin, dest_begin);
- bzip2_error::check(result);
- return result != bzip2::stream_end;
-}
-
-template<typename Alloc>
-void bzip2_compressor_impl<Alloc>::close()
-{
- end(true);
-}
-
-template<typename Alloc>
-inline void bzip2_compressor_impl<Alloc>::init()
-{ bzip2_base::init(true, static_cast<bzip2_allocator<Alloc>&>(*this)); }
-
-//------------------Implementation of bzip2_decompressor_impl-----------------//
-
-template<typename Alloc>
-bzip2_decompressor_impl<Alloc>::bzip2_decompressor_impl(bool small)
- : bzip2_base(bzip2_params(small)), eof_(false) { }
-
-template<typename Alloc>
-bool bzip2_decompressor_impl<Alloc>::filter
- ( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool /* flush */ )
-{
- if (!ready())
- init();
- if (eof_)
- return false;
- before(src_begin, src_end, dest_begin, dest_end);
- int result = decompress();
- after(src_begin, dest_begin);
- bzip2_error::check(result);
- return !(eof_ = result == bzip2::stream_end);
-}
-
-template<typename Alloc>
-void bzip2_decompressor_impl<Alloc>::close() { end(false); eof_ = false; }
-
-template<typename Alloc>
-inline void bzip2_decompressor_impl<Alloc>::init()
-{ bzip2_base::init(false, static_cast<bzip2_allocator<Alloc>&>(*this)); }
-} // End namespace detail.
-
-//------------------Implementation of bzip2_decompressor----------------------//
-
-template<typename Alloc>
-basic_bzip2_compressor<Alloc>::basic_bzip2_compressor
- (const bzip2_params& p, int buffer_size)
- : base_type(buffer_size, p)
- { }
-
-//------------------Implementation of bzip2_decompressor----------------------//
-
-template<typename Alloc>
-basic_bzip2_decompressor<Alloc>::basic_bzip2_decompressor
- (bool small, int buffer_size)
- : base_type(buffer_size, small)
- { }
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // Pops abi_suffix.hpp pragmas.
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_BZIP2_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains the definitions of the class templates gzip_compressor and
-// gzip_decompressor for reading and writing files in the gzip file format
-// (RFC 1952). Based in part on work of Jonathan de Halleux; see [...]
-
-#ifndef BOOST_IOSTREAMS_GZIP_HPP_INCLUDED
-#define BOOST_IOSTREAMS_GZIP_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // STATIC_CONSTANT, STDC_NAMESPACE,
- // DINKUMWARE_STDLIB, __STL_CONFIG_H.
-#include <algorithm> // min.
-#include <cstdio> // EOF.
-#include <cstddef> // size_t.
-#include <ctime> // std::time_t.
-#include <memory> // allocator.
-#include <boost/config.hpp> // Put size_t in std.
-#include <boost/detail/workaround.hpp>
-#include <boost/cstdint.hpp> // uint8_t, uint32_t.
-#include <boost/iostreams/constants.hpp> // buffer size.
-#include <boost/iostreams/detail/adapter/non_blocking_adapter.hpp>
-#include <boost/iostreams/detail/adapter/range_adapter.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure.
-#include <boost/iostreams/operations.hpp>
-#include <boost/iostreams/device/back_inserter.hpp>
-#include <boost/iostreams/filter/zlib.hpp>
-#include <boost/iostreams/pipeline.hpp>
-
-// Must come last.
-#if defined(BOOST_MSVC)
-# pragma warning(push)
-# pragma warning(disable: 4309) // Truncation of constant value.
-#endif
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std { using ::time_t; }
-#endif
-
-namespace boost { namespace iostreams {
-
-namespace gzip {
-
-using namespace boost::iostreams::zlib;
-
- // Error codes used by gzip_error.
-
-const int zlib_error = 1;
-const int bad_crc = 2; // Recorded crc doesn't match data.
-const int bad_length = 3; // Recorded length doesn't match data.
-const int bad_header = 4; // Malformed header.
-const int bad_footer = 5; // Malformed footer.
-
-namespace magic {
-
- // Magic numbers used by gzip header.
-
-const int id1 = 0x1f;
-const int id2 = 0x8b;
-
-} // End namespace magic.
-
-namespace method {
-
- // Codes used for the 'CM' byte of the gzip header.
-
-const int deflate = 8;
-
-} // End namespace method.
-
-namespace flags {
-
- // Codes used for the 'FLG' byte of the gzip header.
-
-const int text = 1;
-const int header_crc = 2;
-const int extra = 4;
-const int name = 8;
-const int comment = 16;
-
-} // End namespace flags.
-
-namespace extra_flags {
-
- // Codes used for the 'XFL' byte of the gzip header.
-
-const int best_compression = 2;
-const int best_speed = 4;
-
-} // End namespace extra_flags.
-
- // Codes used for the 'OS' byte of the gzip header.
-
-const int os_fat = 0;
-const int os_amiga = 1;
-const int os_vms = 2;
-const int os_unix = 3;
-const int os_vm_cms = 4;
-const int os_atari = 5;
-const int os_hpfs = 6;
-const int os_macintosh = 7;
-const int os_z_system = 8;
-const int os_cp_m = 9;
-const int os_tops_20 = 10;
-const int os_ntfs = 11;
-const int os_qdos = 12;
-const int os_acorn = 13;
-const int os_unknown = 255;
-
-} // End namespace gzip.
-
-//
-// Class name: gzip_params.
-// Description: Subclass of zlib_params with an additional field
-// representing a file name.
-//
-struct gzip_params : zlib_params {
-
- // Non-explicit constructor.
- gzip_params( int level = gzip::default_compression,
- int method = gzip::deflated,
- int window_bits = gzip::default_window_bits,
- int mem_level = gzip::default_mem_level,
- int strategy = gzip::default_strategy,
- std::string file_name = "",
- std::string comment = "",
- std::time_t mtime = 0 )
- : zlib_params(level, method, window_bits, mem_level, strategy),
- file_name(file_name), mtime(mtime)
- { }
- std::string file_name;
- std::string comment;
- std::time_t mtime;
-};
-
-//
-// Class name: gzip_error.
-// Description: Subclass of std::ios_base::failure thrown to indicate
-// zlib errors other than out-of-memory conditions.
-//
-class gzip_error : public BOOST_IOSTREAMS_FAILURE {
-public:
- explicit gzip_error(int error)
- : BOOST_IOSTREAMS_FAILURE("gzip error"),
- error_(error), zlib_error_code_(zlib::okay) { }
- explicit gzip_error(const zlib_error& e)
- : BOOST_IOSTREAMS_FAILURE("gzip error"),
- error_(gzip::zlib_error), zlib_error_code_(e.error())
- { }
- int error() const { return error_; }
- int zlib_error_code() const { return zlib_error_code_; }
-private:
- int error_;
- int zlib_error_code_;
-};
-
-//
-// Template name: gzip_compressor
-// Description: Model of OutputFilter implementing compression in the
-// gzip format.
-//
-template<typename Alloc = std::allocator<char> >
-class basic_gzip_compressor : basic_zlib_compressor<Alloc> {
-private:
- typedef basic_zlib_compressor<Alloc> base_type;
-public:
- typedef char char_type;
- struct category
- : dual_use,
- filter_tag,
- multichar_tag,
- closable_tag
- { };
- basic_gzip_compressor( const gzip_params& = gzip::default_compression,
- int buffer_size = default_device_buffer_size );
-
- template<typename Source>
- std::streamsize read(Source& src, char_type* s, std::streamsize n)
- {
- using namespace std;
- streamsize result = 0;
-
- // Read header.
- if (!(flags_ & f_header_done))
- result += read_string(s, n, header_);
-
- // Read body.
- if (!(flags_ & f_body_done)) {
-
- // Read from basic_zlib_filter.
- streamsize amt = base_type::read(src, s + result, n - result);
- if (amt != -1) {
- result += amt;
- if (amt < n - result) { // Double-check for EOF.
- amt = base_type::read(src, s + result, n - result);
- if (amt != -1)
- result += amt;
- }
- }
- if (amt == -1)
- prepare_footer();
- }
-
- // Read footer.
- if ((flags_ & f_body_done) != 0 && result < n)
- result += read_string(s + result, n - result, footer_);
-
- return result != 0 ? result : -1;
- }
-
- template<typename Sink>
- std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
- {
- if (!(flags_ & f_header_done)) {
- std::streamsize amt =
- static_cast<std::streamsize>(header_.size() - offset_);
- offset_ += boost::iostreams::write(snk, header_.data() + offset_, amt);
- if (offset_ == header_.size())
- flags_ |= f_header_done;
- else
- return 0;
- }
- return base_type::write(snk, s, n);
- }
-
- template<typename Sink>
- void close(Sink& snk, BOOST_IOS::openmode m)
- {
- namespace io = boost::iostreams;
-
- if (m & BOOST_IOS::out) {
-
- // Close zlib compressor.
- base_type::close(snk, BOOST_IOS::out);
-
- if (flags_ & f_header_done) {
-
- // Write final fields of gzip file format.
- write_long(this->crc(), snk);
- write_long(this->total_in(), snk);
- }
-
- }
- #if BOOST_WORKAROUND(__GNUC__, == 2) && defined(__STL_CONFIG_H) || \
- BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) \
- /**/
- footer_.erase(0, std::string::npos);
- #else
- footer_.clear();
- #endif
- offset_ = 0;
- flags_ = 0;
- }
-private:
- static gzip_params normalize_params(gzip_params p);
- void prepare_footer();
- std::streamsize read_string(char* s, std::streamsize n, std::string& str);
-
- template<typename Sink>
- static void write_long(long n, Sink& next)
- {
- boost::iostreams::put(next, static_cast<char>(0xFF & n));
- boost::iostreams::put(next, static_cast<char>(0xFF & (n >> 8)));
- boost::iostreams::put(next, static_cast<char>(0xFF & (n >> 16)));
- boost::iostreams::put(next, static_cast<char>(0xFF & (n >> 24)));
- }
-
- enum flag_type {
- f_header_done = 1,
- f_body_done = f_header_done << 1,
- f_footer_done = f_body_done << 1
- };
- std::string header_;
- std::string footer_;
- std::size_t offset_;
- int flags_;
-};
-BOOST_IOSTREAMS_PIPABLE(basic_gzip_compressor, 1)
-
-typedef basic_gzip_compressor<> gzip_compressor;
-
-//
-// Template name: basic_gzip_decompressor
-// Description: Model of InputFilter implementing compression in the
-// gzip format.
-//
-template<typename Alloc = std::allocator<char> >
-class basic_gzip_decompressor : basic_zlib_decompressor<Alloc> {
-public:
- typedef char char_type;
- struct category
- : multichar_input_filter_tag,
- closable_tag
- { };
- basic_gzip_decompressor( int window_bits = gzip::default_window_bits,
- int buffer_size = default_device_buffer_size );
-
- template<typename Source>
- std::streamsize read(Source& src, char_type* s, std::streamsize n)
- {
- if ((flags_ & f_header_read) == 0) {
- non_blocking_adapter<Source> nb(src);
- read_header(nb);
- flags_ |= f_header_read;
- }
-
- if ((flags_ & f_footer_read) != 0)
- return -1;
-
- try {
- std::streamsize result = 0;
- std::streamsize amt;
- if ((amt = base_type::read(src, s, n)) != -1) {
- result += amt;
- if (amt < n) { // Double check for EOF.
- amt = base_type::read(src, s + result, n - result);
- if (amt != -1)
- result += amt;
- }
- }
- if (amt == -1) {
- non_blocking_adapter<Source> nb(src);
- read_footer(nb);
- flags_ |= f_footer_read;
- }
- return result;
- } catch (const zlib_error& e) {
- throw gzip_error(e);
- }
- }
-
- template<typename Source>
- void close(Source& src)
- {
- try {
- base_type::close(src, BOOST_IOS::in);
- flags_ = 0;
- } catch (const zlib_error& e) {
- throw gzip_error(e);
- }
- }
-
- std::string file_name() const { return file_name_; }
- std::string comment() const { return comment_; }
- bool text() const { return (flags_ & gzip::flags::text) != 0; }
- int os() const { return os_; }
- std::time_t mtime() const { return mtime_; }
-private:
- typedef basic_zlib_decompressor<Alloc> base_type;
- typedef BOOST_IOSTREAMS_CHAR_TRAITS(char) traits_type;
- static bool is_eof(int c) { return traits_type::eq_int_type(c, EOF); }
- static gzip_params make_params(int window_bits);
-
- template<typename Source>
- static uint8_t read_uint8(Source& src, int error)
- {
- int c;
- if ((c = boost::iostreams::get(src)) == EOF || c == WOULD_BLOCK)
- throw gzip_error(error);
- return static_cast<uint8_t>(traits_type::to_char_type(c));
- }
-
- template<typename Source>
- static uint32_t read_uint32(Source& src, int error)
- {
- uint8_t b1 = read_uint8(src, error);
- uint8_t b2 = read_uint8(src, error);
- uint8_t b3 = read_uint8(src, error);
- uint8_t b4 = read_uint8(src, error);
- return b1 + (b2 << 8) + (b3 << 16) + (b4 << 24);
- }
-
- template<typename Source>
- std::string read_string(Source& src)
- {
- std::string result;
- while (true) {
- int c;
- if (is_eof(c = boost::iostreams::get(src)))
- throw gzip_error(gzip::bad_header);
- else if (c == 0)
- return result;
- else
- result += static_cast<char>(c);
- }
- }
-
- template<typename Source>
- void read_header(Source& src) // Source is non-blocking.
- {
- // Reset saved values.
- #if BOOST_WORKAROUND(__GNUC__, == 2) && defined(__STL_CONFIG_H) || \
- BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1) \
- /**/
- file_name_.erase(0, std::string::npos);
- comment_.erase(0, std::string::npos);
- #else
- file_name_.clear();
- comment_.clear();
- #endif
- os_ = gzip::os_unknown;
- mtime_ = 0;
-
- int flags;
-
- // Read header, without checking header crc.
- if ( boost::iostreams::get(src) != gzip::magic::id1 || // ID1.
- boost::iostreams::get(src) != gzip::magic::id2 || // ID2.
- is_eof(boost::iostreams::get(src)) || // CM.
- is_eof(flags = boost::iostreams::get(src)) ) // FLG.
- {
- throw gzip_error(gzip::bad_header);
- }
- mtime_ = read_uint32(src, gzip::bad_header); // MTIME.
- read_uint8(src, gzip::bad_header); // XFL.
- os_ = read_uint8(src, gzip::bad_header); // OS.
- if (flags & boost::iostreams::gzip::flags::text)
- flags_ |= f_text;
-
- // Skip extra field. (From J. Halleaux; see note at top.)
- if (flags & gzip::flags::extra) {
- int length =
- static_cast<int>(
- read_uint8(src, gzip::bad_header) +
- (read_uint8(src, gzip::bad_header) << 8)
- );
- // length is garbage if EOF but the loop below will quit anyway.
- do { }
- while (length-- != 0 && !is_eof(boost::iostreams::get(src)));
- }
-
- if (flags & gzip::flags::name) // Read file name.
- file_name_ = read_string(src);
- if (flags & gzip::flags::comment) // Read comment.
- comment_ = read_string(src);
- if (flags & gzip::flags::header_crc) { // Skip header crc.
- read_uint8(src, gzip::bad_header);
- read_uint8(src, gzip::bad_header);
- }
- }
-
- template<typename Source>
- void read_footer(Source& src)
- {
- typename base_type::string_type footer =
- this->unconsumed_input();
- int c;
- while (!is_eof(c = boost::iostreams::get(src)))
- footer += c;
- detail::range_adapter<input, std::string>
- rng(footer.begin(), footer.end());
- if (read_uint32(rng, gzip::bad_footer) != this->crc())
- throw gzip_error(gzip::bad_crc);
- if (static_cast<int>(read_uint32(rng, gzip::bad_footer)) != this->total_out())
- throw gzip_error(gzip::bad_length);
- }
- enum flag_type {
- f_header_read = 1,
- f_footer_read = f_header_read << 1,
- f_text = f_footer_read << 1
- };
- std::string file_name_;
- std::string comment_;
- int os_;
- std::time_t mtime_;
- int flags_;
-};
-BOOST_IOSTREAMS_PIPABLE(basic_gzip_decompressor, 1)
-
-typedef basic_gzip_decompressor<> gzip_decompressor;
-
-//------------------Implementation of gzip_compressor-------------------------//
-
-template<typename Alloc>
-basic_gzip_compressor<Alloc>::basic_gzip_compressor
- (const gzip_params& p, int buffer_size)
- : base_type(normalize_params(p), buffer_size),
- offset_(0), flags_(0)
-{
- // Calculate gzip header.
- bool has_name = !p.file_name.empty();
- bool has_comment = !p.comment.empty();
-
- std::string::size_type length =
- 10 +
- (has_name ? p.file_name.size() + 1 : 0) +
- (has_comment ? p.comment.size() + 1 : 0);
- // + 2; // Header crc confuses gunzip.
- int flags =
- //gzip::flags::header_crc +
- (has_name ? gzip::flags::name : 0) +
- (has_comment ? gzip::flags::comment : 0);
- int extra_flags =
- ( p.level == zlib::best_compression ?
- gzip::extra_flags::best_compression :
- 0 ) +
- ( p.level == zlib::best_speed ?
- gzip::extra_flags::best_speed :
- 0 );
- header_.reserve(length);
- header_ += gzip::magic::id1; // ID1.
- header_ += gzip::magic::id2; // ID2.
- header_ += gzip::method::deflate; // CM.
- header_ += static_cast<char>(flags); // FLG.
- header_ += static_cast<char>(0xFF & p.mtime); // MTIME.
- header_ += static_cast<char>(0xFF & (p.mtime >> 8));
- header_ += static_cast<char>(0xFF & (p.mtime >> 16));
- header_ += static_cast<char>(0xFF & (p.mtime >> 24));
- header_ += static_cast<char>(extra_flags); // XFL.
- header_ += static_cast<char>(gzip::os_unknown); // OS.
- if (has_name) {
- header_ += p.file_name;
- header_ += '\0';
- }
- if (has_comment) {
- header_ += p.comment;
- header_ += '\0';
- }
-}
-
-template<typename Alloc>
-gzip_params basic_gzip_compressor<Alloc>::normalize_params(gzip_params p)
-{
- p.noheader = true;
- p.calculate_crc = true;
- return p;
-}
-
-template<typename Alloc>
-void basic_gzip_compressor<Alloc>::prepare_footer()
-{
- boost::iostreams::back_insert_device<std::string> out(footer_);
- write_long(this->crc(), out);
- write_long(this->total_in(), out);
- flags_ |= f_body_done;
- offset_ = 0;
-}
-
-template<typename Alloc>
-std::streamsize basic_gzip_compressor<Alloc>::read_string
- (char* s, std::streamsize n, std::string& str)
-{
- using namespace std;
- streamsize avail =
- static_cast<streamsize>(str.size() - offset_);
- streamsize amt = (std::min)(avail, n);
- std::copy( str.data() + offset_,
- str.data() + offset_ + amt,
- s );
- offset_ += amt;
- if ( !(flags_ & f_header_done) &&
- offset_ == static_cast<std::size_t>(str.size()) )
- {
- flags_ |= f_header_done;
- }
- return amt;
-}
-
-//------------------Implementation of gzip_decompressor-----------------------//
-
-template<typename Alloc>
-basic_gzip_decompressor<Alloc>::basic_gzip_decompressor
- (int window_bits, int buffer_size)
- : base_type(make_params(window_bits), buffer_size),
- os_(gzip::os_unknown), mtime_(0), flags_(0)
- { }
-
-template<typename Alloc>
-gzip_params basic_gzip_decompressor<Alloc>::make_params(int window_bits)
-{
- gzip_params p;
- p.window_bits = window_bits;
- p.noheader = true;
- p.calculate_crc = true;
- return p;
-}
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#if defined(BOOST_MSVC)
-# pragma warning(pop)
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_GZIP_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Contains the definitions of the class templates symmetric_filter,
-// which models DualUseFilter based on a model of the Symmetric Filter.
-
-//
-// Roughly, a Symmetric Filter is a class type with the following interface:
-//
-// struct symmetric_filter {
-// typedef xxx char_type;
-//
-// bool filter( const char*& begin_in, const char* end_in,
-// char*& begin_out, char* end_out, bool flush )
-// {
-// // Consume as many characters as possible from the interval
-// // [begin_in, end_in), without exhausting the output range
-// // [begin_out, end_out). If flush is true, write as mush output
-// // as possible.
-// // A return value of true indicates that filter should be called
-// // again. More precisely, if flush is false, a return value of
-// // false indicates that the natural end of stream has been reached
-// // and that all filtered data has been forwarded; if flush is
-// // true, a return value of false indicates that all filtered data
-// // has been forwarded.
-// }
-// void close() { /* Reset filter's state. */ }
-// };
-//
-// Symmetric Filter filters need not be CopyConstructable.
-//
-
-#ifndef BOOST_IOSTREAMS_SYMMETRIC_FILTER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_SYMMETRIC_FILTER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cassert>
-#include <memory> // allocator, auto_ptr.
-#include <boost/config.hpp> // BOOST_DEDUCED_TYPENAME.
-#include <boost/iostreams/char_traits.hpp>
-#include <boost/iostreams/constants.hpp> // buffer size.
-#include <boost/iostreams/detail/buffer.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/closer.hpp>
-#include <boost/iostreams/detail/config/limits.hpp>
-#include <boost/iostreams/detail/template_params.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/iostreams/operations.hpp> // read, write.
-#include <boost/iostreams/pipeline.hpp>
-#include <boost/preprocessor/iteration/local.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/enum_binary_params.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/shared_ptr.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams {
-
-template< typename SymmetricFilter,
- typename Alloc =
- std::allocator<
- BOOST_DEDUCED_TYPENAME char_type_of<SymmetricFilter>::type
- > >
-class symmetric_filter {
-public:
- typedef typename char_type_of<SymmetricFilter>::type char_type;
- typedef std::basic_string<char_type> string_type;
- struct category
- : dual_use,
- filter_tag,
- multichar_tag,
- closable_tag
- { };
-
- // Expands to a sequence of ctors which forward to impl.
- #define BOOST_PP_LOCAL_MACRO(n) \
- BOOST_IOSTREAMS_TEMPLATE_PARAMS(n, T) \
- explicit symmetric_filter( \
- int buffer_size BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM_BINARY_PARAMS(n, const T, &t) ) \
- : pimpl_(new impl(buffer_size BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM_PARAMS(n, t))) \
- { } \
- /**/
- #define BOOST_PP_LOCAL_LIMITS (0, BOOST_IOSTREAMS_MAX_FORWARDING_ARITY)
- #include BOOST_PP_LOCAL_ITERATE()
- #undef BOOST_PP_LOCAL_MACRO
-
- template<typename Source>
- std::streamsize read(Source& src, char_type* s, std::streamsize n)
- {
- using namespace std;
- if (!(state() & f_read))
- begin_read();
-
- buffer_type& buf = pimpl_->buf_;
- int status = (state() & f_eof) != 0 ? f_eof : f_good;
- char_type *next_s = s,
- *end_s = s + n;
- while (true)
- {
- // Invoke filter if there are unconsumed characters in buffer or if
- // filter must be flushed.
- bool flush = status == f_eof;
- if (buf.ptr() != buf.eptr() || flush) {
- const char_type* next = buf.ptr();
- bool done =
- !filter().filter(next, buf.eptr(), next_s, end_s, flush);
- buf.ptr() = buf.data() + (next - buf.data());
- if (done)
- return detail::check_eof(static_cast<streamsize>(next_s - s));
- }
-
- // If no more characters are available without blocking, or
- // if read request has been satisfied, return.
- if ( status == f_would_block && buf.ptr() == buf.eptr() ||
- next_s == end_s )
- {
- return static_cast<streamsize>(next_s - s);
- }
-
- // Fill buffer.
- if (status == f_good)
- status = fill(src);
- }
- }
-
- template<typename Sink>
- std::streamsize write(Sink& snk, const char_type* s, std::streamsize n)
- {
- if (!(state() & f_write))
- begin_write();
-
- buffer_type& buf = pimpl_->buf_;
- const char_type *next_s, *end_s;
- for (next_s = s, end_s = s + n; next_s != end_s; ) {
- if (buf.ptr() == buf.eptr() && !flush(snk))
- break;
- filter().filter(next_s, end_s, buf.ptr(), buf.eptr(), false);
- }
- return static_cast<std::streamsize>(next_s - s);
- }
-
- // Give detail::closer<> permission to call close().
- typedef symmetric_filter<SymmetricFilter, Alloc> self;
- friend struct detail::closer<self>;
-
- template<typename Sink>
- void close(Sink& snk, BOOST_IOS::openmode which)
- {
- using namespace std;
- if ((state() & f_read) && (which & BOOST_IOS::in))
- close();
- if ((state() & f_write) && (which & BOOST_IOS::out)) {
-
- // Repeatedly invoke filter() with no input.
- detail::closer<self> closer(*this);
- buffer_type& buf = pimpl_->buf_;
- char dummy;
- const char* end = &dummy;
- bool again = true;
- while (again) {
- if (buf.ptr() != buf.eptr())
- again = filter().filter(end, end, buf.ptr(), buf.eptr(), true);
- flush(snk);
- }
- }
- }
- SymmetricFilter& filter() { return *pimpl_; }
- string_type unconsumed_input() const;
-
-// Give impl access to buffer_type on Tru64
-#if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
- private:
-#endif
- typedef detail::buffer<char_type, Alloc> buffer_type;
-private:
- buffer_type& buf() { return pimpl_->buf_; }
- const buffer_type& buf() const { return pimpl_->buf_; }
- int& state() { return pimpl_->state_; }
- void begin_read();
- void begin_write();
-
- template<typename Source>
- int fill(Source& src)
- {
- std::streamsize amt = iostreams::read(src, buf().data(), buf().size());
- if (amt == -1) {
- state() |= f_eof;
- return f_eof;
- }
- buf().set(0, amt);
- return amt == buf().size() ? f_good : f_would_block;
- }
-
- // Attempts to write the contents of the buffer the given Sink.
- // Returns true if at least on character was written.
- template<typename Sink>
- bool flush(Sink& snk)
- {
- typedef typename iostreams::category_of<Sink>::type category;
- typedef is_convertible<category, output> can_write;
- return flush(snk, can_write());
- }
-
- template<typename Sink>
- bool flush(Sink& snk, mpl::true_)
- {
- using std::streamsize;
- typedef char_traits<char_type> traits_type;
- streamsize amt =
- static_cast<streamsize>(buf().ptr() - buf().data());
- streamsize result =
- boost::iostreams::write(snk, buf().data(), amt);
- if (result < amt && result > 0)
- traits_type::move(buf().data(), buf().data() + result, amt - result);
- buf().set(amt - result, buf().size());
- return result != 0;
- }
-
- template<typename Sink>
- bool flush(Sink& snk, mpl::false_) { return true;}
-
- void close();
-
- enum flag_type {
- f_read = 1,
- f_write = f_read << 1,
- f_eof = f_write << 1,
- f_good,
- f_would_block
- };
-
- struct impl : SymmetricFilter {
-
- // Expands to a sequence of ctors which forward to SymmetricFilter.
- #define BOOST_PP_LOCAL_MACRO(n) \
- BOOST_IOSTREAMS_TEMPLATE_PARAMS(n, T) \
- impl( int buffer_size BOOST_PP_COMMA_IF(n) \
- BOOST_PP_ENUM_BINARY_PARAMS(n, const T, &t) ) \
- : SymmetricFilter(BOOST_PP_ENUM_PARAMS(n, t)), \
- buf_(buffer_size), state_(0) \
- { } \
- /**/
- #define BOOST_PP_LOCAL_LIMITS (0, BOOST_IOSTREAMS_MAX_FORWARDING_ARITY)
- #include BOOST_PP_LOCAL_ITERATE()
- #undef BOOST_PP_LOCAL_MACRO
-
- buffer_type buf_;
- int state_;
- };
-
- shared_ptr<impl> pimpl_;
-};
-BOOST_IOSTREAMS_PIPABLE(symmetric_filter, 2)
-
-//------------------Implementation of symmetric_filter----------------//
-
-template<typename SymmetricFilter, typename Alloc>
-void symmetric_filter<SymmetricFilter, Alloc>::begin_read()
-{
- assert(!(state() & f_write));
- state() |= f_read;
- buf().set(0, 0);
-}
-
-template<typename SymmetricFilter, typename Alloc>
-void symmetric_filter<SymmetricFilter, Alloc>::begin_write()
-{
- assert(!(state() & f_read));
- state() |= f_write;
- buf().set(0, buf().size());
-}
-
-template<typename SymmetricFilter, typename Alloc>
-void symmetric_filter<SymmetricFilter, Alloc>::close()
-{
- state() = 0;
- buf().set(0, 0);
- filter().close();
-}
-
-template<typename SymmetricFilter, typename Alloc>
-typename symmetric_filter<SymmetricFilter, Alloc>::string_type
-symmetric_filter<SymmetricFilter, Alloc>::unconsumed_input() const
-{ return string_type(buf().ptr(), buf().eptr()); }
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_SYMMETRIC_FILTER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Note: custom allocators are not supported on VC6, since that compiler
-// had trouble finding the function zlib_base::do_init.
-
-#ifndef BOOST_IOSTREAMS_ZLIB_HPP_INCLUDED
-#define BOOST_IOSTREAMS_ZLIB_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <cassert>
-#include <iosfwd> // streamsize.
-#include <memory> // allocator, bad_alloc.
-#include <new>
-#include <boost/config.hpp> // MSVC, STATIC_CONSTANT, DEDUCED_TYPENAME, DINKUM.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/constants.hpp> // buffer size.
-#include <boost/iostreams/detail/config/auto_link.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/config/zlib.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure, streamsize.
-#include <boost/iostreams/filter/symmetric.hpp>
-#include <boost/iostreams/pipeline.hpp>
-#include <boost/type_traits/is_same.hpp>
-
-// Must come last.
-#ifdef BOOST_MSVC
-# pragma warning(push)
-# pragma warning(disable:4251 4231 4660) // Dependencies not exported.
-#endif
-#include <boost/config/abi_prefix.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace zlib {
- // Typedefs
-
-typedef unsigned int uint;
-typedef unsigned char byte;
-typedef unsigned long ulong;
-
-typedef void* (*alloc_func)(void*, zlib::uint, zlib::uint);
-typedef void (*free_func)(void*, void*);
-
- // Compression levels
-
-BOOST_IOSTREAMS_DECL extern const int no_compression;
-BOOST_IOSTREAMS_DECL extern const int best_speed;
-BOOST_IOSTREAMS_DECL extern const int best_compression;
-BOOST_IOSTREAMS_DECL extern const int default_compression;
-
- // Compression methods
-
-BOOST_IOSTREAMS_DECL extern const int deflated;
-
- // Compression strategies
-
-BOOST_IOSTREAMS_DECL extern const int default_strategy;
-BOOST_IOSTREAMS_DECL extern const int filtered;
-BOOST_IOSTREAMS_DECL extern const int huffman_only;
-
- // Status codes
-
-BOOST_IOSTREAMS_DECL extern const int okay;
-BOOST_IOSTREAMS_DECL extern const int stream_end;
-BOOST_IOSTREAMS_DECL extern const int stream_error;
-BOOST_IOSTREAMS_DECL extern const int version_error;
-BOOST_IOSTREAMS_DECL extern const int data_error;
-BOOST_IOSTREAMS_DECL extern const int mem_error;
-BOOST_IOSTREAMS_DECL extern const int buf_error;
-
- // Flush codes
-
-BOOST_IOSTREAMS_DECL extern const int finish;
-BOOST_IOSTREAMS_DECL extern const int no_flush;
-BOOST_IOSTREAMS_DECL extern const int sync_flush;
-
- // Code for current OS
-
-//BOOST_IOSTREAMS_DECL extern const int os_code;
-
- // Null pointer constant.
-
-const int null = 0;
-
- // Default values
-
-const int default_window_bits = 15;
-const int default_mem_level = 8;
-const bool default_crc = false;
-const bool default_noheader = false;
-
-} // End namespace zlib.
-
-//
-// Class name: zlib_params.
-// Description: Encapsulates the parameters passed to deflateInit2
-// and inflateInit2 to customize compression and decompression.
-//
-struct zlib_params {
-
- // Non-explicit constructor.
- zlib_params( int level = zlib::default_compression,
- int method = zlib::deflated,
- int window_bits = zlib::default_window_bits,
- int mem_level = zlib::default_mem_level,
- int strategy = zlib::default_strategy,
- bool noheader = zlib::default_noheader,
- bool calculate_crc = zlib::default_crc )
- : level(level), method(method), window_bits(window_bits),
- mem_level(mem_level), strategy(strategy),
- noheader(noheader), calculate_crc(calculate_crc)
- { }
- int level;
- int method;
- int window_bits;
- int mem_level;
- int strategy;
- bool noheader;
- bool calculate_crc;
-};
-
-//
-// Class name: zlib_error.
-// Description: Subclass of std::ios::failure thrown to indicate
-// zlib errors other than out-of-memory conditions.
-//
-class BOOST_IOSTREAMS_DECL zlib_error : public BOOST_IOSTREAMS_FAILURE {
-public:
- explicit zlib_error(int error);
- int error() const { return error_; }
- static void check(int error);
-private:
- int error_;
-};
-
-namespace detail {
-
-template<typename Alloc>
-struct zlib_allocator_traits {
-#ifndef BOOST_NO_STD_ALLOCATOR
- typedef typename Alloc::template rebind<char>::other type;
-#else
- typedef std::allocator<char> type;
-#endif
-};
-
-template< typename Alloc,
- typename Base = // VC6 workaround (C2516)
- BOOST_DEDUCED_TYPENAME zlib_allocator_traits<Alloc>::type >
-struct zlib_allocator : private Base {
-private:
- typedef typename Base::size_type size_type;
-public:
- BOOST_STATIC_CONSTANT(bool, custom =
- (!is_same<std::allocator<char>, Base>::value));
- typedef typename zlib_allocator_traits<Alloc>::type allocator_type;
- static void* allocate(void* self, zlib::uint items, zlib::uint size);
- static void deallocate(void* self, void* address);
-};
-
-class BOOST_IOSTREAMS_DECL zlib_base {
-public:
- typedef char char_type;
-protected:
- zlib_base();
- ~zlib_base();
- void* stream() { return stream_; }
- template<typename Alloc>
- void init( const zlib_params& p,
- bool compress,
- zlib_allocator<Alloc>& zalloc )
- {
- bool custom = zlib_allocator<Alloc>::custom;
- do_init( p, compress,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- custom ? zlib_allocator<Alloc>::allocate : 0,
- custom ? zlib_allocator<Alloc>::deallocate : 0,
- #endif
- &zalloc );
- }
- void before( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end );
- void after( const char*& src_begin, char*& dest_begin,
- bool compress );
- int deflate(int flush);
- int inflate(int flush);
- void reset(bool compress, bool realloc);
-public:
- zlib::ulong crc() const { return crc_; }
- int total_in() const { return total_in_; }
- int total_out() const { return total_out_; }
-private:
- void do_init( const zlib_params& p, bool compress,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- zlib::alloc_func,
- zlib::free_func,
- #endif
- void* derived );
- void* stream_; // Actual type: z_stream*.
- bool calculate_crc_;
- zlib::ulong crc_;
- int total_in_;
- int total_out_;
-};
-
-//
-// Template name: zlib_compressor_impl
-// Description: Model of C-Style Filte implementing compression by
-// delegating to the zlib function deflate.
-//
-template<typename Alloc = std::allocator<char> >
-class zlib_compressor_impl : public zlib_base, public zlib_allocator<Alloc> {
-public:
- zlib_compressor_impl(const zlib_params& = zlib::default_compression);
- ~zlib_compressor_impl();
- bool filter( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool flush );
- void close();
-};
-
-//
-// Template name: zlib_compressor
-// Description: Model of C-Style Filte implementing decompression by
-// delegating to the zlib function inflate.
-//
-template<typename Alloc = std::allocator<char> >
-class zlib_decompressor_impl : public zlib_base, public zlib_allocator<Alloc> {
-public:
- zlib_decompressor_impl(const zlib_params&);
- zlib_decompressor_impl(int window_bits = zlib::default_window_bits);
- ~zlib_decompressor_impl();
- bool filter( const char*& begin_in, const char* end_in,
- char*& begin_out, char* end_out, bool flush );
- void close();
-};
-
-} // End namespace detail.
-
-//
-// Template name: zlib_compressor
-// Description: Model of InputFilter and OutputFilter implementing
-// compression using zlib.
-//
-template<typename Alloc = std::allocator<char> >
-struct basic_zlib_compressor
- : symmetric_filter<detail::zlib_compressor_impl<Alloc>, Alloc>
-{
-private:
- typedef detail::zlib_compressor_impl<Alloc> impl_type;
- typedef symmetric_filter<impl_type, Alloc> base_type;
-public:
- typedef typename base_type::char_type char_type;
- typedef typename base_type::category category;
- basic_zlib_compressor( const zlib_params& = zlib::default_compression,
- int buffer_size = default_device_buffer_size );
- zlib::ulong crc() { return this->filter().crc(); }
- int total_in() { return this->filter().total_in(); }
-};
-BOOST_IOSTREAMS_PIPABLE(basic_zlib_compressor, 1)
-
-typedef basic_zlib_compressor<> zlib_compressor;
-
-//
-// Template name: zlib_decompressor
-// Description: Model of InputFilter and OutputFilter implementing
-// decompression using zlib.
-//
-template<typename Alloc = std::allocator<char> >
-struct basic_zlib_decompressor
- : symmetric_filter<detail::zlib_decompressor_impl<Alloc>, Alloc>
-{
-private:
- typedef detail::zlib_decompressor_impl<Alloc> impl_type;
- typedef symmetric_filter<impl_type, Alloc> base_type;
-public:
- typedef typename base_type::char_type char_type;
- typedef typename base_type::category category;
- basic_zlib_decompressor( int window_bits = zlib::default_window_bits,
- int buffer_size = default_device_buffer_size );
- basic_zlib_decompressor( const zlib_params& p,
- int buffer_size = default_device_buffer_size );
- zlib::ulong crc() { return this->filter().crc(); }
- int total_out() { return this->filter().total_out(); }
-};
-BOOST_IOSTREAMS_PIPABLE(basic_zlib_decompressor, 1)
-
-typedef basic_zlib_decompressor<> zlib_decompressor;
-
-//----------------------------------------------------------------------------//
-
-//------------------Implementation of zlib_allocator--------------------------//
-
-namespace detail {
-
-template<typename Alloc, typename Base>
-void* zlib_allocator<Alloc, Base>::allocate
- (void* self, zlib::uint items, zlib::uint size)
-{
- size_type len = items * size;
- char* ptr =
- static_cast<allocator_type*>(self)->allocate
- (len + sizeof(size_type)
- #if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, == 1)
- , (char*)0
- #endif
- );
- *reinterpret_cast<size_type*>(ptr) = len;
- return ptr + sizeof(size_type);
-}
-
-template<typename Alloc, typename Base>
-void zlib_allocator<Alloc, Base>::deallocate(void* self, void* address)
-{
- char* ptr = reinterpret_cast<char*>(address) - sizeof(size_type);
- size_type len = *reinterpret_cast<size_type*>(ptr) + sizeof(size_type);
- static_cast<allocator_type*>(self)->deallocate(ptr, len);
-}
-
-//------------------Implementation of zlib_compressor_impl--------------------//
-
-template<typename Alloc>
-zlib_compressor_impl<Alloc>::zlib_compressor_impl(const zlib_params& p)
-{ init(p, true, static_cast<zlib_allocator<Alloc>&>(*this)); }
-
-template<typename Alloc>
-zlib_compressor_impl<Alloc>::~zlib_compressor_impl()
-{ reset(true, false); }
-
-template<typename Alloc>
-bool zlib_compressor_impl<Alloc>::filter
- ( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool flush )
-{
- before(src_begin, src_end, dest_begin, dest_end);
- int result = deflate(flush ? zlib::finish : zlib::no_flush);
- after(src_begin, dest_begin, true);
- zlib_error::check(result);
- return result != zlib::stream_end;
-}
-
-template<typename Alloc>
-void zlib_compressor_impl<Alloc>::close() { reset(true, true); }
-
-//------------------Implementation of zlib_decompressor_impl------------------//
-
-template<typename Alloc>
-zlib_decompressor_impl<Alloc>::zlib_decompressor_impl(const zlib_params& p)
-{ init(p, false, static_cast<zlib_allocator<Alloc>&>(*this)); }
-
-template<typename Alloc>
-zlib_decompressor_impl<Alloc>::~zlib_decompressor_impl()
-{ reset(false, false); }
-
-template<typename Alloc>
-zlib_decompressor_impl<Alloc>::zlib_decompressor_impl(int window_bits)
-{
- zlib_params p;
- p.window_bits = window_bits;
- init(p, false, static_cast<zlib_allocator<Alloc>&>(*this));
-}
-
-template<typename Alloc>
-bool zlib_decompressor_impl<Alloc>::filter
- ( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end, bool /* flush */ )
-{
- before(src_begin, src_end, dest_begin, dest_end);
- int result = inflate(zlib::sync_flush);
- after(src_begin, dest_begin, false);
- zlib_error::check(result);
- return result != zlib::stream_end;
-}
-
-template<typename Alloc>
-void zlib_decompressor_impl<Alloc>::close() { reset(false, true); }
-
-} // End namespace detail.
-
-//------------------Implementation of zlib_decompressor-----------------------//
-
-template<typename Alloc>
-basic_zlib_compressor<Alloc>::basic_zlib_compressor
- (const zlib_params& p, int buffer_size)
- : base_type(buffer_size, p) { }
-
-//------------------Implementation of zlib_decompressor-----------------------//
-
-template<typename Alloc>
-basic_zlib_decompressor<Alloc>::basic_zlib_decompressor
- (int window_bits, int buffer_size)
- : base_type(buffer_size, window_bits) { }
-
-template<typename Alloc>
-basic_zlib_decompressor<Alloc>::basic_zlib_decompressor
- (const zlib_params& p, int buffer_size)
- : base_type(buffer_size, p) { }
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/config/abi_suffix.hpp> // Pops abi_suffix.hpp pragmas.
-#ifdef BOOST_MSVC
-# pragma warning(pop)
-#endif
-
-#endif // #ifndef BOOST_IOSTREAMS_ZLIB_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2004
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_FILTER_STREAM_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FILTER_STREAM_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <memory> // allocator.
-#include <boost/iostreams/detail/access_control.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/iostream.hpp> // standard streams.
-#include <boost/iostreams/detail/push.hpp>
-#include <boost/iostreams/detail/select.hpp>
-#include <boost/iostreams/detail/streambuf.hpp> // pubsync.
-#include <boost/iostreams/filtering_streambuf.hpp>
-#include <boost/mpl/and.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams {
-
-//--------------Definition of filtered_istream--------------------------------//
-
-namespace detail {
-
-template<typename Mode, typename Ch, typename Tr>
-struct filtering_stream_traits {
- typedef typename
- iostreams::select< // Disambiguation for Tru64
- mpl::and_<
- is_convertible<Mode, input>,
- is_convertible<Mode, output>
- >,
- BOOST_IOSTREAMS_BASIC_IOSTREAM(Ch, Tr),
- is_convertible<Mode, input>,
- BOOST_IOSTREAMS_BASIC_ISTREAM(Ch, Tr),
- else_,
- BOOST_IOSTREAMS_BASIC_OSTREAM(Ch, Tr)
- >::type type;
-};
-
-template<typename Chain, typename Access>
-class filtering_stream_base
- : public access_control<
- boost::iostreams::detail::chain_client<Chain>,
- Access
- >,
- public filtering_stream_traits<
- typename Chain::mode,
- typename Chain::char_type,
- typename Chain::traits_type
- >::type
-{
-public:
- typedef Chain chain_type;
- typedef access_control<
- boost::iostreams::detail::chain_client<Chain>,
- Access
- > client_type;
-protected:
- typedef typename
- filtering_stream_traits<
- typename Chain::mode,
- typename Chain::char_type,
- typename Chain::traits_type
- >::type stream_type;
- filtering_stream_base() : stream_type(0) { this->set_chain(&chain_); }
-private:
- void notify() { this->rdbuf(chain_.empty() ? 0 : &chain_.front()); }
- Chain chain_;
-};
-
-} // End namespace detail.
-
-//
-// Macro: BOOST_IOSTREAMS_DEFINE_FILTER_STREAM(name_, chain_type_, default_char_)
-// Description: Defines a template derived from std::basic_streambuf which uses
-// a chain to perform i/o. The template has the following parameters:
-// Mode - the i/o mode.
-// Ch - The character type.
-// Tr - The character traits type.
-// Alloc - The allocator type.
-// Access - Indicates accessibility of the chain interface; must be either
-// public_ or protected_; defaults to public_.
-// Macro parameters:
-// name_ - The name of the template to be defined.
-// chain_type_ - The name of the chain template.
-// default_char_ - The default value for the char template parameter.
-//
-#define BOOST_IOSTREAMS_DEFINE_FILTER_STREAM(name_, chain_type_, default_char_) \
- template< typename Mode, \
- typename Ch = default_char_, \
- typename Tr = BOOST_IOSTREAMS_CHAR_TRAITS(Ch), \
- typename Alloc = std::allocator<Ch>, \
- typename Access = public_ > \
- class name_ \
- : public boost::iostreams::detail::filtering_stream_base< \
- chain_type_<Mode, Ch, Tr, Alloc>, Access \
- > \
- { \
- public: \
- typedef Ch char_type; \
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr) \
- typedef Mode mode; \
- typedef chain_type_<Mode, Ch, Tr, Alloc> chain_type; \
- name_() { } \
- BOOST_IOSTREAMS_DEFINE_PUSH_CONSTRUCTOR(name_, mode, Ch, push_impl) \
- ~name_() { \
- if (this->is_complete()) \
- this->rdbuf()->BOOST_IOSTREAMS_PUBSYNC(); \
- } \
- private: \
- typedef access_control< \
- boost::iostreams::detail::chain_client< \
- chain_type_<Mode, Ch, Tr, Alloc> \
- >, \
- Access \
- > client_type; \
- template<typename T> \
- void push_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS()) \
- { client_type::push(t BOOST_IOSTREAMS_PUSH_ARGS()); } \
- }; \
- /**/
-BOOST_IOSTREAMS_DEFINE_FILTER_STREAM(filtering_stream, boost::iostreams::chain, char)
-BOOST_IOSTREAMS_DEFINE_FILTER_STREAM(wfiltering_stream, boost::iostreams::chain, wchar_t)
-
-typedef filtering_stream<input> filtering_istream;
-typedef filtering_stream<output> filtering_ostream;
-typedef wfiltering_stream<input> filtering_wistream;
-typedef wfiltering_stream<output> filtering_wostream;
-
-//----------------------------------------------------------------------------//
-
-} } // End namespace iostreams, boost
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC
-
-#endif // #ifndef BOOST_IOSTREAMS_FILTER_STREAM_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_FILTERING_STREAMBUF_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FILTERING_STREAMBUF_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <exception>
-#include <memory> // allocator.
-#include <boost/iostreams/chain.hpp>
-#include <boost/iostreams/detail/access_control.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/push.hpp>
-#include <boost/iostreams/detail/streambuf.hpp> // pubsync.
-#include <boost/iostreams/detail/streambuf/chainbuf.hpp>
-#include <boost/mpl/if.hpp>
-
-namespace boost { namespace iostreams {
-
-//
-// Macro: BOOST_IOSTREAMS_DEFINE_FILTERBUF(name_, chain_type_, default_char_)
-// Description: Defines a template derived from std::basic_streambuf which uses
-// a chain to perform i/o. The template has the following parameters:
-// Ch - The character type.
-// Tr - The character traits type.
-// Alloc - The allocator type.
-// Access - Indicates accessibility of the chain interface; must be either
-// public_ or protected_; defaults to public_.
-//
-#define BOOST_IOSTREAMS_DEFINE_FILTER_STREAMBUF(name_, chain_type_, default_char_) \
- template< typename Mode, typename Ch = default_char_, \
- typename Tr = BOOST_IOSTREAMS_CHAR_TRAITS(Ch), \
- typename Alloc = std::allocator<Ch>, typename Access = public_ > \
- class name_ : public boost::iostreams::detail::chainbuf< \
- chain_type_<Mode, Ch, Tr, Alloc>, Mode, Access \
- > \
- { \
- public: \
- typedef Ch char_type; \
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr) \
- typedef Mode mode; \
- typedef chain_type_<Mode, Ch, Tr, Alloc> chain_type; \
- name_() { } \
- BOOST_IOSTREAMS_DEFINE_PUSH_CONSTRUCTOR(name_, mode, Ch, push_impl) \
- ~name_() { if (this->is_complete()) this->BOOST_IOSTREAMS_PUBSYNC(); } \
- }; \
- /**/
-BOOST_IOSTREAMS_DEFINE_FILTER_STREAMBUF(filtering_streambuf, boost::iostreams::chain, char)
-BOOST_IOSTREAMS_DEFINE_FILTER_STREAMBUF(filtering_wstreambuf, boost::iostreams::chain, wchar_t)
-
-typedef filtering_streambuf<input> filtering_istreambuf;
-typedef filtering_streambuf<output> filtering_ostreambuf;
-typedef filtering_wstreambuf<input> filtering_wistreambuf;
-typedef filtering_wstreambuf<output> filtering_wostreambuf;
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_FILTERING_STREAMBUF_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_FLUSH_HPP_INCLUDED
-#define BOOST_IOSTREAMS_FLUSH_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct flush_device_impl;
-
-template<typename T>
-struct flush_filter_impl;
-
-} // End namespace detail.
-
-template<typename T>
-bool flush(T& t)
-{ return detail::flush_device_impl<T>::flush(detail::unwrap(t)); }
-
-template<typename T, typename Sink>
-bool flush(T& t, Sink& snk)
-{ return detail::flush_filter_impl<T>::flush(detail::unwrap(t), snk); }
-
-namespace detail {
-
-//------------------Definition of flush_device_impl---------------------------//
-
-template<typename T>
-struct flush_device_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- flush_device_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, ostream_tag, streambuf_tag, flushable_tag, any_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct flush_device_impl<ostream_tag> {
- template<typename T>
- static bool flush(T& t)
- { return t.rdbuf()->BOOST_IOSTREAMS_PUBSYNC() == 0; }
-};
-
-template<>
-struct flush_device_impl<streambuf_tag> {
- template<typename T>
- static bool flush(T& t)
- { return t.BOOST_IOSTREAMS_PUBSYNC() == 0; }
-};
-
-template<>
-struct flush_device_impl<flushable_tag> {
- template<typename T>
- static bool flush(T& t) { return t.flush(); }
-};
-
-template<>
-struct flush_device_impl<any_tag> {
- template<typename T>
- static bool flush(T&) { return true; }
-};
-
-//------------------Definition of flush_filter_impl---------------------------//
-
-template<typename T>
-struct flush_filter_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- flush_filter_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, flushable_tag, any_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct flush_filter_impl<flushable_tag> {
- template<typename T, typename Sink>
- static bool flush(T& t, Sink& snk) { return t.flush(snk); }
-};
-
-template<>
-struct flush_filter_impl<any_tag> {
- template<typename T, typename Sink>
- static bool flush(T&, Sink&) { return false; }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_FLUSH_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_GET_HPP_INCLUDED
-#define BOOST_IOSTREAMS_GET_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/read.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_GET_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_IMBUE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_IMBUE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-// Implementation templates for simulated tag dispatch.
-template<typename T>
-struct imbue_impl;
-
-} // End namespace detail.
-
-template<typename T, typename Locale>
-void imbue(T& t, const Locale& loc)
-{ detail::imbue_impl<T>::imbue(detail::unwrap(t), loc); }
-
-namespace detail {
-
-//------------------Definition of imbue_impl----------------------------------//
-
-template<typename T>
-struct imbue_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- imbue_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, streambuf_tag, localizable_tag, any_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct imbue_impl<any_tag> {
- template<typename T, typename Locale>
- static void imbue(T&, const Locale&) { }
-};
-
-template<>
-struct imbue_impl<streambuf_tag> {
- template<typename T, typename Locale>
- static void imbue(T& t, const Locale& loc) { t.pubimbue(loc); }
-};
-
-template<>
-struct imbue_impl<localizable_tag> {
- template<typename T, typename Locale>
- static void imbue(T& t, const Locale& loc) { t.imbue(loc); }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_IMBUE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_INPUT_SEQUENCE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_INPUT_SEQUENCE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <utility> // pair.
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct input_sequence_impl;
-
-} // End namespace detail.
-
-template<typename T>
-inline std::pair<
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type*,
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type*
->
-input_sequence(T& t)
-{ return detail::input_sequence_impl<T>::input_sequence(t); }
-
-namespace detail {
-
-//------------------Definition of direct_impl-------------------------------//
-
-template<typename T>
-struct input_sequence_impl
- : mpl::if_<
- detail::is_custom<T>,
- operations<T>,
- input_sequence_impl<direct_tag>
- >::type
- { };
-
-template<>
-struct input_sequence_impl<direct_tag> {
- template<typename U>
- static std::pair<
- BOOST_DEDUCED_TYPENAME char_type_of<U>::type*,
- BOOST_DEDUCED_TYPENAME char_type_of<U>::type*
- >
- input_sequence(U& u) { return u.input_sequence(); }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_INPUT_SEQUENCE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_OPERATIONS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_OPERATIONS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/close.hpp>
-#include <boost/iostreams/flush.hpp>
-#include <boost/iostreams/imbue.hpp>
-#include <boost/iostreams/input_sequence.hpp>
-#include <boost/iostreams/optimal_buffer_size.hpp>
-#include <boost/iostreams/output_sequence.hpp>
-#include <boost/iostreams/read.hpp>
-#include <boost/iostreams/seek.hpp>
-#include <boost/iostreams/write.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_OPERATIONS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_OPERATIONS_FWD_HPP_INCLUDED
-#define BOOST_IOSTREAMS_OPERATIONS_FWD_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/mpl/not.hpp>
-#include <boost/type_traits/is_base_and_derived.hpp>
-
-namespace boost { namespace iostreams {
-
-template<typename T>
-struct operations;
-
-namespace detail {
-
-struct custom_tag { };
-
-template<typename T>
-struct is_custom
- : mpl::not_<
- is_base_and_derived< custom_tag, operations<T> >
- >
- { };
-
-} // End namespace detail.
-
-template<typename T>
-struct operations : detail::custom_tag { };
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_OPERATIONS_FWD_HPP_INCLUDED //--------------//
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_OPTIMAL_BUFFER_SIZE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_OPTIMAL_BUFFER_SIZE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/constants.hpp> // constants.
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct optimal_buffer_size_impl;
-
-} // End namespace detail.
-
-template<typename T>
-std::streamsize optimal_buffer_size(const T& t)
-{
- typedef detail::optimal_buffer_size_impl<T> impl;
- return impl::optimal_buffer_size(detail::unwrap(t));
-}
-
-namespace detail {
-
-//------------------Definition of optimal_buffer_size_impl--------------------//
-
-template<typename T>
-struct optimal_buffer_size_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- optimal_buffer_size_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, optimally_buffered_tag, device_tag, filter_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct optimal_buffer_size_impl<optimally_buffered_tag> {
- template<typename T>
- static std::streamsize optimal_buffer_size(const T& t)
- { return t.optimal_buffer_size(); }
-};
-
-template<>
-struct optimal_buffer_size_impl<device_tag> {
- template<typename T>
- static std::streamsize optimal_buffer_size(const T&)
- { return default_device_buffer_size; }
-};
-
-template<>
-struct optimal_buffer_size_impl<filter_tag> {
- template<typename T>
- static std::streamsize optimal_buffer_size(const T&)
- { return default_filter_buffer_size; }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_OPTIMAL_BUFFER_SIZE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <utility> // pair.
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct output_sequence_impl;
-
-} // End namespace detail.
-
-template<typename T>
-inline std::pair<
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type*,
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type*
->
-output_sequence(T& t)
-{ return detail::output_sequence_impl<T>::output_sequence(t); }
-
-namespace detail {
-
-//------------------Definition of output_sequence_impl------------------------//
-
-template<typename T>
-struct output_sequence_impl
- : mpl::if_<
- detail::is_custom<T>,
- operations<T>,
- output_sequence_impl<direct_tag>
- >::type
- { };
-
-template<>
-struct output_sequence_impl<direct_tag> {
- template<typename U>
- static std::pair<
- BOOST_DEDUCED_TYPENAME char_type_of<U>::type*,
- BOOST_DEDUCED_TYPENAME char_type_of<U>::type*
- >
- output_sequence(U& u) { return u.output_sequence(); }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_OUTPUT_SEQUENCE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // BOOST_MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/detail/template_params.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/preprocessor/punctuation/comma_if.hpp>
-#include <boost/preprocessor/repetition/enum_params.hpp>
-#include <boost/static_assert.hpp>
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
-# include <boost/type_traits/is_base_and_derived.hpp>
-#endif
-
-#define BOOST_IOSTREAMS_PIPABLE(filter, arity) \
- template< BOOST_PP_ENUM_PARAMS(arity, typename T) \
- BOOST_PP_COMMA_IF(arity) typename Component> \
- ::boost::iostreams::pipeline< \
- ::boost::iostreams::detail::pipeline_segment< \
- filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T) \
- >, \
- Component \
- > operator|( const filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T)& f, \
- const Component& c ) \
- { \
- typedef ::boost::iostreams::detail::pipeline_segment< \
- filter BOOST_IOSTREAMS_TEMPLATE_ARGS(arity, T) \
- > segment; \
- return ::boost::iostreams::pipeline<segment, Component> \
- (segment(f), c); \
- } \
- /**/
-
-namespace boost { namespace iostreams {
-
-template<typename Pipeline, typename Component>
-struct pipeline;
-
-namespace detail {
-
-#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
- struct pipeline_base { };
-
- template<typename T>
- struct is_pipeline
- : is_base_and_derived<pipeline_base, T>
- { };
-#endif
-#if BOOST_WORKAROUND(__BORLANDC__, < 0x600)
- template<typename T>
- struct is_pipeline : mpl::false_ { };
-
- template<typename Pipeline, typename Component>
- struct is_pipeline< pipeline<Pipeline, Component> > : mpl::true_ { };
-#endif
-
-template<typename Component>
-class pipeline_segment
-#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
- : pipeline_base
-#endif
-{
-public:
- pipeline_segment(const Component& component)
- : component_(component)
- { }
- template<typename Fn>
- void for_each(Fn fn) const { fn(component_); }
- template<typename Chain>
- void push(Chain& chn) const { chn.push(component_); }
-private:
- const Component& component_;
-};
-
-} // End namespace detail.
-
-//------------------Definition of Pipeline------------------------------------//
-
-template<typename Pipeline, typename Component>
-struct pipeline : Pipeline {
- typedef Pipeline pipeline_type;
- typedef Component component_type;
- pipeline(const Pipeline& p, const Component& component)
- : Pipeline(p), component_(component)
- { }
- template<typename Fn>
- void for_each(Fn fn) const
- {
- Pipeline::for_each(fn);
- fn(component_);
- }
- template<typename Chain>
- void push(Chain& chn) const
- {
- Pipeline::push(chn);
- chn.push(component_);
- }
- const Pipeline& tail() const { return *this; }
- const Component& head() const { return component_; }
-private:
- const Component& component_;
-};
-
-template<typename Pipeline, typename Filter, typename Component>
-pipeline<pipeline<Pipeline, Filter>, Component>
-operator|(const pipeline<Pipeline, Filter>& p, const Component& cmp)
-{
- BOOST_STATIC_ASSERT(is_filter<Filter>::value);
- return pipeline<pipeline<Pipeline, Filter>, Component>(p, cmp);
-}
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_PIPABLE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Thanks to Gareth Sylvester-Bradley for the Dinkumware versions of the
-// positioning functions.
-
-#ifndef BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
-#define BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp>
-#include <boost/cstdint.hpp>
-#include <boost/integer_traits.hpp>
-#include <boost/iostreams/detail/config/codecvt.hpp> // mbstate_t.
-#include <boost/iostreams/detail/ios.hpp> // streamoff, streampos.
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-#ifdef BOOST_NO_STDC_NAMESPACE
-namespace std { using ::fpos_t; }
-#endif
-
-namespace boost { namespace iostreams {
-
-typedef boost::intmax_t stream_offset;
-
-inline std::streamoff stream_offset_to_streamoff(stream_offset off)
-{ return static_cast<stream_offset>(off); }
-
-template<typename PosType> // Hande custom pos_type's.
-inline stream_offset position_to_offset(PosType pos)
-{ return std::streamoff(pos); }
-
-#if ((defined(_YVALS) && !defined(__IBMCPP__)) || defined(_CPPLIB_VER)) && \
- !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) \
- && !defined(__QNX__) \
- /**/
-
- /* Dinkumware */
-
-inline std::streampos offset_to_position(stream_offset off)
-{
- // Use implementation-specific constructor.
- return std::streampos(std::mbstate_t(), off);
-}
-
-inline stream_offset fpos_t_to_offset(std::fpos_t pos)
-{ // Helper function.
-#if defined(_POSIX_) || (_INTEGRAL_MAX_BITS >= 64)
- return pos;
-#else
- return _FPOSOFF(pos);
-#endif
-}
-
-# if defined(_CPPLIB_VER) //--------------------------------------------------//
-
- /* Recent Dinkumware */
-
-inline stream_offset position_to_offset(std::streampos pos)
-{
- // Use implementation-specific member function seekpos().
- return fpos_t_to_offset(pos.seekpos()) +
- stream_offset(std::streamoff(pos)) -
- stream_offset(std::streamoff(pos.seekpos()));
-}
-
-# else // # if defined(_CPPLIB_VER) //----------------------------------------//
-
- /* Old Dinkumware */
-
-inline stream_offset position_to_offset(std::streampos pos)
-{
- // use implementation-specific member function get_fpos_t().
- return fpos_t_to_offset(pos.get_fpos_t()) +
- stream_offset(std::streamoff(pos)) -
- stream_offset(std::streamoff(pos.get_fpos_t()));
-}
-
-# endif // # if defined(_CPPLIB_VER) //---------------------------------------//
-#else // Dinkumware //--------------------------------------------------------//
-
- /* Non-Dinkumware */
-
-inline std::streampos offset_to_position(stream_offset off) { return off; }
-
-inline stream_offset position_to_offset(std::streampos pos) { return pos; }
-
-#endif // Dinkumware //-------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_POSITIONING_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_PUT_HPP_INCLUDED
-#define BOOST_IOSTREAMS_PUT_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/iostreams/write.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_PUT_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2005.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_READ_HPP_INCLUDED
-#define BOOST_IOSTREAMS_READ_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/char_traits.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/ios.hpp> // streamsize.
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-----------------------------------//
-# include <boost/iostreams/detail/vc6/read.hpp>
-#else // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //--------------------------//
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct read_device_impl;
-
-template<typename T>
-struct read_filter_impl;
-
-} // End namespace detail.
-
-template<typename T>
-typename int_type_of<T>::type get(T& t)
-{ return detail::read_device_impl<T>::get(detail::unwrap(t)); }
-
-template<typename T>
-inline std::streamsize
-read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
-{ return detail::read_device_impl<T>::read(detail::unwrap(t), s, n); }
-
-template<typename T, typename Source>
-std::streamsize
-read(T& t, Source& src, typename char_type_of<T>::type* s, std::streamsize n)
-{ return detail::read_filter_impl<T>::read(detail::unwrap(t), src, s, n); }
-
-template<typename T>
-bool putback(T& t, typename char_type_of<T>::type c)
-{ return detail::read_device_impl<T>::putback(detail::unwrap(t), c); }
-
-//----------------------------------------------------------------------------//
-
-namespace detail {
-
-// Helper function for adding -1 as EOF indicator.
-inline std::streamsize check_eof(std::streamsize n) { return n != 0 ? n : -1; }
-
-// Helper templates for reading from streambufs.
-template<bool IsLinked>
-struct true_eof_impl;
-
-template<>
-struct true_eof_impl<true> {
- template<typename T>
- static bool true_eof(T& t) { return t.true_eof(); }
-};
-
-template<>
-struct true_eof_impl<false> {
- template<typename T>
- static bool true_eof(T& t) { return true; }
-};
-
-template<typename T>
-inline bool true_eof(T& t)
-{
- const bool linked = is_linked<T>::value;
- return true_eof_impl<linked>::true_eof(t);
-}
-
-//------------------Definition of read_device_impl----------------------------//
-
-template<typename T>
-struct read_device_impl
- : mpl::if_<
- detail::is_custom<T>,
- operations<T>,
- read_device_impl<
- BOOST_DEDUCED_TYPENAME
- detail::dispatch<
- T, istream_tag, streambuf_tag, input
- >::type
- >
- >::type
- { };
-
-template<>
-struct read_device_impl<istream_tag> {
- template<typename T>
- static typename int_type_of<T>::type get(T& t)
- { return t.get(); }
-
- template<typename T>
- static std::streamsize
- read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
- { return check_eof(t.rdbuf()->sgetn(s, n)); }
-
- template<typename T>
- static bool putback(T& t, typename char_type_of<T>::type c)
- {
- typedef typename char_type_of<T>::type char_type;
- typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type) traits_type;
- return !traits_type::eq_int_type( t.rdbuf()->sputbackc(c),
- traits_type::eof() );
- }
-};
-
-template<>
-struct read_device_impl<streambuf_tag> {
- template<typename T>
- static typename int_type_of<T>::type
- get(T& t)
- { // gcc 2.95 needs namespace qualification for char_traits.
- typedef typename char_type_of<T>::type char_type;
- typedef iostreams::char_traits<char_type> traits_type;
- typename int_type_of<T>::type c;
- return !traits_type::is_eof(c = t.sbumpc()) ||
- detail::true_eof(t)
- ?
- c : traits_type::would_block();
- }
-
- template<typename T>
- static std::streamsize
- read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
- {
- std::streamsize amt;
- return (amt = t.sgetn(s, n)) != 0 ?
- amt :
- detail::true_eof(t) ?
- -1 :
- 0;
- }
-
- template<typename T>
- static bool putback(T& t, typename char_type_of<T>::type c)
- { // gcc 2.95 needs namespace qualification for char_traits.
- typedef typename char_type_of<T>::type char_type;
- typedef iostreams::char_traits<char_type> traits_type;
- return !traits_type::is_eof(t.sputbackc(c));
- }
-};
-
-template<>
-struct read_device_impl<input> {
- template<typename T>
- static typename int_type_of<T>::type
- get(T& t)
- { // gcc 2.95 needs namespace qualification for char_traits.
- typedef typename char_type_of<T>::type char_type;
- typedef iostreams::char_traits<char_type> traits_type;
- char_type c;
- std::streamsize amt;
- return (amt = t.read(&c, 1)) == 1 ?
- traits_type::to_int_type(c) :
- amt == -1 ?
- traits_type::eof() :
- traits_type::would_block();
- }
-
- template<typename T>
- static std::streamsize
- read(T& t, typename char_type_of<T>::type* s, std::streamsize n)
- { return t.read(s, n); }
-
- template<typename T>
- static bool putback(T& t, typename char_type_of<T>::type c)
- { // T must be Peekable.
- return t.putback(c);
- }
-};
-
-//------------------Definition of read_filter_impl----------------------------//
-
-template<typename T>
-struct read_filter_impl
- : mpl::if_<
- detail::is_custom<T>,
- operations<T>,
- read_filter_impl<
- BOOST_DEDUCED_TYPENAME
- detail::dispatch<
- T, multichar_tag, any_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct read_filter_impl<multichar_tag> {
- template<typename T, typename Source>
- static std::streamsize read
- (T& t, Source& src, typename char_type_of<T>::type* s, std::streamsize n)
- { return t.read(src, s, n); }
-};
-
-template<>
-struct read_filter_impl<any_tag> {
- template<typename T, typename Source>
- static std::streamsize read
- (T& t, Source& src, typename char_type_of<T>::type* s, std::streamsize n)
- { // gcc 2.95 needs namespace qualification for char_traits.
- typedef typename char_type_of<T>::type char_type;
- typedef iostreams::char_traits<char_type> traits_type;
- for (std::streamsize off = 0; off < n; ++off) {
- typename traits_type::int_type c = t.get(src);
- if (traits_type::is_eof(c))
- return check_eof(off);
- if (traits_type::would_block(c))
- return off;
- s[off] = traits_type::to_char_type(c);
- }
- return n;
- }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-------------------------//
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_READ_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_SEEK_HPP_INCLUDED
-#define BOOST_IOSTREAMS_SEEK_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/integer_traits.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/ios.hpp> // streamsize, seekdir, openmode.
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/positioning.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct seek_device_impl;
-
-template<typename T>
-struct seek_filter_impl;
-
-} // End namespace detail.
-
-template<typename T>
-inline std::streampos
-seek( T& t, stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out )
-{
- using namespace detail;
- return seek_device_impl<T>::seek(detail::unwrap(t), off, way, which);
-}
-
-template<typename T, typename Device>
-inline std::streampos
-seek( T& t, Device& dev, stream_offset off, BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which = BOOST_IOS::in | BOOST_IOS::out )
-{
- using namespace detail;
- return seek_filter_impl<T>::seek(detail::unwrap(t), dev, off, way, which);
-}
-
-namespace detail {
-
-//------------------Definition of seek_device_impl----------------------------//
-
-template<typename T>
-struct seek_device_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- seek_device_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, iostream_tag, istream_tag, ostream_tag,
- streambuf_tag, two_head, any_tag
- >::type
- >
- >::type
- { };
-
-struct seek_impl_basic_ios {
- template<typename T>
- static std::streampos seek( T& t, stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- {
- if ( way == BOOST_IOS::beg &&
- ( off < integer_traits<std::streamoff>::const_min ||
- off > integer_traits<std::streamoff>::const_max ) )
- {
- return t.rdbuf()->pubseekpos(offset_to_position(off));
- } else {
- return t.rdbuf()->pubseekoff(off, way, which);
- }
- }
-};
-
-template<>
-struct seek_device_impl<iostream_tag> : seek_impl_basic_ios { };
-
-template<>
-struct seek_device_impl<istream_tag> : seek_impl_basic_ios { };
-
-template<>
-struct seek_device_impl<ostream_tag> : seek_impl_basic_ios { };
-
-template<>
-struct seek_device_impl<streambuf_tag> {
- template<typename T>
- static std::streampos seek( T& t, stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- {
- if ( way == BOOST_IOS::beg &&
- ( off < integer_traits<std::streamoff>::const_min ||
- off > integer_traits<std::streamoff>::const_max ) )
- {
- return t.BOOST_IOSTREAMS_PUBSEEKPOS(offset_to_position(off));
- } else {
- return t.BOOST_IOSTREAMS_PUBSEEKOFF(off, way, which);
- }
- }
-};
-
-template<>
-struct seek_device_impl<two_head> {
- template<typename T>
- static std::streampos seek( T& t, stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- { return t.seek(off, way, which); }
-};
-
-template<>
-struct seek_device_impl<any_tag> {
- template<typename T>
- static std::streampos seek( T& t, stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode )
- { return t.seek(off, way); }
-};
-
-//------------------Definition of seek_filter_impl----------------------------//
-
-template<typename T>
-struct seek_filter_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- seek_filter_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<T, two_head, any_tag>::type
- >
- >::type
- { };
-
-template<>
-struct seek_filter_impl<two_head> {
- template<typename T, typename Device>
- static std::streampos seek( T& t, Device& d,
- stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode which )
- { return t.seek(d, off, way, which); }
-};
-
-template<>
-struct seek_filter_impl<any_tag> {
- template<typename T, typename Device>
- static std::streampos seek( T& t, Device& d,
- stream_offset off,
- BOOST_IOS::seekdir way,
- BOOST_IOS::openmode )
- { return t.seek(d, off, way); }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_SEEK_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
-#define BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <memory> // allocator.
-#include <boost/config.hpp> // BOOST_DEDUCED_TYPENAME.
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/config/overload_resolution.hpp>
-#include <boost/iostreams/detail/forward.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure, streamsize.
-#include <boost/iostreams/detail/streambuf/direct_streambuf.hpp>
-#include <boost/iostreams/detail/streambuf/indirect_streambuf.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/static_assert.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp> // MSVC.
-
-namespace boost { namespace iostreams { namespace detail {
-
-template<typename T, typename Tr, typename Alloc, typename Mode>
-struct stream_buffer_traits {
- typedef typename
- mpl::if_<
- is_convertible<
- BOOST_DEDUCED_TYPENAME category_of<T>::type,
- direct_tag
- >,
- direct_streambuf<T, Tr>,
- indirect_streambuf<T, Tr, Alloc, Mode>
- >::type type;
-};
-
-} } } // End namespaces detail, iostreams, boost
-
-#ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
-# include <boost/iostreams/detail/broken_overload_resolution/stream_buffer.hpp>
-#else
-
-namespace boost { namespace iostreams {
-
-template< typename T,
- typename Tr =
- BOOST_IOSTREAMS_CHAR_TRAITS(
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type
- ),
- typename Alloc =
- std::allocator<
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type
- >,
- typename Mode = BOOST_DEDUCED_TYPENAME mode_of<T>::type >
-class stream_buffer
- : public detail::stream_buffer_traits<T, Tr, Alloc, Mode>::type
-{
-private:
- BOOST_STATIC_ASSERT((
- is_convertible<
- BOOST_DEDUCED_TYPENAME iostreams::category_of<T>::type, Mode
- >::value
- ));
- typedef typename
- detail::stream_buffer_traits<
- T, Tr, Alloc, Mode
- >::type base_type;
- typedef T policy_type;
-public:
- typedef typename char_type_of<T>::type char_type;
- BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr)
-public:
- stream_buffer() { }
- ~stream_buffer()
- {
- try {
- if (this->is_open() && this->auto_close())
- this->close();
- } catch (std::exception&) { }
- }
- BOOST_IOSTREAMS_FORWARD( stream_buffer, open_impl, T,
- BOOST_IOSTREAMS_PUSH_PARAMS,
- BOOST_IOSTREAMS_PUSH_ARGS )
- T& operator*() { return *this->component(); }
- T* operator->() { return this->component(); }
-private:
- void open_impl(const T& t BOOST_IOSTREAMS_PUSH_PARAMS())
- { // Used for forwarding.
- if (this->is_open())
- BOOST_IOSTREAMS_FAILURE("already open");
- base_type::open(t BOOST_IOSTREAMS_PUSH_ARGS());
- }
-};
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifdef BOOST_IOSTREAMS_BROKEN_OVERLOAD_RESOLUTION
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp> // MSVC.
-
-#endif // #ifndef BOOST_IOSTREAMS_STREAM_BUFFER_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-//
-// Contains metafunctions char_type_of, category_of and mode_of used for
-// deducing the i/o category and i/o mode of a model of Filter or Device.
-//
-// Also contains several utility metafunctions, functions and macros.
-//
-
-#ifndef BOOST_IOSTREAMS_IO_TRAITS_HPP_INCLUDED
-#define BOOST_IOSTREAMS_IO_TRAITS_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <iosfwd> // stream types, char_traits.
-#include <boost/config.hpp> // partial spec, deduced typename.
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/bool_trait_def.hpp>
-#include <boost/iostreams/detail/config/wide_streams.hpp>
-#include <boost/iostreams/detail/is_iterator_range.hpp>
-#include <boost/iostreams/detail/select.hpp>
-#include <boost/iostreams/detail/select_by_size.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/traits_fwd.hpp>
-#include <boost/mpl/bool.hpp>
-#include <boost/mpl/eval_if.hpp>
-#include <boost/mpl/identity.hpp>
-#include <boost/mpl/int.hpp>
-#include <boost/mpl/or.hpp>
-#include <boost/range/iterator_range.hpp>
-#include <boost/range/value_type.hpp>
-#include <boost/type_traits/is_convertible.hpp>
-
-namespace boost { namespace iostreams {
-
-//------------------Definitions of predicates for streams and stream buffers--//
-
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------------------//
-
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_istream, std::basic_istream, 2)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_ostream, std::basic_ostream, 2)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_iostream, std::basic_iostream, 2)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_streambuf, std::basic_streambuf, 2)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_stringstream, std::basic_stringstream, 3)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_stringbuf, std::basic_stringbuf, 3)
-
-#else // #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-----------------------//
-
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_istream, std::istream, 0)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_ostream, std::ostream, 0)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_iostream, std::iostream, 0)
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_streambuf, std::streambuf, 0)
-
-#endif // #ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //----------------------//
-
-template<typename T>
-struct is_std_io
- : mpl::or_< is_istream<T>, is_ostream<T>, is_streambuf<T> >
- { };
-
-namespace detail {
-
-template<typename T, typename Tr>
-class linked_streambuf;
-
-BOOST_IOSTREAMS_BOOL_TRAIT_DEF(is_linked, linked_streambuf, 2)
-
-} // End namespace detail.
-
-//------------------Definitions of char_type_of-------------------------------//
-
-namespace detail {
-
-template<typename T>
-struct member_char_type { typedef typename T::char_type type; };
-
-} // End namespace detail.
-
-#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //---------------------------//
-# ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //-------------------------------//
-
-template<typename T>
-struct char_type_of
- : detail::member_char_type<
- typename detail::unwrapped_type<T>::type
- >
- { };
-
-# else // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //---------------------//
-
-template<typename T>
-struct char_type_of {
- typedef typename detail::unwrapped_type<T>::type U;
- typedef typename
- mpl::eval_if<
- is_std_io<U>,
- mpl::identity<char>,
- detail::member_char_type<U>
- >::type type;
-};
-
-# endif // # ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES //--------------------//
-
-template<typename Iter>
-struct char_type_of< iterator_range<Iter> > {
- typedef typename iterator_value<Iter>::type type;
-};
-
-#else // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //------------------//
-
-template<typename T>
-struct char_type_of {
- template<typename U>
- struct get_value_type {
- typedef typename range_value<U>::type type;
- };
- typedef typename
- mpl::eval_if<
- is_iterator_range<T>,
- get_value_type<T>,
- detail::member_char_type<
- BOOST_DEDUCED_TYPENAME detail::unwrapped_type<T>::type
- >
- >::type type;
-};
-
-#endif // #ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION //-----------------//
-
-//------------------Definitions of category_of--------------------------------//
-
-namespace detail {
-
-template<typename T>
-struct member_category { typedef typename T::category type; };
-
-} // End namespace detail.
-
-template<typename T>
-struct category_of {
- template<typename U>
- struct member_category {
- typedef typename U::category type;
- };
- typedef typename detail::unwrapped_type<T>::type U;
- typedef typename
- mpl::eval_if<
- is_std_io<U>,
- iostreams::select< // Disambiguation for Tru64
- is_iostream<U>, iostream_tag,
- is_istream<U>, istream_tag,
- is_ostream<U>, ostream_tag,
- is_streambuf<U>, streambuf_tag
- >,
- detail::member_category<U>
- >::type type;
-};
-
-//------------------Definition of get_category--------------------------------//
-
-//
-// Returns an object of type category_of<T>::type.
-//
-template<typename T>
-inline typename category_of<T>::type get_category(const T&)
-{ typedef typename category_of<T>::type category; return category(); }
-
-//------------------Definition of int_type_of---------------------------------//
-
-template<typename T>
-struct int_type_of {
-#ifndef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES
- typedef std::char_traits<
- BOOST_DEDUCED_TYPENAME char_type_of<T>::type
- > traits_type;
- typedef typename traits_type::int_type type;
-#else
- typedef int type;
-#endif
-};
-
-//------------------Definition of mode----------------------------------------//
-
-namespace detail {
-
-template<int N> struct io_mode_impl;
-
-#define BOOST_IOSTREAMS_MODE_HELPER(tag_, id_) \
- case_<id_> io_mode_impl_helper(tag_); \
- template<> struct io_mode_impl<id_> { typedef tag_ type; }; \
- /**/
-BOOST_IOSTREAMS_MODE_HELPER(input, 1)
-BOOST_IOSTREAMS_MODE_HELPER(output, 2)
-BOOST_IOSTREAMS_MODE_HELPER(bidirectional, 3)
-BOOST_IOSTREAMS_MODE_HELPER(input_seekable, 4)
-BOOST_IOSTREAMS_MODE_HELPER(output_seekable, 5)
-BOOST_IOSTREAMS_MODE_HELPER(seekable, 6)
-BOOST_IOSTREAMS_MODE_HELPER(dual_seekable, 7)
-BOOST_IOSTREAMS_MODE_HELPER(bidirectional_seekable, 8)
-BOOST_IOSTREAMS_MODE_HELPER(dual_use, 9)
-#undef BOOST_IOSTREAMS_MODE_HELPER
-
-template<typename T>
-struct io_mode_id {
- typedef typename category_of<T>::type category;
- BOOST_SELECT_BY_SIZE(int, value, detail::io_mode_impl_helper(category()));
-};
-
-} // End namespace detail.
-
-template<typename T> // Borland 5.6.4 requires this circumlocution.
-struct mode_of : detail::io_mode_impl< detail::io_mode_id<T>::value > { };
-
-//------------------Definition of is_device, is_filter and is_direct----------//
-
-namespace detail {
-
-template<typename T, typename Tag>
-struct has_trait_impl {
- typedef typename category_of<T>::type category;
- BOOST_STATIC_CONSTANT(bool, value = (is_convertible<category, Tag>::value));
-};
-
-template<typename T, typename Tag>
-struct has_trait
- : mpl::bool_<has_trait_impl<T, Tag>::value>
- { };
-
-} // End namespace detail.
-
-template<typename T>
-struct is_device : detail::has_trait<T, device_tag> { };
-
-template<typename T>
-struct is_filter : detail::has_trait<T, filter_tag> { };
-
-template<typename T>
-struct is_direct : detail::has_trait<T, direct_tag> { };
-
-//------------------Definition of BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS----------//
-
-#define BOOST_IOSTREAMS_STREAMBUF_TYPEDEFS(Tr) \
- typedef Tr traits_type; \
- typedef typename traits_type::int_type int_type; \
- typedef typename traits_type::off_type off_type; \
- typedef typename traits_type::pos_type pos_type; \
- /**/
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_IO_TRAITS_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Forward declarations of templates defined in traits.hpp.
-
-#ifndef BOOST_IOSTREAMS_IO_TRAITS_FWD_HPP_INCLUDED
-#define BOOST_IOSTREAMS_IO_TRAITS_FWD_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <iosfwd> // stream types, char_traits.
-
-namespace boost { namespace iostreams {
-
-template<typename T>
-struct is_istream;
-
-template<typename T>
-struct is_ostream;
-
-template<typename T>
-struct is_iostream;
-
-template<typename T>
-struct is_streambuf;
-
-template<typename T>
-struct is_stringstream;
-
-template<typename T>
-struct is_stringbuf;
-
-template<typename T>
-struct is_std_io;
-
-template<typename T>
-struct char_type_of;
-
-template<typename T>
-struct category_of;
-
-template<typename T>
-struct int_type_of;
-
-template<typename T>
-struct mode_of;
-
-template<typename T>
-struct is_device;
-
-template<typename T>
-struct is_filter;
-
-template<typename T>
-struct is_direct;
-
-namespace detail {
-
-template<typename T>
-struct is_linked;
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #ifndef BOOST_IOSTREAMS_IO_TRAITS_FWD_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-#ifndef BOOST_IOSTREAMS_WRITE_HPP_INCLUDED
-#define BOOST_IOSTREAMS_WRITE_HPP_INCLUDED
-
-#if defined(_MSC_VER) && (_MSC_VER >= 1020)
-# pragma once
-#endif
-
-#include <boost/config.hpp> // DEDUCED_TYPENAME, MSVC.
-#include <boost/detail/workaround.hpp>
-#include <boost/iostreams/categories.hpp>
-#include <boost/iostreams/detail/char_traits.hpp>
-#include <boost/iostreams/detail/dispatch.hpp>
-#include <boost/iostreams/detail/ios.hpp> // streamsize.
-#include <boost/iostreams/detail/streambuf.hpp>
-#include <boost/iostreams/detail/wrap_unwrap.hpp>
-#include <boost/iostreams/operations_fwd.hpp>
-#include <boost/iostreams/traits.hpp>
-#include <boost/mpl/if.hpp>
-
-// Must come last.
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-#if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-----------------------------------//
-# include <boost/iostreams/detail/vc6/write.hpp>
-#else // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //--------------------------//
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-template<typename T>
-struct write_device_impl;
-
-template<typename T>
-struct write_filter_impl;
-
-} // End namespace detail.
-
-template<typename T>
-bool put(T& t, typename char_type_of<T>::type c)
-{ return detail::write_device_impl<T>::put(detail::unwrap(t), c); }
-
-template<typename T>
-inline std::streamsize write
- (T& t, const typename char_type_of<T>::type* s, std::streamsize n)
-{ return detail::write_device_impl<T>::write(detail::unwrap(t), s, n); }
-
-template<typename T, typename Sink>
-inline std::streamsize
-write( T& t, Sink& snk, const typename char_type_of<T>::type* s,
- std::streamsize n )
-{ return detail::write_filter_impl<T>::write(detail::unwrap(t), snk, s, n); }
-
-namespace detail {
-
-//------------------Definition of write_device_impl---------------------------//
-
-template<typename T>
-struct write_device_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- write_device_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, ostream_tag, streambuf_tag, output
- >::type
- >
- >::type
- { };
-
-template<>
-struct write_device_impl<ostream_tag> {
- template<typename T>
- static bool put(T& t, typename char_type_of<T>::type c)
- {
- typedef typename char_type_of<T>::type char_type;
- typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type) traits_type;
- return !traits_type::eq_int_type( t.rdbuf()->s.sputc(),
- traits_type::eof() );
- }
-
- template<typename T>
- static std::streamsize write
- (T& t, const typename char_type_of<T>::type* s, std::streamsize n)
- { return t.rdbuf()->sputn(s, n); }
-};
-
-template<>
-struct write_device_impl<streambuf_tag> {
- template<typename T>
- static bool put(T& t, typename char_type_of<T>::type c)
- {
- typedef typename char_type_of<T>::type char_type;
- typedef BOOST_IOSTREAMS_CHAR_TRAITS(char_type) traits_type;
- return !traits_type::eq_int_type(t.sputc(c), traits_type::eof());
- }
-
- template<typename T>
- static std::streamsize write
- (T& t, const typename char_type_of<T>::type* s, std::streamsize n)
- { return t.sputn(s, n); }
-};
-
-template<>
-struct write_device_impl<output> {
- template<typename T>
- static bool put(T& t, typename char_type_of<T>::type c)
- { return t.write(&c, 1) == 1; }
-
- template<typename T>
- static std::streamsize
- write(T& t, const typename char_type_of<T>::type* s, std::streamsize n)
- { return t.write(s, n); }
-};
-
-//------------------Definition of write_filter_impl---------------------------//
-
-template<typename T>
-struct write_filter_impl
- : mpl::if_<
- is_custom<T>,
- operations<T>,
- write_filter_impl<
- BOOST_DEDUCED_TYPENAME
- dispatch<
- T, multichar_tag, any_tag
- >::type
- >
- >::type
- { };
-
-template<>
-struct write_filter_impl<multichar_tag> {
- template<typename T, typename Sink>
- static std::streamsize
- write( T& t, Sink& snk, const typename char_type_of<T>::type* s,
- std::streamsize n )
- { return t.write(snk, s, n); }
-};
-
-template<>
-struct write_filter_impl<any_tag> {
- template<typename T, typename Sink>
- static std::streamsize
- write( T& t, Sink& snk, const typename char_type_of<T>::type* s,
- std::streamsize n )
- {
- for (std::streamsize off = 0; off < n; ++off)
- if (!t.put(snk, s[off]))
- return off;
- return n;
- }
-};
-
-} // End namespace detail.
-
-} } // End namespaces iostreams, boost.
-
-#endif // #if BOOST_WORKAROUND(BOOST_MSVC, < 1300) //-------------------------//
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
-
-#endif // #ifndef BOOST_IOSTREAMS_WRITE_HPP_INCLUDED
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Inspired by fdstream.hpp, (C) Copyright Nicolai M. Josuttis 2001,
-// available at http://www.josuttis.com/cppcode/fdstream.html.
-
-// Define BOOST_IOSTREAMS_SOURCE so that <boost/iostreams/detail/config.hpp>
-// knows that we are building the library (possibly exporting code), rather
-// than using it (possibly importing code).
-#define BOOST_IOSTREAMS_SOURCE
-
-#include <boost/config.hpp> // BOOST_JOIN
-#include <boost/iostreams/detail/error.hpp>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/windows_posix.hpp>
-#include <boost/iostreams/detail/ios.hpp> // openmodes, failure.
-#include <boost/iostreams/device/file_descriptor.hpp>
-#include <boost/integer_traits.hpp>
-
- // OS-specific headers for low-level i/o.
-
-#include <cassert>
-#include <cstdio> // SEEK_SET, etc.
-#include <errno.h>
-#include <fcntl.h> // file opening flags.
-#include <sys/stat.h> // file access permissions.
-#ifdef BOOST_IOSTREAMS_WINDOWS
-# include <io.h> // low-level file i/o.
-# define WINDOWS_LEAN_AND_MEAN
-# include <windows.h>
-#else
-# include <sys/types.h> // mode_t.
-# include <unistd.h> // low-level file i/o.
-#endif
-
-// Names of runtime library routines vary.
-#if defined(__BORLANDC__)
-# define BOOST_RTL(x) BOOST_JOIN(_rtl_, x)
-#else
-# if defined(BOOST_IOSTREAMS_WINDOWS) && !defined(__CYGWIN__)
-# define BOOST_RTL(x) BOOST_JOIN(_, x)
-# else
-# define BOOST_RTL(x) ::x
-# endif
-#endif
-
-namespace boost { namespace iostreams {
-
-//------------------Implementation of file_descriptor-------------------------//
-
-void file_descriptor::open
- ( const std::string& path, BOOST_IOS::openmode m,
- BOOST_IOS::openmode base )
-{
- using namespace std;
- m |= base;
-#ifdef BOOST_IOSTREAMS_WINDOWS //---------------------------------------------//
- DWORD dwDesiredAccess;
- DWORD dwCreationDisposition;
- if ( (m & (BOOST_IOS::in | BOOST_IOS::out))
- ==
- (BOOST_IOS::in | BOOST_IOS::out) )
- {
- assert(!(m & BOOST_IOS::app));
- dwDesiredAccess = GENERIC_READ | GENERIC_WRITE;
- dwCreationDisposition =
- (m & BOOST_IOS::trunc) ?
- OPEN_ALWAYS :
- OPEN_EXISTING;
- } else if (m & BOOST_IOS::in) {
- assert(!(m & (BOOST_IOS::app |BOOST_IOS::trunc)));
- dwDesiredAccess = GENERIC_READ;
- dwCreationDisposition = OPEN_EXISTING;
- } else if (m & BOOST_IOS::out) {
- dwDesiredAccess = GENERIC_WRITE;
- dwCreationDisposition = OPEN_ALWAYS;
- if (m & BOOST_IOS::app)
- pimpl_->flags_ |= impl::append;
- }
-
- HANDLE handle =
- ::CreateFileA( path.c_str(),
- dwDesiredAccess,
- 0, // dwShareMode
- NULL, // lpSecurityAttributes
- dwCreationDisposition,
- FILE_ATTRIBUTE_NORMAL,
- NULL ); // hTemplateFile
- if (handle != INVALID_HANDLE_VALUE) {
- pimpl_->handle_ = handle;
- pimpl_->flags_ |= impl::close_on_exit | impl::has_handle;
- } else {
- pimpl_->flags_ = 0;
- throw BOOST_IOSTREAMS_FAILURE("bad open");
- }
-#else // #ifdef BOOST_IOSTREAMS_WINDOWS //------------------------------------//
-
- // Calculate oflag argument to open.
-
- int oflag = 0;
- if ( (m & (BOOST_IOS::in | BOOST_IOS::out))
- ==
- (BOOST_IOS::in | BOOST_IOS::out) )
- {
- assert(!(m & BOOST_IOS::app));
- oflag |= O_RDWR;
- } else if (m & BOOST_IOS::in) {
- assert(!(m & (BOOST_IOS::app |BOOST_IOS::trunc)));
- oflag |= O_RDONLY;
- } else if (m & BOOST_IOS::out) {
- oflag |= O_WRONLY;
- m |= BOOST_IOS::trunc;
- if (m & BOOST_IOS::app)
- oflag |= O_APPEND;
- }
- if (m & BOOST_IOS::trunc)
- oflag |= O_CREAT;
-
- // Calculate pmode argument to open.
-
- mode_t pmode = S_IRUSR | S_IWUSR |
- S_IRGRP | S_IWGRP |
- S_IROTH | S_IWOTH;
-
- // Open file.
-
- int fd = BOOST_RTL(open)(path.c_str(), oflag, pmode);
- if (fd == -1) {
- throw BOOST_IOSTREAMS_FAILURE("bad open");
- } else {
- pimpl_->fd_ = fd;
- pimpl_->flags_ = impl::close_on_exit;
- }
-#endif // #ifndef BOOST_IOSTREAMS_WINDOWS //----------------------------------//
-}
-
-std::streamsize file_descriptor::read(char_type* s, std::streamsize n)
-{
-#ifdef BOOST_IOSTREAMS_WINDOWS
- if (pimpl_->flags_ & impl::has_handle) {
- DWORD result;
- if (!::ReadFile(pimpl_->handle_, s, n, &result, NULL))
- throw detail::bad_read();
- return static_cast<std::streamsize>(result);
- }
-#endif
- errno = 0;
- std::streamsize result = BOOST_RTL(read)(pimpl_->fd_, s, n);
- if (errno != 0)
- throw detail::bad_read();
- return result == 0 ? -1 : result;
-}
-
-std::streamsize file_descriptor::write(const char_type* s, std::streamsize n)
-{
-#ifdef BOOST_IOSTREAMS_WINDOWS
- if (pimpl_->flags_ & impl::has_handle) {
- if (pimpl_->flags_ & impl::append) {
- ::SetFilePointer(pimpl_->handle_, 0, NULL, FILE_END);
- if (::GetLastError() != NO_ERROR)
- throw detail::bad_seek();
- }
- DWORD ignore;
- if (!::WriteFile(pimpl_->handle_, s, n, &ignore, NULL))
- throw detail::bad_write();
- return n;
- }
-#endif
- int amt = BOOST_RTL(write)(pimpl_->fd_, s, n);
- if (amt < n)
- throw detail::bad_write(); // Handles blocking fd's only.
- return n;
-}
-
-std::streampos file_descriptor::seek
- (stream_offset off, BOOST_IOS::seekdir way)
-{
- using namespace std;
-#ifdef BOOST_IOSTREAMS_WINDOWS
- if (pimpl_->flags_ & impl::has_handle) {
- LONG lDistanceToMove = static_cast<LONG>(off & 0xffffffff);
- LONG lDistanceToMoveHigh = static_cast<LONG>(off >> 32);
- DWORD dwResultLow =
- ::SetFilePointer( pimpl_->handle_,
- lDistanceToMove,
- &lDistanceToMoveHigh,
- way == BOOST_IOS::beg ?
- FILE_BEGIN :
- way == BOOST_IOS::cur ?
- FILE_CURRENT :
- FILE_END );
- if (::GetLastError() != NO_ERROR) {
- throw detail::bad_seek();
- } else {
- return offset_to_position((lDistanceToMoveHigh << 32) + dwResultLow);
- }
- }
-#endif // #ifdef BOOST_IOSTREAMS_WINDOWS
-
-#ifndef BOOST_IOSTREAMS_HAS_LSEEK64
- if ( off > integer_traits<long>::const_max ||
- off < integer_traits<long>::const_min )
- {
- throw BOOST_IOSTREAMS_FAILURE("bad offset");
- }
-#endif
-
- stream_offset result =
- #ifdef BOOST_IOSTREAMS_HAS_LSEEK64
- lseek64
- #else
- lseek
- #endif
- ( pimpl_->fd_,
- #ifdef BOOST_IOSTREAMS_HAS_LSEEK64
- off,
- #else
- static_cast<long>(off),
- #endif
- way == BOOST_IOS::beg ?
- SEEK_SET :
- way == BOOST_IOS::cur ?
- SEEK_CUR :
- SEEK_END );
- if (result == -1)
- throw detail::bad_seek();
- return offset_to_position(result);
-}
-
-void file_descriptor::close() { close_impl(*pimpl_); }
-
-void file_descriptor::close_impl(impl& i)
-{
-#ifdef BOOST_IOSTREAMS_WINDOWS
- if (i.flags_ & impl::has_handle) {
- if (!::CloseHandle(i.handle_))
- throw BOOST_IOSTREAMS_FAILURE("bad close");
- i.fd_ = -1;
- i.flags_ = 0;
- return;
- }
-#endif
- if (i.fd_ != -1) {
- if (BOOST_RTL(close)(i.fd_) == -1)
- throw BOOST_IOSTREAMS_FAILURE("bad close");
- i.fd_ = -1;
- i.flags_ = 0;
- }
-}
-
-} } // End namespaces iostreams, boost.
+++ /dev/null
-// (C) Copyright Craig Henderson 2002 'boost/memmap.hpp' from sandbox
-// (C) Copyright Jonathan Turkanis 2004.
-// (C) Copyright Jonathan Graehl 2004.
-
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// Define BOOST_IOSTREAMS_SOURCE so that <boost/iostreams/detail/config.hpp>
-// knows that we are building the library (possibly exporting code), rather
-// than using it (possibly importing code).
-#define BOOST_IOSTREAMS_SOURCE
-
-#include <cassert>
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/detail/config/windows_posix.hpp>
-#include <boost/iostreams/detail/ios.hpp> // failure.
-#include <boost/iostreams/detail/system_failure.hpp>
-#include <boost/iostreams/device/mapped_file.hpp>
-
-#ifdef BOOST_IOSTREAMS_WINDOWS
-# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
-# include <windows.h>
-#else
-# include <errno.h>
-# include <fcntl.h>
-# include <sys/mman.h> // mmap, munmap.
-# include <sys/stat.h>
-# include <sys/types.h> // struct stat.
-# include <unistd.h> // sysconf.
-#endif
-
-#include <boost/iostreams/detail/config/disable_warnings.hpp>
-
-namespace boost { namespace iostreams {
-
-namespace detail {
-
-struct mapped_file_impl {
- mapped_file_impl() { clear(false); }
- ~mapped_file_impl() { try { close(); } catch (std::exception&) { } }
- void clear(bool error)
- {
- data_ = 0;
- size_ = 0;
- mode_ = BOOST_IOS::openmode();
- error_ = error;
- #ifdef BOOST_IOSTREAMS_WINDOWS
- handle_ = INVALID_HANDLE_VALUE;
- mapped_handle_ = NULL;
- #else
- handle_ = 0;
- #endif
- }
- void close()
- {
- bool error = false;
- #ifdef BOOST_IOSTREAMS_WINDOWS
- if (handle_ == INVALID_HANDLE_VALUE)
- return;
- error = !::UnmapViewOfFile(data_) || error;
- error = !::CloseHandle(mapped_handle_) || error;
- error = !::CloseHandle(handle_) || error;
- handle_ = INVALID_HANDLE_VALUE;
- mapped_handle_ = NULL;
- #else
- if (!handle_)
- return;
- error = ::munmap(reinterpret_cast<char*>(data_), size_) != 0 || error;
- error = ::close(handle_) != 0 || error;
- handle_ = 0;
- #endif
- data_ = 0;
- size_ = 0;
- mode_ = BOOST_IOS::openmode();
- if (error)
- throw_system_failure("error closing mapped file");
- }
- char* data_;
- std::size_t size_;
- BOOST_IOS::openmode mode_;
- bool error_;
-#ifdef BOOST_IOSTREAMS_WINDOWS
- HANDLE handle_;
- HANDLE mapped_handle_;
-#else
- int handle_;
-#endif
-};
-
-} // End namespace detail.
-
-//------------------Definition of mapped_file_source--------------------------//
-
-mapped_file_source::mapped_file_source(mapped_file_params p) { open(p); }
-
-mapped_file_source::mapped_file_source( const std::string& path,
- mapped_file_source::size_type length,
- boost::intmax_t offset )
-{ open(path, length, offset); }
-
-void mapped_file_source::open(mapped_file_params p)
-{
- p.mode &= ~BOOST_IOS::out;
- open_impl(p);
-}
-
-void mapped_file_source::open( const std::string& path,
- mapped_file_source::size_type length,
- boost::intmax_t offset )
-{
- mapped_file_params p(path);
- p.mode = BOOST_IOS::in;
- p.length = length;
- p.offset = offset;
- open_impl(p);
-}
-
-mapped_file_source::size_type mapped_file_source::size() const
-{ return pimpl_->size_; }
-
-bool mapped_file_source::is_open() const
-{ return !!pimpl_ && pimpl_->handle_ != 0; }
-
-void mapped_file_source::close() { pimpl_->close(); }
-
-mapped_file_source::operator mapped_file_source::safe_bool() const
-{
- return !!pimpl_ && pimpl_->error_ == false ?
- &safe_bool_helper::x : 0;
-}
-
-bool mapped_file_source::operator!() const
-{ return !!pimpl_ || pimpl_->error_; }
-
-BOOST_IOS::openmode mapped_file_source::mode() const { return pimpl_->mode_; }
-
-const char* mapped_file_source::data() const { return pimpl_->data_; }
-
-const char* mapped_file_source::begin() const { return data(); }
-
-const char* mapped_file_source::end() const { return data() + size(); }
-
-#ifdef BOOST_IOSTREAMS_WINDOWS //---------------------------------------------//
-
-namespace detail {
-
-void cleanup_and_throw(detail::mapped_file_impl& impl, const char* msg)
-{
- if (impl.mapped_handle_ != INVALID_HANDLE_VALUE)
- ::CloseHandle(impl.mapped_handle_);
- if (impl.handle_ != NULL)
- ::CloseHandle(impl.handle_);
- impl.clear(true);
- throw_system_failure(msg);
-}
-
-} // End namespace detail.
-
-void mapped_file_source::open_impl(mapped_file_params p)
-{
- using namespace std;
-
- if (is_open())
- throw BOOST_IOSTREAMS_FAILURE("file already open");
- if (!pimpl_)
- pimpl_.reset(new impl_type);
- else
- pimpl_->clear(false);
- bool readonly = (p.mode & BOOST_IOS::out) == 0;
- pimpl_->mode_ = readonly ? BOOST_IOS::in : (BOOST_IOS::in | BOOST_IOS::out);
-
- //--------------Open underlying file--------------------------------------//
-
- pimpl_->handle_ =
- ::CreateFileA( p.path.c_str(),
- readonly ? GENERIC_READ : GENERIC_ALL,
- FILE_SHARE_READ,
- NULL,
- (p.new_file_size != 0 && !readonly) ?
- CREATE_ALWAYS :
- OPEN_EXISTING,
- readonly ?
- FILE_ATTRIBUTE_READONLY :
- FILE_ATTRIBUTE_TEMPORARY,
- NULL );
-
- if (pimpl_->handle_ == INVALID_HANDLE_VALUE)
- detail::cleanup_and_throw(*pimpl_, "failed opening file");
-
- //--------------Set file size---------------------------------------------//
-
- if (p.new_file_size != 0 && !readonly) {
- LONG sizehigh = (p.new_file_size >> (sizeof(LONG) * 8));
- LONG sizelow = (p.new_file_size & 0xffffffff);
- ::SetFilePointer(pimpl_->handle_, sizelow, &sizehigh, FILE_BEGIN);
- if (::GetLastError() != NO_ERROR || !::SetEndOfFile(pimpl_->handle_))
- detail::cleanup_and_throw(*pimpl_, "failed setting file size");
- }
-
- //--------------Create mapping--------------------------------------------//
-
- try_again: // Target of goto in following section.
-
- pimpl_->mapped_handle_ =
- ::CreateFileMappingA( pimpl_->handle_, NULL,
- readonly ? PAGE_READONLY : PAGE_READWRITE,
- 0, 0, NULL );
- if (pimpl_->mapped_handle_ == NULL) {
- detail::cleanup_and_throw(*pimpl_, "couldn't create mapping");
- }
-
- //--------------Access data-----------------------------------------------//
-
- void* data =
- ::MapViewOfFileEx( pimpl_->mapped_handle_,
- readonly ? FILE_MAP_READ : FILE_MAP_WRITE,
- (DWORD) (p.offset >> 32),
- (DWORD) (p.offset & 0xffffffff),
- p.length != max_length ? p.length : 0, (LPVOID) p.hint );
- if (!data) {
- if (p.hint != 0) {
- p.hint = 0;
- goto try_again;
- }
- detail::cleanup_and_throw(*pimpl_, "failed mapping view");
- }
-
- //--------------Determing file size---------------------------------------//
-
- // Dynamically locate GetFileSizeEx (thanks to Pavel Vozenilik).
- typedef BOOL (WINAPI *func)(HANDLE, PLARGE_INTEGER);
- HMODULE hmod = ::GetModuleHandleA("kernel32.dll");
- func get_size =
- reinterpret_cast<func>(::GetProcAddress(hmod, "GetFileSizeEx"));
-
- if (get_size) {
- LARGE_INTEGER info;
- if (get_size(pimpl_->handle_, &info)) {
- boost::intmax_t size =
- ( (static_cast<boost::intmax_t>(info.HighPart) << 32) |
- info.LowPart );
- pimpl_->size_ =
- static_cast<std::size_t>(
- p.length != max_length ?
- std::min<boost::intmax_t>(p.length, size) :
- size
- );
- } else {
- detail::cleanup_and_throw(*pimpl_, "failed getting file size");
- return;
- }
- } else {
- DWORD hi;
- DWORD low;
- if ( (low = ::GetFileSize(pimpl_->handle_, &hi))
- !=
- INVALID_FILE_SIZE )
- {
- boost::intmax_t size =
- (static_cast<boost::intmax_t>(hi) << 32) | low;
- pimpl_->size_ =
- static_cast<std::size_t>(
- p.length != max_length ?
- std::min<boost::intmax_t>(p.length, size) :
- size
- );
- } else {
- detail::cleanup_and_throw(*pimpl_, "failed getting file size");
- return;
- }
- }
-
- pimpl_->data_ = reinterpret_cast<char*>(data);
-}
-
-int mapped_file_source::alignment()
-{
- SYSTEM_INFO info;
- ::GetSystemInfo(&info);
- return static_cast<int>(info.dwAllocationGranularity);
-}
-
-#else // #ifdef BOOST_IOSTREAMS_WINDOWS //------------------------------------//
-
-namespace detail {
-
-void cleanup_and_throw(detail::mapped_file_impl& impl, const char* msg)
-{
- if (impl.handle_ != 0)
- ::close(impl.handle_);
- impl.clear(true);
- throw_system_failure(msg);
-}
-
-} // End namespace detail.
-
-
-void mapped_file_source::open_impl(mapped_file_params p)
-{
- using namespace std;
-
- if (is_open())
- throw BOOST_IOSTREAMS_FAILURE("file already open");
- if (!pimpl_)
- pimpl_.reset(new impl_type);
- else
- pimpl_->clear(false);
- bool readonly = (p.mode & BOOST_IOS::out) == 0;
- pimpl_->mode_ = readonly ? BOOST_IOS::in : (BOOST_IOS::in | BOOST_IOS::out);
-
- //--------------Open underlying file--------------------------------------//
-
- int flags = (readonly ? O_RDONLY : O_RDWR);
- if (p.new_file_size != 0 && !readonly)
- flags |= (O_CREAT | O_TRUNC);
- errno = 0;
- pimpl_->handle_ = ::open(p.path.c_str(), flags, S_IRWXU);
- if (errno != 0)
- detail::cleanup_and_throw(*pimpl_, "failed opening file");
-
- //--------------Set file size---------------------------------------------//
-
- if (p.new_file_size != 0 && !readonly)
- if (ftruncate(pimpl_->handle_, p.new_file_size) == -1)
- detail::cleanup_and_throw(*pimpl_, "failed setting file size");
-
- //--------------Determine file size---------------------------------------//
-
- bool success = true;
- struct stat info;
- if (p.length != max_length)
- pimpl_->size_ = p.length;
- else {
- success = ::fstat(pimpl_->handle_, &info) != -1;
- pimpl_->size_ = info.st_size;
- }
- if (!success)
- detail::cleanup_and_throw(*pimpl_, "failed getting file size");
-
- //--------------Create mapping--------------------------------------------//
-
- try_again: // Target of goto in following section.
-
- char* hint = const_cast<char*>(p.hint);
- void* data = ::mmap( hint, pimpl_->size_,
- readonly ? PROT_READ : (PROT_READ | PROT_WRITE),
- readonly ? MAP_PRIVATE : MAP_SHARED,
- pimpl_->handle_, p.offset );
- if (data == MAP_FAILED) {
- if (hint != 0) {
- hint = 0;
- goto try_again;
- }
- detail::cleanup_and_throw(*pimpl_, "failed mapping file");
- }
- pimpl_->data_ = reinterpret_cast<char*>(data);
-
- return;
-}
-
-int mapped_file_source::alignment()
-{ return static_cast<int>(sysconf(_SC_PAGESIZE)); }
-
-#endif // #ifdef BOOST_IOSTREAMS_WINDOWS //-----------------------------------//
-
-//------------------Implementation of mapped_file-----------------------------//
-
-mapped_file::mapped_file(mapped_file_params p) { delegate_.open_impl(p); }
-
-mapped_file::mapped_file( const std::string& path, BOOST_IOS::openmode mode,
- size_type length, stream_offset offset )
-{ open(path, mode, length, offset); }
-
-void mapped_file::open(mapped_file_params p)
-{ delegate_.open_impl(p); }
-
-void mapped_file::open( const std::string& path, BOOST_IOS::openmode mode,
- size_type length, stream_offset offset )
-{
- mapped_file_params p(path);
- p.mode = mode;
- p.length = length;
- p.offset = offset;
- open(p);
-}
-
-//------------------Implementation of mapped_file_sink------------------------//
-
-mapped_file_sink::mapped_file_sink(mapped_file_params p) { open(p); }
-
-mapped_file_sink::mapped_file_sink( const std::string& path,
- size_type length, stream_offset offset )
-{ open(path, length, offset); }
-
-void mapped_file_sink::open(mapped_file_params p)
-{
- p.mode |= BOOST_IOS::out;
- p.mode &= ~BOOST_IOS::in;
- mapped_file::open(p);
-}
-
-void mapped_file_sink::open( const std::string& path, size_type length,
- stream_offset offset )
-{
- mapped_file_params p(path);
- p.mode = BOOST_IOS::out;
- p.length = length;
- p.offset = offset;
- open(p);
-}
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.
-
-#include <boost/iostreams/detail/config/enable_warnings.hpp>
+++ /dev/null
-// (C) Copyright Jonathan Turkanis 2003.
-// Distributed under the Boost Software License, Version 1.0. (See accompanying
-// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt.)
-
-// See http://www.boost.org/libs/iostreams for documentation.
-
-// To configure Boost to work with zlib, see the
-// installation instructions here:
-// http://boost.org/libs/iostreams/doc/index.html?path=7
-
-// Define BOOST_IOSTREAMS_SOURCE so that <boost/iostreams/detail/config.hpp>
-// knows that we are building the library (possibly exporting code), rather
-// than using it (possibly importing code).
-#define BOOST_IOSTREAMS_SOURCE
-
-#include <boost/iostreams/detail/config/dyn_link.hpp>
-#include <boost/iostreams/filter/zlib.hpp>
-#include "zlib.h" // Jean-loup Gailly's and Mark Adler's "zlib.h" header.
- // To configure Boost to work with zlib, see the
- // installation instructions here:
- // http://boost.org/libs/iostreams/doc/index.html?path=7
-
-namespace boost { namespace iostreams {
-
-namespace zlib {
-
- // Compression levels
-
-const int no_compression = Z_NO_COMPRESSION;
-const int best_speed = Z_BEST_SPEED;
-const int best_compression = Z_BEST_COMPRESSION;
-const int default_compression = Z_DEFAULT_COMPRESSION;
-
- // Compression methods
-
-const int deflated = Z_DEFLATED;
-
- // Compression strategies
-
-const int default_strategy = Z_DEFAULT_STRATEGY;
-const int filtered = Z_FILTERED;
-const int huffman_only = Z_HUFFMAN_ONLY;
-
- // Status codes
-
-const int okay = Z_OK;
-const int stream_end = Z_STREAM_END;
-const int stream_error = Z_STREAM_ERROR;
-const int version_error = Z_VERSION_ERROR;
-const int data_error = Z_DATA_ERROR;
-const int mem_error = Z_MEM_ERROR;
-const int buf_error = Z_BUF_ERROR;
-
- // Flush codes
-
-const int finish = Z_FINISH;
-const int no_flush = Z_NO_FLUSH;
-const int sync_flush = Z_SYNC_FLUSH;
-
- // Code for current OS
-
-//const int os_code = OS_CODE;
-
-} // End namespace zlib.
-
-//------------------Implementation of zlib_error------------------------------//
-
-zlib_error::zlib_error(int error)
- : BOOST_IOSTREAMS_FAILURE("zlib error"), error_(error)
- { }
-
-void zlib_error::check(int error)
-{
- switch (error) {
- case Z_OK:
- case Z_STREAM_END:
- //case Z_BUF_ERROR:
- return;
- case Z_MEM_ERROR:
- throw std::bad_alloc();
- default:
- throw zlib_error(error);
- ;
- }
-}
-
-//------------------Implementation of zlib_base-------------------------------//
-
-namespace detail {
-
-zlib_base::zlib_base()
- : stream_(new z_stream), calculate_crc_(false), crc_(0)
- { }
-
-zlib_base::~zlib_base() { delete static_cast<z_stream*>(stream_); }
-
-void zlib_base::before( const char*& src_begin, const char* src_end,
- char*& dest_begin, char* dest_end )
-{
- z_stream* s = static_cast<z_stream*>(stream_);
- s->next_in = reinterpret_cast<zlib::byte*>(const_cast<char*>(src_begin));
- s->avail_in = static_cast<zlib::uint>(src_end - src_begin);
- s->next_out = reinterpret_cast<zlib::byte*>(dest_begin);
- s->avail_out= static_cast<zlib::uint>(dest_end - dest_begin);
-}
-
-void zlib_base::after(const char*& src_begin, char*& dest_begin, bool compress)
-{
- z_stream* s = static_cast<z_stream*>(stream_);
- char* next_in = reinterpret_cast<char*>(s->next_in);
- char* next_out = reinterpret_cast<char*>(s->next_out);
- if (calculate_crc_) {
- const zlib::byte* buf = compress ?
- reinterpret_cast<const zlib::byte*>(src_begin) :
- reinterpret_cast<const zlib::byte*>(
- const_cast<const char*>(dest_begin)
- );
- zlib::uint length = compress ?
- static_cast<zlib::uint>(next_in - src_begin) :
- static_cast<zlib::uint>(next_out - dest_begin);
- if (length > 0)
- crc_ = crc32(crc_, buf, length);
- }
- total_in_ = s->total_in;
- total_out_ = s->total_out;
- src_begin = const_cast<const char*>(next_in);
- dest_begin = next_out;
-}
-
-int zlib_base::deflate(int flush)
-{
- return ::deflate(static_cast<z_stream*>(stream_), flush);
-}
-
-int zlib_base::inflate(int flush)
-{
- return ::inflate(static_cast<z_stream*>(stream_), flush);
-}
-
-void zlib_base::reset(bool compress, bool realloc)
-{
- z_stream* s = static_cast<z_stream*>(stream_);
- // Undiagnosed bug:
- // deflateReset(), etc., return Z_DATA_ERROR
- //zlib_error::check(
- realloc ?
- (compress ? deflateReset(s) : inflateReset(s)) :
- (compress ? deflateEnd(s) : inflateEnd(s))
- ;
- //);
-}
-
-void zlib_base::do_init
- ( const zlib_params& p, bool compress,
- #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- zlib::alloc_func /*alloc*/, zlib::free_func /*free*/,
- #endif
- void* derived )
-{
- calculate_crc_ = p.calculate_crc;
- z_stream* s = static_cast<z_stream*>(stream_);
-
- // Current interface for customizing memory management
- // is non-conforming and has been disabled:
- //#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
- // s->zalloc = alloc;
- // s->zfree = free;
- //#else
- s->zalloc = 0;
- s->zfree = 0;
- //#endif
- s->opaque = derived;
- int window_bits = p.noheader? -p.window_bits : p.window_bits;
- zlib_error::check(
- compress ?
- deflateInit2( s,
- p.level,
- p.method,
- window_bits,
- p.mem_level,
- p.strategy ) :
- inflateInit2(s, window_bits)
- );
-}
-
-} // End namespace detail.
-
-//----------------------------------------------------------------------------//
-
-} } // End namespaces iostreams, boost.