57 lines
1.7 KiB
C++
57 lines
1.7 KiB
C++
#ifndef ANDROID_PDX_RPC_SEQUENCE_H_
|
|
#define ANDROID_PDX_RPC_SEQUENCE_H_
|
|
|
|
#include <cstdint>
|
|
|
|
namespace android {
|
|
namespace pdx {
|
|
namespace rpc {
|
|
|
|
// Provides a C++11 implementation of C++14 index_sequence and
|
|
// make_index_sequence for compatibility with common compilers. This
|
|
// implementation may be conditionally replaced with compiler-provided versions
|
|
// when C++14 support is available.
|
|
|
|
// Utility to capture a sequence of unsigned indices.
|
|
template <std::size_t... I>
|
|
struct IndexSequence {
|
|
using type = IndexSequence;
|
|
using value_type = std::size_t;
|
|
static constexpr std::size_t size() { return sizeof...(I); }
|
|
};
|
|
|
|
namespace detail {
|
|
|
|
// Helper class to merge and renumber sequence parts in log N instantiations.
|
|
template <typename S1, typename S2>
|
|
struct MergeSequencesAndRenumber;
|
|
|
|
template <std::size_t... I1, std::size_t... I2>
|
|
struct MergeSequencesAndRenumber<IndexSequence<I1...>, IndexSequence<I2...>>
|
|
: IndexSequence<I1..., (sizeof...(I1) + I2)...> {};
|
|
|
|
} // namespace detail
|
|
|
|
// Utility to build an IndexSequence with N indices.
|
|
template <std::size_t N>
|
|
struct MakeIndexSequence : detail::MergeSequencesAndRenumber<
|
|
typename MakeIndexSequence<N / 2>::type,
|
|
typename MakeIndexSequence<N - N / 2>::type> {};
|
|
|
|
// Identity sequences.
|
|
template <>
|
|
struct MakeIndexSequence<0> : IndexSequence<> {};
|
|
template <>
|
|
struct MakeIndexSequence<1> : IndexSequence<0> {};
|
|
|
|
// Utility to build an IndexSequence with indices for each element of a
|
|
// parameter pack.
|
|
template <typename... T>
|
|
using IndexSequenceFor = MakeIndexSequence<sizeof...(T)>;
|
|
|
|
} // namespace rpc
|
|
} // namespace pdx
|
|
} // namespace android
|
|
|
|
#endif // ANDROID_PDX_RPC_SEQUENCE_H_
|