safe typecasting accessors for Ident

master
Daniel Kolesa 2016-08-17 23:54:57 +01:00
parent 066c6b045f
commit 479c245190
2 changed files with 133 additions and 19 deletions

View File

@ -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<Alias *>(this);
}
Alias const *Ident::get_alias() const {
if (!is_alias()) {
return nullptr;
}
return static_cast<Alias const *>(this);
}
bool Ident::is_command() const {
return get_type() == IdentType::command;
}
Command *Ident::get_command() {
if (!is_command()) {
return nullptr;
}
return static_cast<Command *>(this);
}
Command const *Ident::get_command() const {
if (!is_command()) {
return nullptr;
}
return static_cast<Command const *>(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<Var *>(this);
}
Var const *Ident::get_var() const {
if (!is_var()) {
return nullptr;
}
return static_cast<Var const *>(this);
}
bool Ident::is_ivar() const {
return get_type() == IdentType::ivar;
}
Ivar *Ident::get_ivar() {
if (!is_ivar()) {
return nullptr;
}
return static_cast<Ivar *>(this);
}
Ivar const *Ident::get_ivar() const {
if (!is_ivar()) {
return nullptr;
}
return static_cast<Ivar const *>(this);
}
bool Ident::is_fvar() const {
return get_type() == IdentType::fvar;
}
Fvar *Ident::get_fvar() {
if (!is_fvar()) {
return nullptr;
}
return static_cast<Fvar *>(this);
}
Fvar const *Ident::get_fvar() const {
if (!is_fvar()) {
return nullptr;
}
return static_cast<Fvar const *>(this);
}
bool Ident::is_svar() const {
return get_type() == IdentType::svar;
}
Svar *Ident::get_svar() {
if (!is_svar()) {
return nullptr;
}
return static_cast<Svar *>(this);
}
Svar const *Ident::get_svar() const {
if (!is_svar()) {
return nullptr;
}
return static_cast<Svar const *>(this);
}
void cs_init_lib_base(CsState &cs);
CsState::CsState() {

View File

@ -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();