forked from premiere/premiere-libtorrent
created aux::typed_span and related refactor
This commit is contained in:
parent
95c8c1de0f
commit
2437b3c134
|
@ -196,6 +196,7 @@ nobase_include_HEADERS = \
|
|||
aux_/numeric_cast.hpp \
|
||||
aux_/unique_ptr.hpp \
|
||||
aux_/alloca.hpp \
|
||||
aux_/typed_span.hpp \
|
||||
\
|
||||
extensions/smart_ban.hpp \
|
||||
extensions/ut_metadata.hpp \
|
||||
|
|
|
@ -33,32 +33,32 @@ POSSIBILITY OF SUCH DAMAGE.
|
|||
#ifndef TORRENT_ALLOCA
|
||||
|
||||
#include "libtorrent/config.hpp"
|
||||
#include "libtorrent/span.hpp"
|
||||
#include "libtorrent/aux_/typed_span.hpp"
|
||||
#include "libtorrent/aux_/numeric_cast.hpp"
|
||||
|
||||
#if defined TORRENT_WINDOWS || defined TORRENT_MINGW
|
||||
|
||||
#include <malloc.h>
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::span<t> v; { \
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::aux::typed_span<t> v; { \
|
||||
std::size_t TORRENT_ALLOCA_size = ::libtorrent::aux::numeric_cast<std::size_t>(n); \
|
||||
t* TORRENT_ALLOCA_tmp = static_cast<t*>(_alloca(sizeof(t) * TORRENT_ALLOCA_size)); \
|
||||
v = ::libtorrent::span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
v = ::libtorrent::aux::typed_span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
|
||||
#elif defined TORRENT_BSD
|
||||
|
||||
#include <stdlib.h>
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::span<t> v; { \
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::aux::typed_span<t> v; { \
|
||||
std::size_t TORRENT_ALLOCA_size = ::libtorrent::aux::numeric_cast<std::size_t>(n); \
|
||||
t* TORRENT_ALLOCA_tmp = static_cast<t*>(alloca(sizeof(t) * TORRENT_ALLOCA_size)); \
|
||||
v = ::libtorrent::span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
v = ::libtorrent::aux::typed_span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
|
||||
#else
|
||||
|
||||
#include <alloca.h>
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::span<t> v; { \
|
||||
#define TORRENT_ALLOCA(v, t, n) ::libtorrent::aux::typed_span<t> v; { \
|
||||
std::size_t TORRENT_ALLOCA_size = ::libtorrent::aux::numeric_cast<std::size_t>(n); \
|
||||
t* TORRENT_ALLOCA_tmp = static_cast<t*>(alloca(sizeof(t) * TORRENT_ALLOCA_size)); \
|
||||
v = ::libtorrent::span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
v = ::libtorrent::aux::typed_span<t>(TORRENT_ALLOCA_tmp, TORRENT_ALLOCA_size); }
|
||||
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,126 @@
|
|||
/*
|
||||
|
||||
Copyright (c) 2017, Arvid Norberg, Alden Torres
|
||||
All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in
|
||||
the documentation and/or other materials provided with the distribution.
|
||||
* Neither the name of the author nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
*/
|
||||
|
||||
#ifndef TORRENT_TYPED_SPAN_HPP
|
||||
#define TORRENT_TYPED_SPAN_HPP
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
#include "libtorrent/units.hpp"
|
||||
#include "libtorrent/span.hpp"
|
||||
#include "libtorrent/assert.hpp"
|
||||
|
||||
namespace libtorrent { namespace aux {
|
||||
|
||||
template <typename T, typename IndexType = int>
|
||||
struct typed_span : span<T>
|
||||
{
|
||||
using base = span<T>;
|
||||
using underlying_index = typename underlying_index_t<IndexType>::type;
|
||||
|
||||
// pull in constructors from base class
|
||||
using base::base;
|
||||
|
||||
auto operator[](IndexType idx) -> decltype(this->base::operator[](underlying_index()))
|
||||
{
|
||||
TORRENT_ASSERT(idx >= IndexType(0));
|
||||
return this->base::operator[](std::size_t(static_cast<underlying_index>(idx)));
|
||||
}
|
||||
|
||||
IndexType end_index() const
|
||||
{
|
||||
TORRENT_ASSERT(this->size() <= std::size_t(std::numeric_limits<underlying_index>::max()));
|
||||
return IndexType(static_cast<underlying_index>(this->size()));
|
||||
}
|
||||
|
||||
template <typename U = underlying_index, typename Cond
|
||||
= typename std::enable_if<std::is_signed<U>::value>::type>
|
||||
typed_span<T> first(underlying_index n)
|
||||
{
|
||||
TORRENT_ASSERT(n >= 0);
|
||||
return this->base::first(std::size_t(n));
|
||||
}
|
||||
|
||||
typed_span<T> first(std::size_t n)
|
||||
{
|
||||
TORRENT_ASSERT(n <= std::size_t((std::numeric_limits<underlying_index>::max)()));
|
||||
return this->base::first(n);
|
||||
}
|
||||
|
||||
template <typename U = underlying_index, typename Cond
|
||||
= typename std::enable_if<std::is_signed<U>::value>::type>
|
||||
typed_span<T> last(underlying_index n)
|
||||
{
|
||||
TORRENT_ASSERT(n >= 0);
|
||||
return this->base::last(std::size_t(n));
|
||||
}
|
||||
|
||||
typed_span<T> last(std::size_t n)
|
||||
{
|
||||
TORRENT_ASSERT(n <= std::size_t((std::numeric_limits<underlying_index>::max)()));
|
||||
return this->base::last(n);
|
||||
}
|
||||
|
||||
template <typename U = underlying_index, typename Cond
|
||||
= typename std::enable_if<std::is_signed<U>::value>::type>
|
||||
typed_span<T> subspan(underlying_index offset)
|
||||
{
|
||||
TORRENT_ASSERT(offset >= 0);
|
||||
return this->base::subspan(std::size_t(offset));
|
||||
}
|
||||
|
||||
template <typename U = underlying_index, typename Cond
|
||||
= typename std::enable_if<std::is_signed<U>::value>::type>
|
||||
typed_span<T> subspan(underlying_index offset, underlying_index count)
|
||||
{
|
||||
TORRENT_ASSERT(offset >= 0);
|
||||
TORRENT_ASSERT(count >= 0);
|
||||
return this->base::subspan(std::size_t(offset), std::size_t(count));
|
||||
}
|
||||
|
||||
typed_span<T> subspan(std::size_t offset)
|
||||
{
|
||||
TORRENT_ASSERT(offset <= std::size_t((std::numeric_limits<underlying_index>::max)()));
|
||||
return this->base::subspan(offset);
|
||||
}
|
||||
|
||||
typed_span<T> subspan(std::size_t offset, std::size_t count)
|
||||
{
|
||||
TORRENT_ASSERT(offset <= std::size_t((std::numeric_limits<underlying_index>::max)()));
|
||||
TORRENT_ASSERT(count <= std::size_t((std::numeric_limits<underlying_index>::max)()));
|
||||
return this->base::subspan(offset, count);
|
||||
}
|
||||
};
|
||||
|
||||
}}
|
||||
|
||||
#endif
|
|
@ -51,7 +51,7 @@ namespace libtorrent { namespace aux {
|
|||
using underlying_index = typename underlying_index_t<IndexType>::type;
|
||||
|
||||
unique_ptr() {}
|
||||
explicit unique_ptr(T arr[]) : base(arr) {}
|
||||
explicit unique_ptr(T* arr) : base(arr) {}
|
||||
|
||||
auto operator[](IndexType idx) const -> decltype(this->base::operator[](underlying_index()))
|
||||
{
|
||||
|
|
|
@ -653,7 +653,7 @@ namespace libtorrent
|
|||
|
||||
// this is the stack of bdecode_token indices, into m_tokens.
|
||||
// sp is the stack pointer, as index into the array, stack
|
||||
std::size_t sp = 0;
|
||||
int sp = 0;
|
||||
TORRENT_ALLOCA(stack, stack_frame, depth_limit);
|
||||
|
||||
char const* const orig_start = start;
|
||||
|
@ -665,7 +665,7 @@ namespace libtorrent
|
|||
{
|
||||
if (start >= end) TORRENT_FAIL_BDECODE(bdecode_errors::unexpected_eof);
|
||||
|
||||
if (sp >= aux::numeric_cast<std::size_t>(depth_limit))
|
||||
if (sp >= depth_limit)
|
||||
TORRENT_FAIL_BDECODE(bdecode_errors::depth_exceeded);
|
||||
|
||||
--token_limit;
|
||||
|
@ -675,7 +675,7 @@ namespace libtorrent
|
|||
// look for a new token
|
||||
char const t = *start;
|
||||
|
||||
std::size_t const current_frame = sp;
|
||||
int const current_frame = sp;
|
||||
|
||||
// if we're currently parsing a dictionary, assert that
|
||||
// every other node is a string.
|
||||
|
|
|
@ -554,7 +554,7 @@ void block_cache::try_evict_one_volatile()
|
|||
// some blocks are pinned in this piece, skip it
|
||||
if (pe->pinned > 0) continue;
|
||||
|
||||
TORRENT_ALLOCA(to_delete, char*, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(to_delete, char*, pe->blocks_in_piece);
|
||||
int num_to_delete = 0;
|
||||
|
||||
// go through the blocks and evict the ones that are not dirty and not
|
||||
|
@ -861,7 +861,7 @@ bool block_cache::evict_piece(cached_piece_entry* pe, tailqueue<disk_io_job>& jo
|
|||
|
||||
TORRENT_PIECE_ASSERT(pe->in_use, pe);
|
||||
|
||||
TORRENT_ALLOCA(to_delete, char*, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(to_delete, char*, pe->blocks_in_piece);
|
||||
int num_to_delete = 0;
|
||||
for (int i = 0; i < pe->blocks_in_piece; ++i)
|
||||
{
|
||||
|
@ -1393,7 +1393,7 @@ void block_cache::abort_dirty(cached_piece_entry* pe)
|
|||
|
||||
TORRENT_PIECE_ASSERT(pe->in_use, pe);
|
||||
|
||||
TORRENT_ALLOCA(to_delete, char*, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(to_delete, char*, pe->blocks_in_piece);
|
||||
int num_to_delete = 0;
|
||||
for (int i = 0; i < pe->blocks_in_piece; ++i)
|
||||
{
|
||||
|
@ -1432,7 +1432,7 @@ void block_cache::free_piece(cached_piece_entry* pe)
|
|||
|
||||
// build a vector of all the buffers we need to free
|
||||
// and free them all in one go
|
||||
TORRENT_ALLOCA(to_delete, char*, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(to_delete, char*, pe->blocks_in_piece);
|
||||
int num_to_delete = 0;
|
||||
int removed_clean = 0;
|
||||
for (int i = 0; i < pe->blocks_in_piece; ++i)
|
||||
|
|
|
@ -762,8 +762,8 @@ namespace libtorrent
|
|||
TORRENT_PIECE_ASSERT(start >= 0, pe);
|
||||
TORRENT_PIECE_ASSERT(start < end, pe);
|
||||
|
||||
TORRENT_ALLOCA(iov, iovec_t, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(flushing, int, std::size_t(pe->blocks_in_piece));
|
||||
TORRENT_ALLOCA(iov, iovec_t, pe->blocks_in_piece);
|
||||
TORRENT_ALLOCA(flushing, int, pe->blocks_in_piece);
|
||||
int iov_len = build_iovec(pe, start, end, iov, flushing, 0);
|
||||
if (iov_len == 0) return 0;
|
||||
|
||||
|
|
Loading…
Reference in New Issue