1e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#ifndef ANDROID_PDX_RPC_SEQUENCE_H_
2e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#define ANDROID_PDX_RPC_SEQUENCE_H_
3e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
4e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#include <cstdint>
5e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
6e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace android {
7e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace pdx {
8e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace rpc {
9e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
10e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Provides a C++11 implementation of C++14 index_sequence and
11e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// make_index_sequence for compatibility with common compilers. This
12e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// implementation may be conditionally replaced with compiler-provided versions
13e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// when C++14 support is available.
14e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
15e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Utility to capture a sequence of unsigned indices.
16e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <std::size_t... I>
17e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct IndexSequence {
18e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  using type = IndexSequence;
19e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  using value_type = std::size_t;
20e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko  static constexpr std::size_t size() { return sizeof...(I); }
21e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko};
22e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
23e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkonamespace detail {
24e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
25e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Helper class to merge and renumber sequence parts in log N instantiations.
26e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename S1, typename S2>
27e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct MergeSequencesAndRenumber;
28e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
29e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <std::size_t... I1, std::size_t... I2>
30e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct MergeSequencesAndRenumber<IndexSequence<I1...>, IndexSequence<I2...>>
31e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko    : IndexSequence<I1..., (sizeof...(I1) + I2)...> {};
32e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
33e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace detail
34e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
35e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Utility to build an IndexSequence with N indices.
36e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <std::size_t N>
37e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct MakeIndexSequence : detail::MergeSequencesAndRenumber<
38e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                               typename MakeIndexSequence<N / 2>::type,
39e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko                               typename MakeIndexSequence<N - N / 2>::type> {};
40e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
41e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Identity sequences.
42e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <>
43e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct MakeIndexSequence<0> : IndexSequence<> {};
44e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <>
45e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkostruct MakeIndexSequence<1> : IndexSequence<0> {};
46e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
47e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// Utility to build an IndexSequence with indices for each element of a
48e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko// parameter pack.
49e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkotemplate <typename... T>
50e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenkousing IndexSequenceFor = MakeIndexSequence<sizeof...(T)>;
51e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
52e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace rpc
53e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace pdx
54e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko}  // namespace android
55e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko
56e4eec20f6263f4a42ae462456f60ea6c4518bb0aAlex Vakulenko#endif  // ANDROID_PDX_RPC_SEQUENCE_H_
57