| #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_ |