// -*- C++ -*-
//===----------------------------------------------------------------------===//
//
// Copyright (C) Intel Corporation
//
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
// This file incorporates work covered by the following copyright and permission
// notice:
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
//
//===----------------------------------------------------------------------===//

#ifndef _ONEDPL_TYPE_TRAITS
#define _ONEDPL_TYPE_TRAITS

#include "oneapi/dpl/internal/common_config.h"
#include <type_traits>

namespace oneapi
{
namespace dpl
{
using ::std::add_const;
using ::std::add_cv;
using ::std::add_lvalue_reference;
using ::std::add_pointer;
using ::std::add_rvalue_reference;
using ::std::add_volatile;
using ::std::aligned_storage;
using ::std::aligned_union;
using ::std::alignment_of;
using ::std::common_type;
using ::std::conditional;
using ::std::decay;
using ::std::enable_if;
using ::std::extent;
using ::std::false_type;
using ::std::has_virtual_destructor;
using ::std::integral_constant;
using ::std::is_abstract;
using ::std::is_arithmetic;
using ::std::is_array;
using ::std::is_assignable;
using ::std::is_base_of;
using ::std::is_class;
using ::std::is_compound;
using ::std::is_const;
using ::std::is_constructible;
using ::std::is_convertible;
using ::std::is_copy_assignable;
using ::std::is_copy_constructible;
using ::std::is_default_constructible;
using ::std::is_destructible;
using ::std::is_empty;
using ::std::is_enum;
using ::std::is_floating_point;
using ::std::is_function;
using ::std::is_fundamental;
using ::std::is_integral;
using ::std::is_lvalue_reference;
using ::std::is_member_function_pointer;
using ::std::is_member_object_pointer;
using ::std::is_member_pointer;
using ::std::is_move_assignable;
using ::std::is_move_constructible;
using ::std::is_nothrow_assignable;
using ::std::is_nothrow_constructible;
using ::std::is_nothrow_copy_assignable;
using ::std::is_nothrow_copy_constructible;
using ::std::is_nothrow_default_constructible;
using ::std::is_nothrow_destructible;
using ::std::is_nothrow_move_assignable;
using ::std::is_nothrow_move_constructible;
using ::std::is_object;
using ::std::is_pod;
using ::std::is_pointer;
using ::std::is_polymorphic;
using ::std::is_reference;
using ::std::is_rvalue_reference;
using ::std::is_same;
using ::std::is_scalar;
using ::std::is_signed;
using ::std::is_standard_layout;
using ::std::is_trivial;
using ::std::is_trivially_assignable;
using ::std::is_trivially_constructible;
using ::std::is_trivially_copy_assignable;
using ::std::is_trivially_copy_constructible;
using ::std::is_trivially_copyable;
using ::std::is_trivially_default_constructible;
using ::std::is_trivially_destructible;
using ::std::is_trivially_move_assignable;
using ::std::is_trivially_move_constructible;
using ::std::is_union;
using ::std::is_unsigned;
using ::std::is_void;
using ::std::is_volatile;
using ::std::make_signed;
using ::std::make_unsigned;
using ::std::rank;
using ::std::remove_all_extents;
using ::std::remove_const;
using ::std::remove_cv;
using ::std::remove_extent;
using ::std::remove_pointer;
using ::std::remove_reference;
using ::std::remove_volatile;
using ::std::true_type;
using ::std::underlying_type;

using ::std::add_const_t;
using ::std::add_cv_t;
using ::std::add_lvalue_reference_t;
using ::std::add_pointer_t;
using ::std::add_rvalue_reference_t;
using ::std::add_volatile_t;
using ::std::aligned_storage_t;
using ::std::aligned_union_t;
using ::std::common_type_t;
using ::std::conditional_t;
using ::std::decay_t;
using ::std::enable_if_t;
using ::std::make_signed_t;
using ::std::make_unsigned_t;
using ::std::remove_all_extents_t;
using ::std::remove_const_t;
using ::std::remove_cv_t;
using ::std::remove_extent_t;
using ::std::remove_pointer_t;
using ::std::remove_reference_t;
using ::std::remove_volatile_t;
using ::std::underlying_type_t;

using ::std::alignment_of_v;
using ::std::conjunction;
using ::std::conjunction_v;
using ::std::disjunction;
using ::std::disjunction_v;
using ::std::extent_v;
using ::std::has_virtual_destructor_v;
using ::std::invoke_result;
using ::std::invoke_result_t;
using ::std::is_abstract_v;
using ::std::is_arithmetic_v;
using ::std::is_array_v;
using ::std::is_assignable_v;
using ::std::is_base_of_v;
using ::std::is_class_v;
using ::std::is_compound_v;
using ::std::is_const_v;
using ::std::is_constructible_v;
using ::std::is_convertible_v;
using ::std::is_copy_assignable_v;
using ::std::is_copy_constructible_v;
using ::std::is_default_constructible_v;
using ::std::is_destructible_v;
using ::std::is_empty_v;
using ::std::is_enum_v;
using ::std::is_floating_point_v;
using ::std::is_function_v;
using ::std::is_fundamental_v;
using ::std::is_integral_v;
using ::std::is_invocable;
using ::std::is_invocable_r;
using ::std::is_lvalue_reference_v;
using ::std::is_member_function_pointer_v;
using ::std::is_member_object_pointer_v;
using ::std::is_member_pointer_v;
using ::std::is_move_assignable_v;
using ::std::is_move_constructible_v;
using ::std::is_nothrow_assignable_v;
using ::std::is_nothrow_constructible_v;
using ::std::is_nothrow_copy_assignable_v;
using ::std::is_nothrow_copy_constructible_v;
using ::std::is_nothrow_default_constructible_v;
using ::std::is_nothrow_destructible_v;
using ::std::is_nothrow_invocable;
using ::std::is_nothrow_invocable_r;
using ::std::is_nothrow_move_assignable_v;
using ::std::is_nothrow_move_constructible_v;
using ::std::is_object_v;
using ::std::is_pod_v;
using ::std::is_pointer_v;
using ::std::is_polymorphic_v;
using ::std::is_reference_v;
using ::std::is_rvalue_reference_v;
using ::std::is_same_v;
using ::std::is_scalar_v;
using ::std::is_signed_v;
using ::std::is_standard_layout_v;
using ::std::is_trivial_v;
using ::std::is_trivially_assignable_v;
using ::std::is_trivially_constructible_v;
using ::std::is_trivially_copy_assignable_v;
using ::std::is_trivially_copy_constructible_v;
using ::std::is_trivially_copyable_v;
using ::std::is_trivially_default_constructible_v;
using ::std::is_trivially_destructible_v;
using ::std::is_trivially_move_assignable_v;
using ::std::is_trivially_move_constructible_v;
using ::std::is_union_v;
using ::std::is_unsigned_v;
using ::std::is_void_v;
using ::std::is_volatile_v;
using ::std::negation;
using ::std::rank_v;
using ::std::void_t;

#if _ONEDPL___cplusplus < 202002L
using ::std::is_literal_type;   // Deprecated in C++17, removed in C++20
using ::std::is_literal_type_v; // Deprecated in C++17, removed in C++20
using ::std::result_of;         // Deprecated in C++17, removed in C++20
using ::std::result_of_t;       // Deprecated in C++17, removed in C++20
#endif                          // _ONEDPL___cplusplus < 202002L
} // namespace dpl
} // namespace oneapi

namespace dpl = oneapi::dpl;

#endif // _ONEDPL_TYPE_TRAITS
