StringViewLike.h#

Fully qualified name: carb/cpp/StringViewLike.h

File members: carb/cpp/StringViewLike.h

// SPDX-FileCopyrightText: Copyright (c) 2020-2025 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
// SPDX-License-Identifier: LicenseRef-NvidiaProprietary
//
// NVIDIA CORPORATION, its affiliates and licensors retain all intellectual
// property and proprietary rights in and to this material, related
// documentation and any modifications thereto. Any use, reproduction,
// disclosure or distribution of this material and related documentation
// without an express license agreement from NVIDIA CORPORATION or
// its affiliates is strictly prohibited.

#pragma once

#include "StringView.h"

#include <string_view>
#include <type_traits>

namespace carb::cpp
{

template <typename T, typename L>
struct is_explicitly_convertible : std::bool_constant<std::is_constructible_v<T, L> && !std::is_convertible_v<T, L>>
{
};

template <typename T, typename L>
constexpr bool is_explicitly_convertible_v = is_explicitly_convertible<T, L>::value;

template <typename T, typename L>
struct is_implicitly_convertible : std::bool_constant<std::is_convertible_v<T, L> && !is_explicitly_convertible_v<T, L>>
{
};

template <typename T, typename L>
constexpr bool is_implicitly_convertible_v = is_implicitly_convertible<T, L>::value;

template <typename T, typename CharT, typename Traits>
struct is_carb_basic_string_view_like : is_implicitly_convertible<T, carb::cpp::basic_string_view<CharT, Traits>>
{
};

template <typename T, typename CharT, typename Traits>
constexpr bool is_carb_basic_string_view_like_v = is_carb_basic_string_view_like<T, CharT, Traits>::value;

template <typename T>
struct is_carb_string_view_like : is_carb_basic_string_view_like<T, char, std::char_traits<char>>
{
};

template <typename T>
constexpr bool is_carb_string_view_like_v = is_carb_string_view_like<T>::value;

template <typename T>
struct is_carb_wstring_view_like : is_carb_basic_string_view_like<T, wchar_t, std::char_traits<wchar_t>>
{
};

template <typename T>
constexpr bool is_carb_wstring_view_like_v = is_carb_wstring_view_like<T>::value;

template <typename T, typename CharT, typename Traits>
struct is_std_basic_string_view_like : is_implicitly_convertible<T, std::basic_string_view<CharT, Traits>>
{
};

template <typename T, typename CharT, typename Traits>
constexpr bool is_std_basic_string_view_like_v = is_std_basic_string_view_like<T, CharT, Traits>::value;

template <typename T>
struct is_std_string_view_like : is_std_basic_string_view_like<T, char, std::char_traits<char>>
{
};

template <typename T>
constexpr bool is_std_string_view_like_v = is_std_string_view_like<T>::value;

template <typename T>
struct is_std_wstring_view_like : is_std_basic_string_view_like<T, wchar_t, std::char_traits<wchar_t>>
{
};

template <typename T>
constexpr bool is_std_wstring_view_like_v = is_std_wstring_view_like<T>::value;

} // namespace carb::cpp