Simplify type_info comparisons

This commit is contained in:
Jason Turner 2016-03-12 08:36:53 -07:00
parent afa3f2249c
commit 16ffbca6d6

View File

@ -50,24 +50,23 @@ namespace chaiscript
constexpr bool operator==(const Type_Info &ti) const noexcept constexpr bool operator==(const Type_Info &ti) const noexcept
{ {
return ti.m_type_info == m_type_info return ti.m_type_info == m_type_info
|| (ti.m_type_info && m_type_info && *ti.m_type_info == *m_type_info); || *ti.m_type_info == *m_type_info;
} }
constexpr bool operator==(const std::type_info &ti) const noexcept constexpr bool operator==(const std::type_info &ti) const noexcept
{ {
return m_type_info != nullptr && (*m_type_info) == ti; return !is_undef() && (*m_type_info) == ti;
} }
constexpr bool bare_equal(const Type_Info &ti) const noexcept constexpr bool bare_equal(const Type_Info &ti) const noexcept
{ {
return ti.m_bare_type_info == m_bare_type_info return ti.m_bare_type_info == m_bare_type_info
|| (ti.m_bare_type_info && m_bare_type_info && *ti.m_bare_type_info == *m_bare_type_info); || *ti.m_bare_type_info == *m_bare_type_info;
} }
constexpr bool bare_equal_type_info(const std::type_info &ti) const noexcept constexpr bool bare_equal_type_info(const std::type_info &ti) const noexcept
{ {
return m_bare_type_info != nullptr return !is_undef() && (*m_bare_type_info) == ti;
&& (*m_bare_type_info) == ti;
} }
constexpr bool is_const() const noexcept { return (m_flags & (1 << is_const_flag)) != 0; } constexpr bool is_const() const noexcept { return (m_flags & (1 << is_const_flag)) != 0; }
@ -79,7 +78,7 @@ namespace chaiscript
std::string name() const std::string name() const
{ {
if (m_type_info) if (!is_undef())
{ {
return m_type_info->name(); return m_type_info->name();
} else { } else {
@ -89,7 +88,7 @@ namespace chaiscript
std::string bare_name() const std::string bare_name() const
{ {
if (m_bare_type_info) if (!is_undef())
{ {
return m_bare_type_info->name(); return m_bare_type_info->name();
} else { } else {
@ -103,8 +102,10 @@ namespace chaiscript
} }
private: private:
const std::type_info *m_type_info = nullptr; struct Unknown_Type {};
const std::type_info *m_bare_type_info = nullptr;
const std::type_info *m_type_info = &typeid(Unknown_Type);
const std::type_info *m_bare_type_info = &typeid(Unknown_Type);
static const int is_const_flag = 0; static const int is_const_flag = 0;
static const int is_reference_flag = 1; static const int is_reference_flag = 1;
static const int is_pointer_flag = 2; static const int is_pointer_flag = 2;