//
-// Copyright (c) 2016-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
+// Copyright (c) 2016-2019 Vinnie Falco (vinnie dot falco at gmail dot com)
//
// 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)
}
void
- reset(int bits);
-
- void
- read(std::uint8_t* out, std::size_t pos, std::size_t n);
-
- template<class = void>
- void
- write(std::uint8_t const* in, std::size_t n);
-};
-
-inline
-void
-window::
-reset(int bits)
-{
- if(bits_ != bits)
- {
- p_.reset();
- bits_ = static_cast<std::uint8_t>(bits);
- capacity_ = 1U << bits_;
- }
- i_ = 0;
- size_ = 0;
-}
-
-inline
-void
-window::
-read(std::uint8_t* out, std::size_t pos, std::size_t n)
-{
- if(i_ >= size_)
- {
- // window is contiguous
- std::memcpy(out, &p_[i_ - pos], n);
- return;
- }
- auto i = ((i_ - pos) + capacity_) % capacity_;
- auto m = capacity_ - i;
- if(n <= m)
+ reset(int bits)
{
- std::memcpy(out, &p_[i], n);
- return;
+ if(bits_ != bits)
+ {
+ p_.reset();
+ bits_ = static_cast<std::uint8_t>(bits);
+ capacity_ = 1U << bits_;
+ }
+ i_ = 0;
+ size_ = 0;
}
- std::memcpy(out, &p_[i], m);
- out += m;
- std::memcpy(out, &p_[0], n - m);
-}
-
-template<class>
-void
-window::
-write(std::uint8_t const* in, std::size_t n)
-{
- if(! p_)
- p_ = boost::make_unique<
- std::uint8_t[]>(capacity_);
- if(n >= capacity_)
+
+ void
+ read(std::uint8_t* out, std::size_t pos, std::size_t n)
{
- i_ = 0;
- size_ = capacity_;
- std::memcpy(&p_[0], in + (n - size_), size_);
- return;
+ if(i_ >= size_)
+ {
+ // window is contiguous
+ std::memcpy(out, &p_[i_ - pos], n);
+ return;
+ }
+ auto i = ((i_ - pos) + capacity_) % capacity_;
+ auto m = capacity_ - i;
+ if(n <= m)
+ {
+ std::memcpy(out, &p_[i], n);
+ return;
+ }
+ std::memcpy(out, &p_[i], m);
+ out += m;
+ std::memcpy(out, &p_[0], n - m);
}
- if(i_ + n <= capacity_)
+
+ void
+ write(std::uint8_t const* in, std::size_t n)
{
- std::memcpy(&p_[i_], in, n);
- if(size_ >= capacity_ - n)
+ if(! p_)
+ p_ = boost::make_unique<
+ std::uint8_t[]>(capacity_);
+ if(n >= capacity_)
+ {
+ i_ = 0;
size_ = capacity_;
- else
- size_ = static_cast<std::uint16_t>(size_ + n);
-
- i_ = static_cast<std::uint16_t>(
- (i_ + n) % capacity_);
- return;
+ std::memcpy(&p_[0], in + (n - size_), size_);
+ return;
+ }
+ if(i_ + n <= capacity_)
+ {
+ std::memcpy(&p_[i_], in, n);
+ if(size_ >= capacity_ - n)
+ size_ = capacity_;
+ else
+ size_ = static_cast<std::uint16_t>(size_ + n);
+
+ i_ = static_cast<std::uint16_t>(
+ (i_ + n) % capacity_);
+ return;
+ }
+ auto m = capacity_ - i_;
+ std::memcpy(&p_[i_], in, m);
+ in += m;
+ i_ = static_cast<std::uint16_t>(n - m);
+ std::memcpy(&p_[0], in, i_);
+ size_ = capacity_;
}
- auto m = capacity_ - i_;
- std::memcpy(&p_[i_], in, m);
- in += m;
- i_ = static_cast<std::uint16_t>(n - m);
- std::memcpy(&p_[0], in, i_);
- size_ = capacity_;
-}
+};
} // detail
} // zlib