Trait增强
This commit is contained in:
@@ -255,7 +255,8 @@ namespace Internal
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> struct TraitTool
|
template <typename T, bool IsIntegral> struct TraitTool;
|
||||||
|
template <typename T> struct TraitTool<T,false>
|
||||||
{
|
{
|
||||||
template<typename P, bool Derived = true> static constexpr bool Is() { return (TAreSame<T, P> || (Derived && TIsBaseOf<T, P>)); }
|
template<typename P, bool Derived = true> static constexpr bool Is() { return (TAreSame<T, P> || (Derived && TIsBaseOf<T, P>)); }
|
||||||
template<typename P, bool Derived = true> static constexpr bool Is(P) { return (TAreSame<T, P> || (Derived && TIsBaseOf<T, P>)); }
|
template<typename P, bool Derived = true> static constexpr bool Is(P) { return (TAreSame<T, P> || (Derived && TIsBaseOf<T, P>)); }
|
||||||
@@ -440,11 +441,6 @@ namespace Internal
|
|||||||
{
|
{
|
||||||
return SymbolNameTool<T>();
|
return SymbolNameTool<T>();
|
||||||
}
|
}
|
||||||
template<T Value>
|
|
||||||
constexpr static std::string_view ValueName()
|
|
||||||
{
|
|
||||||
return ValueNameTool<T, Value>();
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint32_t Hash(const T& v)
|
static uint32_t Hash(const T& v)
|
||||||
{
|
{
|
||||||
@@ -462,27 +458,74 @@ namespace Internal
|
|||||||
public:
|
public:
|
||||||
constexpr static int TypeHash = InjectTypeHash();
|
constexpr static int TypeHash = InjectTypeHash();
|
||||||
};
|
};
|
||||||
template <typename T> struct TraitTool<const T> : public TraitTool<T> {};
|
template <typename T> struct TraitTool<T, true> : public TraitTool<T, false>
|
||||||
template <typename T> struct TraitTool< volatile T> : public TraitTool<T> {};
|
{
|
||||||
template <typename T> struct TraitTool<const volatile T> : public TraitTool<T> {};
|
template<T Value>
|
||||||
|
constexpr static std::string_view ValueName()
|
||||||
|
{
|
||||||
|
return ValueNameTool<T, Value>();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
template <typename T, bool IsIntegral> struct TraitTool<const T, IsIntegral> : public TraitTool<T,IsIntegral> {};
|
||||||
|
template <typename T, bool IsIntegral> struct TraitTool< volatile T, IsIntegral> : public TraitTool<T,IsIntegral> {};
|
||||||
|
template <typename T, bool IsIntegral> struct TraitTool<const volatile T, IsIntegral> : public TraitTool<T,IsIntegral> {};
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename T> using TTrait = Internal::TraitTool<T>;
|
template <typename T> using TTrait = Internal::TraitTool<T, std::is_integral_v<T>>;
|
||||||
using Bool = Internal::TraitTool<bool>;
|
|
||||||
using Int = Internal::TraitTool<int>;
|
namespace Internal
|
||||||
using Float = Internal::TraitTool<float>;
|
{
|
||||||
using Double = Internal::TraitTool<double>;
|
template<typename T> class ValueClass : public TTrait<T>
|
||||||
using Long = Internal::TraitTool<long>;
|
{
|
||||||
using UInt = Internal::TraitTool<unsigned int>;
|
private:
|
||||||
using Int8 = Internal::TraitTool<int8_t>;
|
T value;
|
||||||
using Int16 = Internal::TraitTool<int16_t>;
|
using _Mybase = TTrait<T>;
|
||||||
using Int32 = Internal::TraitTool<int32_t>;
|
public:
|
||||||
using Int64 = Internal::TraitTool<int64_t>;
|
ValueClass(const T& value) : value(value) {}
|
||||||
using UInt8 = Internal::TraitTool<uint8_t>;
|
ValueClass(T& value) : value(value) {}
|
||||||
using UInt16 = Internal::TraitTool<uint16_t>;
|
ValueClass(T&& value) : value(std::move(value)) {}
|
||||||
using UInt32 = Internal::TraitTool<uint32_t>;
|
ValueClass<T>& operator=(const T& value) noexcept
|
||||||
using UInt64 = Internal::TraitTool<uint64_t>;
|
{
|
||||||
using LongDouble = Internal::TraitTool<long double>;
|
this->value = value;
|
||||||
|
}
|
||||||
|
ValueClass<T>& operator=(T& value) noexcept
|
||||||
|
{
|
||||||
|
this->value = value;
|
||||||
|
}
|
||||||
|
ValueClass<T>& operator=(T&& value) noexcept
|
||||||
|
{
|
||||||
|
this->value = std::move(value);
|
||||||
|
}
|
||||||
|
constexpr operator T& ()
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
constexpr operator const T& () const
|
||||||
|
{
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
uint32_t Hash()
|
||||||
|
{
|
||||||
|
return _Mybase::Hash(value);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
using Bool = Internal::ValueClass<bool>;
|
||||||
|
using Int = Internal::ValueClass<int>;
|
||||||
|
using Float = Internal::ValueClass<float>;
|
||||||
|
using Double = Internal::ValueClass<double>;
|
||||||
|
using Long = Internal::ValueClass<long>;
|
||||||
|
using UInt = Internal::ValueClass<unsigned int>;
|
||||||
|
using Int8 = Internal::ValueClass<int8_t>;
|
||||||
|
using Int16 = Internal::ValueClass<int16_t>;
|
||||||
|
using Int32 = Internal::ValueClass<int32_t>;
|
||||||
|
using Int64 = Internal::ValueClass<int64_t>;
|
||||||
|
using UInt8 = Internal::ValueClass<uint8_t>;
|
||||||
|
using UInt16 = Internal::ValueClass<uint16_t>;
|
||||||
|
using UInt32 = Internal::ValueClass<uint32_t>;
|
||||||
|
using UInt64 = Internal::ValueClass<uint64_t>;
|
||||||
|
using LongDouble = Internal::ValueClass<long double>;
|
||||||
|
|
||||||
#if !defined(nameofT)&&!defined(nameofEnum)
|
#if !defined(nameofT)&&!defined(nameofEnum)
|
||||||
template <typename T> constexpr auto __Inject_nameof()
|
template <typename T> constexpr auto __Inject_nameof()
|
||||||
|
Reference in New Issue
Block a user