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