| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef SRC_CONNECTIVITY_BLUETOOTH_LIB_CPP_TYPE_TO_STD_ARRAY_H_ |
| #define SRC_CONNECTIVITY_BLUETOOTH_LIB_CPP_TYPE_TO_STD_ARRAY_H_ |
| |
| #include <array> |
| #include <cstddef> |
| #include <type_traits> |
| |
| namespace bt_lib_cpp_type { |
| |
| // For object type T, provide a member |type| = T if T is not an array, otherwise |type| = |
| // std::array of elements of T (recursively if T is a multidimensional array). |
| // cv-qualifiers are retained. |
| template <typename T, typename Enable = void> |
| struct ToStdArray; // undefined base case for references, zero length arrays, etc. |
| |
| template <typename T> |
| struct ToStdArray<T, std::enable_if_t<std::is_object_v<T> && !std::is_array_v<T>>> { |
| using type = T; |
| }; |
| |
| // Note that this specialization doesn't accept zero-length arrays, i.e. T[0]. |
| template <typename T, size_t N> |
| struct ToStdArray<T[N]> { |
| using type = std::array<typename ToStdArray<T>::type, N>; |
| }; |
| |
| // This accepts array function parameters and flexible array struct members, but not pointers. |
| template <typename T> |
| struct ToStdArray<T[]> { |
| using type = std::array<typename ToStdArray<T>::type, 0>; |
| }; |
| |
| template <typename T> |
| using ToStdArrayT = typename ToStdArray<T>::type; |
| |
| } // namespace bt_lib_cpp_type |
| |
| #endif // SRC_CONNECTIVITY_BLUETOOTH_LIB_CPP_TYPE_TO_STD_ARRAY_H_ |