// SPDX-License-Identifier: MIT // Copyright (c) 2018-2023, Advanced Micro Devices, Inc. All rights reserved. #pragma once #include #include #include // ranges implementation are not intented to be used by user // TODO: do we need this? namespace ck_tile { template using iter_value_t = typename std::iterator_traits>::value_type; template using iter_reference_t = decltype(*std::declval()); template using iter_difference_t = typename std::iterator_traits>::difference_type; namespace ranges { template using iterator_t = decltype(std::begin(std::declval())); template using sentinel_t = decltype(std::end(std::declval())); template using range_size_t = decltype(std::size(std::declval())); template using range_difference_t = ck_tile::iter_difference_t>; template using range_value_t = iter_value_t>; template using range_reference_t = iter_reference_t>; template struct is_range : std::false_type { }; template struct is_range< T, std::void_t())), decltype(std::end(std::declval()))>> : std::true_type { }; template inline constexpr bool is_range_v = is_range::value; template struct is_sized_range : std::false_type { }; template struct is_sized_range()))>> : std::bool_constant> { }; } // namespace ranges } // namespace ck_tile