#ifndef NALL_TRAITS_HPP #define NALL_TRAITS_HPP #include #include namespace nall { using std::nullptr_t; using std::forward; using std::move; using std::decay; using std::declval; using true_type = std::true_type; using false_type = std::false_type; template using is_same = std::is_same; template using is_base_of = std::is_base_of; template using is_array = std::is_array; template using is_function = std::is_function; template using is_integral = std::is_integral; template using add_const = std::add_const; template using remove_extent = std::remove_extent; template using remove_reference = std::remove_reference; } namespace nall { template struct expression { static constexpr bool value = C; }; } namespace nall { namespace traits { enum class enable_type {}; enum class disable_type {}; template struct enable_if { using type = T; }; template struct enable_if {}; template struct disable_if { using type = T; }; template struct disable_if {}; } template using enable_if = typename traits::enable_if::type; template using disable_if = typename traits::disable_if::type; } namespace nall { namespace traits { template struct type_if { using type = T; }; template struct type_if { using type = F; }; } template using type_if = typename traits::type_if::type; } #endif