blob: 5fd898a846594c40a733e33f933998f0bb1b6666 [file] [log] [blame]
#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_