From 479c245190ab69dcc8b90787eae031556e057a0a Mon Sep 17 00:00:00 2001 From: q66 Date: Wed, 17 Aug 2016 23:54:57 +0100 Subject: [PATCH] safe typecasting accessors for Ident --- cubescript.cc | 109 ++++++++++++++++++++++++++++++++++++++++++++++++++ cubescript.hh | 43 +++++++++++--------- 2 files changed, 133 insertions(+), 19 deletions(-) diff --git a/cubescript.cc b/cubescript.cc index 676300a1..4aae9955 100644 --- a/cubescript.cc +++ b/cubescript.cc @@ -124,6 +124,115 @@ Command::Command( name = n; } +bool Ident::is_alias() const { + return get_type() == IdentType::alias; +} + +Alias *Ident::get_alias() { + if (!is_alias()) { + return nullptr; + } + return static_cast(this); +} + +Alias const *Ident::get_alias() const { + if (!is_alias()) { + return nullptr; + } + return static_cast(this); +} + +bool Ident::is_command() const { + return get_type() == IdentType::command; +} + +Command *Ident::get_command() { + if (!is_command()) { + return nullptr; + } + return static_cast(this); +} + +Command const *Ident::get_command() const { + if (!is_command()) { + return nullptr; + } + return static_cast(this); +} + +bool Ident::is_var() const { + IdentType tp = get_type(); + return (tp >= IdentType::ivar) && (tp <= IdentType::svar); +} + +Var *Ident::get_var() { + if (!is_var()) { + return nullptr; + } + return static_cast(this); +} + +Var const *Ident::get_var() const { + if (!is_var()) { + return nullptr; + } + return static_cast(this); +} + +bool Ident::is_ivar() const { + return get_type() == IdentType::ivar; +} + +Ivar *Ident::get_ivar() { + if (!is_ivar()) { + return nullptr; + } + return static_cast(this); +} + +Ivar const *Ident::get_ivar() const { + if (!is_ivar()) { + return nullptr; + } + return static_cast(this); +} + +bool Ident::is_fvar() const { + return get_type() == IdentType::fvar; +} + +Fvar *Ident::get_fvar() { + if (!is_fvar()) { + return nullptr; + } + return static_cast(this); +} + +Fvar const *Ident::get_fvar() const { + if (!is_fvar()) { + return nullptr; + } + return static_cast(this); +} + +bool Ident::is_svar() const { + return get_type() == IdentType::svar; +} + +Svar *Ident::get_svar() { + if (!is_svar()) { + return nullptr; + } + return static_cast(this); +} + +Svar const *Ident::get_svar() const { + if (!is_svar()) { + return nullptr; + } + return static_cast(this); +} + void cs_init_lib_base(CsState &cs); CsState::CsState() { diff --git a/cubescript.hh b/cubescript.hh index 5421bc58..de000d69 100644 --- a/cubescript.hh +++ b/cubescript.hh @@ -171,6 +171,12 @@ enum class IdentType { ivar, fvar, svar, command, alias }; +struct Command; +struct Var; +struct Ivar; +struct Fvar; +struct Svar; + struct OSTD_EXPORT Ident { ostd::byte type; /* ID_something */ ostd::ushort flags; @@ -179,30 +185,29 @@ struct OSTD_EXPORT Ident { IdentType get_type() const; - bool is_alias() const { - return get_type() == IdentType::alias; - } + bool is_alias() const; + Alias *get_alias(); + Alias const *get_alias() const; - bool is_command() const { - return get_type() == IdentType::command; - } + bool is_command() const; + Command *get_command(); + Command const *get_command() const; - bool is_var() const { - IdentType tp = get_type(); - return (tp >= IdentType::ivar) && (tp <= IdentType::svar); - } + bool is_var() const; + Var *get_var(); + Var const *get_var() const; - bool is_ivar() const { - return get_type() == IdentType::ivar; - } + bool is_ivar() const; + Ivar *get_ivar(); + Ivar const *get_ivar() const; - bool is_fvar() const { - return get_type() == IdentType::fvar; - } + bool is_fvar() const; + Fvar *get_fvar(); + Fvar const *get_fvar() const; - bool is_svar() const { - return get_type() == IdentType::svar; - } + bool is_svar() const; + Svar *get_svar(); + Svar const *get_svar() const; protected: Ident();