diff options
Diffstat (limited to 'boost/iostreams')
-rw-r--r-- | boost/iostreams/chain.hpp | 12 | ||||
-rw-r--r-- | boost/iostreams/detail/adapter/direct_adapter.hpp | 1 | ||||
-rw-r--r-- | boost/iostreams/detail/adapter/non_blocking_adapter.hpp | 2 | ||||
-rw-r--r-- | boost/iostreams/detail/buffer.hpp | 2 | ||||
-rw-r--r-- | boost/iostreams/detail/config/codecvt.hpp | 2 | ||||
-rw-r--r-- | boost/iostreams/detail/config/fpos.hpp | 11 | ||||
-rw-r--r-- | boost/iostreams/detail/config/wide_streams.hpp | 3 | ||||
-rw-r--r-- | boost/iostreams/detail/restrict_impl.hpp | 2 | ||||
-rw-r--r-- | boost/iostreams/detail/streambuf/direct_streambuf.hpp | 4 | ||||
-rw-r--r-- | boost/iostreams/detail/streambuf/indirect_streambuf.hpp | 4 | ||||
-rw-r--r-- | boost/iostreams/detail/streambuf/linked_streambuf.hpp | 4 | ||||
-rw-r--r-- | boost/iostreams/filter/bzip2.hpp | 11 | ||||
-rw-r--r-- | boost/iostreams/filter/zstd.hpp | 363 |
13 files changed, 399 insertions, 22 deletions
diff --git a/boost/iostreams/chain.hpp b/boost/iostreams/chain.hpp index 4e108c8b09..5a17b8c472 100644 --- a/boost/iostreams/chain.hpp +++ b/boost/iostreams/chain.hpp @@ -17,11 +17,11 @@ #include <iterator> // advance. #include <list> #include <memory> // allocator, auto_ptr or unique_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/core/typeinfo.hpp> #include <boost/iostreams/constants.hpp> #include <boost/iostreams/detail/access_control.hpp> #include <boost/iostreams/detail/char_traits.hpp> @@ -164,7 +164,7 @@ public: //----------Direct component access---------------------------------------// - const std::type_info& component_type(int n) const + const boost::core::typeinfo& component_type(int n) const { if (static_cast<size_type>(n) >= size()) boost::throw_exception(std::out_of_range("bad chain offset")); @@ -173,7 +173,7 @@ public: // Deprecated. template<int N> - const std::type_info& component_type() const { return component_type(N); } + const boost::core::typeinfo& component_type() const { return component_type(N); } template<typename T> T* component(int n) const { return component(n, boost::type<T>()); } @@ -191,7 +191,7 @@ public: if (static_cast<size_type>(n) >= size()) boost::throw_exception(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))) + if (BOOST_IOSTREAMS_COMPARE_TYPE_ID(link->component_type(), BOOST_CORE_TYPEID(T))) return static_cast<T*>(link->component_impl()); else return 0; @@ -455,12 +455,12 @@ public: chain_client(chain_client* client) : chain_(client->chain_) { } virtual ~chain_client() { } - const std::type_info& component_type(int n) const + const boost::core::typeinfo& component_type(int n) const { return chain_->component_type(n); } // Deprecated. template<int N> - const std::type_info& component_type() const + const boost::core::typeinfo& component_type() const { return chain_->BOOST_NESTED_TEMPLATE component_type<N>(); } template<typename T> diff --git a/boost/iostreams/detail/adapter/direct_adapter.hpp b/boost/iostreams/detail/adapter/direct_adapter.hpp index 243b4b0abf..60fe8c274f 100644 --- a/boost/iostreams/detail/adapter/direct_adapter.hpp +++ b/boost/iostreams/detail/adapter/direct_adapter.hpp @@ -58,6 +58,7 @@ protected: explicit direct_adapter_base(const Direct& d); typedef is_convertible<category, two_sequence> is_double; struct pointers { + pointers() : beg(0), ptr(0), end(0) { } char_type *beg, *ptr, *end; }; void init_input(mpl::true_); diff --git a/boost/iostreams/detail/adapter/non_blocking_adapter.hpp b/boost/iostreams/detail/adapter/non_blocking_adapter.hpp index 623cf769d2..85794d0daa 100644 --- a/boost/iostreams/detail/adapter/non_blocking_adapter.hpp +++ b/boost/iostreams/detail/adapter/non_blocking_adapter.hpp @@ -28,7 +28,7 @@ public: { std::streamsize result = 0; while (result < n) { - std::streamsize amt = iostreams::read(device_, s, n); + std::streamsize amt = iostreams::read(device_, s + result, n - result); if (amt == -1) break; result += amt; diff --git a/boost/iostreams/detail/buffer.hpp b/boost/iostreams/detail/buffer.hpp index 35cb33c700..59617f4eb3 100644 --- a/boost/iostreams/detail/buffer.hpp +++ b/boost/iostreams/detail/buffer.hpp @@ -205,7 +205,7 @@ void basic_buffer<Ch, Alloc>::swap(basic_buffer& rhs) template<typename Ch, typename Alloc> buffer<Ch, Alloc>::buffer(std::streamsize buffer_size) - : basic_buffer<Ch, Alloc>(buffer_size) { } + : basic_buffer<Ch, Alloc>(buffer_size), ptr_(data()), eptr_(data() + buffer_size) { } template<typename Ch, typename Alloc> inline void buffer<Ch, Alloc>::set(std::streamsize ptr, std::streamsize end) diff --git a/boost/iostreams/detail/config/codecvt.hpp b/boost/iostreams/detail/config/codecvt.hpp index 6519ddcd44..48adf4da80 100644 --- a/boost/iostreams/detail/config/codecvt.hpp +++ b/boost/iostreams/detail/config/codecvt.hpp @@ -42,7 +42,7 @@ //------------------Normalize codecvt::length---------------------------------// -#if !defined(__MSL_CPP__) && !defined(__LIBCOMO__) && \ +#if !defined(__MSL_CPP__) && !defined(__LIBCOMO__) && !defined(__clang__) && \ (!defined(BOOST_RWSTD_VER) || BOOST_RWSTD_VER < 0x04010300) && \ (!defined(__MACH__) || !defined(__INTEL_COMPILER)) /**/ diff --git a/boost/iostreams/detail/config/fpos.hpp b/boost/iostreams/detail/config/fpos.hpp index 12c13a0f1e..b46b168973 100644 --- a/boost/iostreams/detail/config/fpos.hpp +++ b/boost/iostreams/detail/config/fpos.hpp @@ -1,7 +1,7 @@ /* - * Distributed under the Boost Software License, Version 1.0.(See accompanying + * 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. * File: boost/iostreams/detail/execute.hpp @@ -11,7 +11,7 @@ * Contact: turkanis at coderage dot com * * Defines the preprocessor symbol BOOST_IOSTREAMS_HAS_DINKUMWARE_FPOS for - * platforms that use the implementation of std::fpos from the Dinkumware + * platforms that use the implementation of std::fpos from the Dinkumware * Standard Library. */ @@ -25,9 +25,10 @@ #include <boost/config.hpp> # if (defined(_YVALS) || defined(_CPPLIB_VER)) && !defined(__SGI_STL_PORT) && \ - !defined(_STLPORT_VERSION) && !defined(__QNX__) && !defined(_VX_CPU) && !defined(__VXWORKS__) + !defined(_STLPORT_VERSION) && !defined(__QNX__) && !defined(_VX_CPU) && !defined(__VXWORKS__) \ + && !(defined(BOOST_MSVC) && _MSVC_STL_VERSION >= 141) /**/ - + #include <boost/iostreams/detail/ios.hpp> # define BOOST_IOSTREAMS_HAS_DINKUMWARE_FPOS diff --git a/boost/iostreams/detail/config/wide_streams.hpp b/boost/iostreams/detail/config/wide_streams.hpp index af3d716d49..ca8dff38f5 100644 --- a/boost/iostreams/detail/config/wide_streams.hpp +++ b/boost/iostreams/detail/config/wide_streams.hpp @@ -44,8 +44,7 @@ //------------------Locale support--------------------------------------------// #ifndef BOOST_IOSTREAMS_NO_LOCALE -# if defined(BOOST_NO_STD_LOCALE) || \ - defined(__CYGWIN__) && \ +# if defined(BOOST_NO_STD_LOCALE) && \ ( !defined(__MSL_CPP__) || defined(_MSL_NO_WCHART_CPP_SUPPORT) ) \ /**/ # define BOOST_IOSTREAMS_NO_LOCALE diff --git a/boost/iostreams/detail/restrict_impl.hpp b/boost/iostreams/detail/restrict_impl.hpp index 8278db5a6a..e949b6ac47 100644 --- a/boost/iostreams/detail/restrict_impl.hpp +++ b/boost/iostreams/detail/restrict_impl.hpp @@ -478,4 +478,6 @@ BOOST_IOSTREAMS_RESTRICT(T& t, stream_offset off, stream_offset len = -1) } } // End namespaces iostreams, boost. +# include <boost/iostreams/detail/config/enable_warnings.hpp> + #endif // #if !defined(BOOST_IOSTREAMS_RESTRICT_IMPL_HPP_INCLUDED) ... diff --git a/boost/iostreams/detail/streambuf/direct_streambuf.hpp b/boost/iostreams/detail/streambuf/direct_streambuf.hpp index 69efe2b128..a55c4621ef 100644 --- a/boost/iostreams/detail/streambuf/direct_streambuf.hpp +++ b/boost/iostreams/detail/streambuf/direct_streambuf.hpp @@ -14,9 +14,9 @@ #include <boost/assert.hpp> #include <cstddef> -#include <typeinfo> #include <utility> // pair. #include <boost/config.hpp> // BOOST_DEDUCED_TYPENAME, +#include <boost/core/typeinfo.hpp> #include <boost/iostreams/detail/char_traits.hpp> // member template friends. #include <boost/iostreams/detail/config/wide_streams.hpp> #include <boost/iostreams/detail/error.hpp> @@ -74,7 +74,7 @@ protected: // Declared in linked_streambuf. void close_impl(BOOST_IOS::openmode m); - const std::type_info& component_type() const { return typeid(T); } + const boost::core::typeinfo& component_type() const { return BOOST_CORE_TYPEID(T); } void* component_impl() { return component(); } #ifdef BOOST_IOSTREAMS_NO_STREAM_TEMPLATES public: diff --git a/boost/iostreams/detail/streambuf/indirect_streambuf.hpp b/boost/iostreams/detail/streambuf/indirect_streambuf.hpp index 90e1e11531..6eb1050717 100644 --- a/boost/iostreams/detail/streambuf/indirect_streambuf.hpp +++ b/boost/iostreams/detail/streambuf/indirect_streambuf.hpp @@ -16,9 +16,9 @@ #include <algorithm> // min, max. #include <cassert> #include <exception> -#include <typeinfo> #include <boost/config.hpp> // Member template friends. #include <boost/detail/workaround.hpp> +#include <boost/core/typeinfo.hpp> #include <boost/iostreams/constants.hpp> #include <boost/iostreams/detail/adapter/concept_adapter.hpp> #include <boost/iostreams/detail/buffer.hpp> @@ -94,7 +94,7 @@ protected: // Declared in linked_streambuf. void set_next(streambuf_type* next); void close_impl(BOOST_IOS::openmode m); - const std::type_info& component_type() const { return typeid(T); } + const boost::core::typeinfo& component_type() const { return BOOST_CORE_TYPEID(T); } void* component_impl() { return component(); } private: diff --git a/boost/iostreams/detail/streambuf/linked_streambuf.hpp b/boost/iostreams/detail/streambuf/linked_streambuf.hpp index 9999ded62f..708c2c42ab 100644 --- a/boost/iostreams/detail/streambuf/linked_streambuf.hpp +++ b/boost/iostreams/detail/streambuf/linked_streambuf.hpp @@ -12,8 +12,8 @@ # pragma once #endif -#include <typeinfo> #include <boost/config.hpp> // member template friends. +#include <boost/core/typeinfo.hpp> #include <boost/iostreams/detail/char_traits.hpp> #include <boost/iostreams/detail/ios.hpp> // openmode. #include <boost/iostreams/detail/streambuf.hpp> @@ -91,7 +91,7 @@ protected: 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 const boost::core::typeinfo& component_type() const = 0; virtual void* component_impl() = 0; #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS private: diff --git a/boost/iostreams/filter/bzip2.hpp b/boost/iostreams/filter/bzip2.hpp index b9c04a7ce1..249e43a04f 100644 --- a/boost/iostreams/filter/bzip2.hpp +++ b/boost/iostreams/filter/bzip2.hpp @@ -175,6 +175,7 @@ protected: int check_end(const char* src_begin, const char* dest_begin); int compress(int action); int decompress(); + int end(bool compress, std::nothrow_t); void end(bool compress); private: void do_init( bool compress, @@ -201,6 +202,7 @@ class bzip2_compressor_impl { public: bzip2_compressor_impl(const bzip2_params&); + ~bzip2_compressor_impl(); bool filter( const char*& src_begin, const char* src_end, char*& dest_begin, char* dest_end, bool flush ); void close(); @@ -224,6 +226,7 @@ class bzip2_decompressor_impl { public: bzip2_decompressor_impl(bool small = bzip2::default_small); + ~bzip2_decompressor_impl(); bool filter( const char*& begin_in, const char* end_in, char*& begin_out, char* end_out, bool flush ); void close(); @@ -314,6 +317,10 @@ bzip2_compressor_impl<Alloc>::bzip2_compressor_impl(const bzip2_params& p) : bzip2_base(p), eof_(false) { } template<typename Alloc> +bzip2_compressor_impl<Alloc>::~bzip2_compressor_impl() +{ (void) bzip2_base::end(true, std::nothrow); } + +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 ) @@ -350,6 +357,10 @@ bzip2_decompressor_impl<Alloc>::bzip2_decompressor_impl(bool small) : bzip2_base(bzip2_params(small)), eof_(false) { } template<typename Alloc> +bzip2_decompressor_impl<Alloc>::~bzip2_decompressor_impl() +{ (void) bzip2_base::end(false, std::nothrow); } + +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 ) diff --git a/boost/iostreams/filter/zstd.hpp b/boost/iostreams/filter/zstd.hpp new file mode 100644 index 0000000000..176799d937 --- /dev/null +++ b/boost/iostreams/filter/zstd.hpp @@ -0,0 +1,363 @@ +// (C) Copyright Reimar Döffinger 2018. +// Based on zstd.hpp by: +// (C) Copyright Milan Svoboda 2008. +// 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_ZSTD_HPP_INCLUDED +#define BOOST_IOSTREAMS_ZSTD_HPP_INCLUDED + +#if defined(_MSC_VER) +# 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/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 zstd { + +typedef void* (*alloc_func)(void*, size_t, size_t); +typedef void (*free_func)(void*, void*); + + // Compression levels + +BOOST_IOSTREAMS_DECL extern const uint32_t best_speed; +BOOST_IOSTREAMS_DECL extern const uint32_t best_compression; +BOOST_IOSTREAMS_DECL extern const uint32_t default_compression; + + // Status codes + +BOOST_IOSTREAMS_DECL extern const int okay; +BOOST_IOSTREAMS_DECL extern const int stream_end; + + // Flush codes + +BOOST_IOSTREAMS_DECL extern const int finish; +BOOST_IOSTREAMS_DECL extern const int flush; +BOOST_IOSTREAMS_DECL extern const int run; + + // Code for current OS + + // Null pointer constant. + +const int null = 0; + + // Default values + +} // End namespace zstd. + +// +// Class name: zstd_params. +// Description: Encapsulates the parameters passed to zstddec_init +// to customize compression and decompression. +// +struct zstd_params { + + // Non-explicit constructor. + zstd_params( uint32_t level = zstd::default_compression ) + : level(level) + { } + uint32_t level; +}; + +// +// Class name: zstd_error. +// Description: Subclass of std::ios::failure thrown to indicate +// zstd errors other than out-of-memory conditions. +// +class BOOST_IOSTREAMS_DECL zstd_error : public BOOST_IOSTREAMS_FAILURE { +public: + explicit zstd_error(size_t error); + int error() const { return error_; } + static void check BOOST_PREVENT_MACRO_SUBSTITUTION(size_t error); +private: + size_t error_; +}; + +namespace detail { + +template<typename Alloc> +struct zstd_allocator_traits { +#ifndef BOOST_NO_STD_ALLOCATOR +#if defined(BOOST_NO_CXX11_ALLOCATOR) + typedef typename Alloc::template rebind<char>::other type; +#else + typedef typename std::allocator_traits<Alloc>::template rebind_alloc<char> type; +#endif +#else + typedef std::allocator<char> type; +#endif +}; + +template< typename Alloc, + typename Base = // VC6 workaround (C2516) + BOOST_DEDUCED_TYPENAME zstd_allocator_traits<Alloc>::type > +struct zstd_allocator : private Base { +private: +#if defined(BOOST_NO_CXX11_ALLOCATOR) || defined(BOOST_NO_STD_ALLOCATOR) + typedef typename Base::size_type size_type; +#else + typedef typename std::allocator_traits<Base>::size_type size_type; +#endif +public: + BOOST_STATIC_CONSTANT(bool, custom = + (!is_same<std::allocator<char>, Base>::value)); + typedef typename zstd_allocator_traits<Alloc>::type allocator_type; + static void* allocate(void* self, size_t items, size_t size); + static void deallocate(void* self, void* address); +}; + +class BOOST_IOSTREAMS_DECL zstd_base { +public: + typedef char char_type; +protected: + zstd_base(); + ~zstd_base(); + template<typename Alloc> + void init( const zstd_params& p, + bool compress, + zstd_allocator<Alloc>& zalloc ) + { + bool custom = zstd_allocator<Alloc>::custom; + do_init( p, compress, + custom ? zstd_allocator<Alloc>::allocate : 0, + custom ? zstd_allocator<Alloc>::deallocate : 0, + &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 action); + int inflate(int action); + void reset(bool compress, bool realloc); +private: + void do_init( const zstd_params& p, bool compress, + zstd::alloc_func, + zstd::free_func, + void* derived ); + void* cstream_; // Actual type: ZSTD_CStream * + void* dstream_; // Actual type: ZSTD_DStream * + void* in_; // Actual type: ZSTD_inBuffer * + void* out_; // Actual type: ZSTD_outBuffer * + int eof_; + uint32_t level; +}; + +// +// Template name: zstd_compressor_impl +// Description: Model of C-Style Filter implementing compression by +// delegating to the zstd function deflate. +// +template<typename Alloc = std::allocator<char> > +class zstd_compressor_impl : public zstd_base, public zstd_allocator<Alloc> { +public: + zstd_compressor_impl(const zstd_params& = zstd::default_compression); + ~zstd_compressor_impl(); + bool filter( const char*& src_begin, const char* src_end, + char*& dest_begin, char* dest_end, bool flush ); + void close(); +}; + +// +// Template name: zstd_compressor_impl +// Description: Model of C-Style Filte implementing decompression by +// delegating to the zstd function inflate. +// +template<typename Alloc = std::allocator<char> > +class zstd_decompressor_impl : public zstd_base, public zstd_allocator<Alloc> { +public: + zstd_decompressor_impl(const zstd_params&); + zstd_decompressor_impl(); + ~zstd_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: zstd_compressor +// Description: Model of InputFilter and OutputFilter implementing +// compression using zstd. +// +template<typename Alloc = std::allocator<char> > +struct basic_zstd_compressor + : symmetric_filter<detail::zstd_compressor_impl<Alloc>, Alloc> +{ +private: + typedef detail::zstd_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_zstd_compressor( const zstd_params& = zstd::default_compression, + std::streamsize buffer_size = default_device_buffer_size ); +}; +BOOST_IOSTREAMS_PIPABLE(basic_zstd_compressor, 1) + +typedef basic_zstd_compressor<> zstd_compressor; + +// +// Template name: zstd_decompressor +// Description: Model of InputFilter and OutputFilter implementing +// decompression using zstd. +// +template<typename Alloc = std::allocator<char> > +struct basic_zstd_decompressor + : symmetric_filter<detail::zstd_decompressor_impl<Alloc>, Alloc> +{ +private: + typedef detail::zstd_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_zstd_decompressor( std::streamsize buffer_size = default_device_buffer_size ); + basic_zstd_decompressor( const zstd_params& p, + std::streamsize buffer_size = default_device_buffer_size ); +}; +BOOST_IOSTREAMS_PIPABLE(basic_zstd_decompressor, 1) + +typedef basic_zstd_decompressor<> zstd_decompressor; + +//----------------------------------------------------------------------------// + +//------------------Implementation of zstd_allocator--------------------------// + +namespace detail { + +template<typename Alloc, typename Base> +void* zstd_allocator<Alloc, Base>::allocate + (void* self, size_t items, size_t 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 zstd_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 zstd_compressor_impl--------------------// + +template<typename Alloc> +zstd_compressor_impl<Alloc>::zstd_compressor_impl(const zstd_params& p) +{ init(p, true, static_cast<zstd_allocator<Alloc>&>(*this)); } + +template<typename Alloc> +zstd_compressor_impl<Alloc>::~zstd_compressor_impl() +{ reset(true, false); } + +template<typename Alloc> +bool zstd_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 ? zstd::finish : zstd::run); + after(src_begin, dest_begin, true); + return result != zstd::stream_end; +} + +template<typename Alloc> +void zstd_compressor_impl<Alloc>::close() { reset(true, true); } + +//------------------Implementation of zstd_decompressor_impl------------------// + +template<typename Alloc> +zstd_decompressor_impl<Alloc>::zstd_decompressor_impl(const zstd_params& p) +{ init(p, false, static_cast<zstd_allocator<Alloc>&>(*this)); } + +template<typename Alloc> +zstd_decompressor_impl<Alloc>::~zstd_decompressor_impl() +{ reset(false, false); } + +template<typename Alloc> +zstd_decompressor_impl<Alloc>::zstd_decompressor_impl() +{ + zstd_params p; + init(p, false, static_cast<zstd_allocator<Alloc>&>(*this)); +} + +template<typename Alloc> +bool zstd_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(flush ? zstd::finish : zstd::run); + after(src_begin, dest_begin, false); + return result != zstd::stream_end; +} + +template<typename Alloc> +void zstd_decompressor_impl<Alloc>::close() { reset(false, true); } + +} // End namespace detail. + +//------------------Implementation of zstd_compressor-----------------------// + +template<typename Alloc> +basic_zstd_compressor<Alloc>::basic_zstd_compressor + (const zstd_params& p, std::streamsize buffer_size) + : base_type(buffer_size, p) { } + +//------------------Implementation of zstd_decompressor-----------------------// + +template<typename Alloc> +basic_zstd_decompressor<Alloc>::basic_zstd_decompressor + (std::streamsize buffer_size) + : base_type(buffer_size) { } + +template<typename Alloc> +basic_zstd_decompressor<Alloc>::basic_zstd_decompressor + (const zstd_params& p, std::streamsize 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_ZSTD_HPP_INCLUDED |