#pragma once namespace BAN { template struct remove_refenrece { using type = T; }; template struct remove_refenrece { using type = T; }; template struct remove_refenrece { using type = T; }; template using remove_reference_t = typename remove_refenrece::type; template struct remove_const { using type = T; }; template struct remove_const { using type = T; }; template using remove_const_t = typename remove_const::type; template struct remove_volatile { using type = T; }; template struct remove_volatile { using type = T; }; template using remove_volatile_t = typename remove_volatile::type; template struct remove_cv { using type = remove_volatile_t>; }; template using remove_cv_t = typename remove_cv::type; template struct remove_const_and_reference { using type = remove_const_t>; }; template using remove_const_and_reference_t = typename remove_const_and_reference::type; template struct enable_if {}; template struct enable_if { using type = T; }; template using enable_if_t = typename enable_if::type; template struct maybe_const { using type = T; }; template struct maybe_const { using type = const T; }; template using maybe_const_t = typename maybe_const::type; struct true_type { static constexpr bool value = true; }; struct false_type { static constexpr bool value = false; }; template struct is_same : false_type {}; template struct is_same : true_type {}; template inline constexpr bool is_same_v = is_same::value; template struct is_lvalue_reference : false_type {}; template struct is_lvalue_reference : true_type {}; template inline constexpr bool is_lvalue_reference_v = is_lvalue_reference::value; template concept lvalue_reference = is_lvalue_reference_v; template struct is_integral { static constexpr bool value = requires (T t, T* p, void (*f)(T)) { reinterpret_cast(t); f(0); p + t; }; }; template inline constexpr bool is_integral_v = is_integral::value; template concept integral = is_integral_v; template struct is_floating_point : false_type {}; template<> struct is_floating_point : true_type {}; template<> struct is_floating_point : true_type {}; template<> struct is_floating_point : true_type {}; template inline constexpr bool is_floating_point_v = is_floating_point::value; template concept floating_point = is_floating_point_v; template struct is_pointer : false_type {}; template struct is_pointer : true_type {}; template struct is_pointer : true_type {}; template struct is_pointer : true_type {}; template struct is_pointer : true_type {}; template inline constexpr bool is_pointer_v = is_pointer::value; template concept pointer = is_pointer_v; template struct is_const : false_type {}; template struct is_const : true_type {}; template inline constexpr bool is_const_v = is_const::value; template struct is_arithmetic { static constexpr bool value = is_integral_v || is_floating_point_v; }; template inline constexpr bool is_arithmetic_v = is_arithmetic::value; namespace detail { template> struct is_signed { static constexpr bool value = T(-1) < T(0); }; template struct is_signed : false_type {}; } template struct is_signed : detail::is_signed {}; template inline constexpr bool is_signed_v = is_signed::value; template struct less { constexpr bool operator()(const T& lhs, const T& rhs) const { return lhs < rhs; } }; template struct equal { constexpr bool operator()(const T& lhs, const T& rhs) const { return lhs == rhs; } }; template struct greater { constexpr bool operator()(const T& lhs, const T& rhs) const { return lhs > rhs; } }; }