Export of internal Abseil changes.

--
9c4ef32276054fba6a116c01cd4b3fd278f59ece by Andy Soffer <asoffer@google.com>:

Remove support for unused arbitrary-width output in FastUniformBits. Width
should be inferred from the requested return UIntType.

PiperOrigin-RevId: 257189319

--
e3326329d02171a301cc3d6ae617ed448472b728 by Abseil Team <absl-team@google.com>:

Update comments to make clear that absl::Format(std::string *, ...) appends to the provided string.

PiperOrigin-RevId: 257058043

--
e2096b06d714fba3ea2c885d670a42efd872765c by Xiaoyi Zhang <zhangxy@google.com>:

Fix compilation error on MSVC 2017. The root cause seems to be a compiler bug
in VS 2017 about pack expansion with multiple parameter packs, specifically `MakeVisitationMatrixImpl::Run` is triggering compiler error "error C3528: 'BoundIndices': the number of elements in this pack expansion does not match the number of elements in 'EndIndices'".
Work around this issue by using only one parameter pack `CurrIndices` in `MakeVisitationMatrixImpl::Run`.

PiperOrigin-RevId: 257040381

--
9ab75ff27b2513583fffc1233e6568aa96be36f7 by Matt Calabrese <calabrese@google.com>:

Internal change.

PiperOrigin-RevId: 257039041
GitOrigin-RevId: 9c4ef32276054fba6a116c01cd4b3fd278f59ece
Change-Id: I5f708bb03aff93948502394a413260af2a8a273b
This commit is contained in:
Abseil Team 2019-07-09 07:37:37 -07:00 committed by Matt Calabrese
parent 3c98fcc046
commit 44efe96dfc
5 changed files with 50 additions and 211 deletions

View file

@ -204,7 +204,7 @@ template <class Op, class... Vs>
using VisitIndicesResultT = typename VisitIndicesResultImpl<Op, Vs...>::type;
template <class ReturnType, class FunctionObject, class EndIndices,
std::size_t... BoundIndices>
class BoundIndices>
struct MakeVisitationMatrix;
template <class ReturnType, class FunctionObject, std::size_t... Indices>
@ -218,7 +218,7 @@ constexpr ReturnType call_with_indices(FunctionObject&& function) {
template <class ReturnType, class FunctionObject, std::size_t... BoundIndices>
struct MakeVisitationMatrix<ReturnType, FunctionObject, index_sequence<>,
BoundIndices...> {
index_sequence<BoundIndices...>> {
using ResultType = ReturnType (*)(FunctionObject&&);
static constexpr ResultType Run() {
return &call_with_indices<ReturnType, FunctionObject,
@ -226,24 +226,34 @@ struct MakeVisitationMatrix<ReturnType, FunctionObject, index_sequence<>,
}
};
template <typename Is, std::size_t J>
struct AppendToIndexSequence;
template <typename Is, std::size_t J>
using AppendToIndexSequenceT = typename AppendToIndexSequence<Is, J>::type;
template <std::size_t... Is, std::size_t J>
struct AppendToIndexSequence<index_sequence<Is...>, J> {
using type = index_sequence<Is..., J>;
};
template <class ReturnType, class FunctionObject, class EndIndices,
class CurrIndices, std::size_t... BoundIndices>
class CurrIndices, class BoundIndices>
struct MakeVisitationMatrixImpl;
template <class ReturnType, class FunctionObject, std::size_t... EndIndices,
std::size_t... CurrIndices, std::size_t... BoundIndices>
struct MakeVisitationMatrixImpl<
ReturnType, FunctionObject, index_sequence<EndIndices...>,
index_sequence<CurrIndices...>, BoundIndices...> {
template <class ReturnType, class FunctionObject, class EndIndices,
std::size_t... CurrIndices, class BoundIndices>
struct MakeVisitationMatrixImpl<ReturnType, FunctionObject, EndIndices,
index_sequence<CurrIndices...>, BoundIndices> {
using ResultType = SimpleArray<
typename MakeVisitationMatrix<ReturnType, FunctionObject,
index_sequence<EndIndices...>>::ResultType,
typename MakeVisitationMatrix<ReturnType, FunctionObject, EndIndices,
index_sequence<>>::ResultType,
sizeof...(CurrIndices)>;
static constexpr ResultType Run() {
return {{MakeVisitationMatrix<ReturnType, FunctionObject,
index_sequence<EndIndices...>,
BoundIndices..., CurrIndices>::Run()...}};
return {{MakeVisitationMatrix<
ReturnType, FunctionObject, EndIndices,
AppendToIndexSequenceT<BoundIndices, CurrIndices>>::Run()...}};
}
};
@ -251,10 +261,11 @@ template <class ReturnType, class FunctionObject, std::size_t HeadEndIndex,
std::size_t... TailEndIndices, std::size_t... BoundIndices>
struct MakeVisitationMatrix<ReturnType, FunctionObject,
index_sequence<HeadEndIndex, TailEndIndices...>,
BoundIndices...>
: MakeVisitationMatrixImpl<
ReturnType, FunctionObject, index_sequence<TailEndIndices...>,
absl::make_index_sequence<HeadEndIndex>, BoundIndices...> {};
index_sequence<BoundIndices...>>
: MakeVisitationMatrixImpl<ReturnType, FunctionObject,
index_sequence<TailEndIndices...>,
absl::make_index_sequence<HeadEndIndex>,
index_sequence<BoundIndices...>> {};
struct UnreachableSwitchCase {
template <class Op>
@ -423,7 +434,8 @@ struct VisitIndicesFallback {
static VisitIndicesResultT<Op, SizeT...> Run(Op&& op, SizeT... indices) {
return AccessSimpleArray(
MakeVisitationMatrix<VisitIndicesResultT<Op, SizeT...>, Op,
index_sequence<(EndIndices + 1)...>>::Run(),
index_sequence<(EndIndices + 1)...>,
index_sequence<>>::Run(),
(indices + 1)...)(absl::forward<Op>(op));
}
};