Use dynamic_cast instead of reinterpret_cast in Target.hpp and ParseComponents.hpp, and extend the ParseComponent class virtually in the ParseTree and NamedIdentifier classes
Signed-off-by: Username404 <w.iron.zombie@gmail.com>
This commit is contained in:
parent
68dc7ea1a1
commit
de2d936e19
|
@ -65,10 +65,6 @@ namespace Yerbacon {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
#include <memory>
|
|
||||||
template<typename T, typename U>
|
|
||||||
constexpr T& pointerAs(const std::unique_ptr<U>& ptr) { return reinterpret_cast<T&>(*ptr); }
|
|
||||||
|
|
||||||
#undef YBCON_VERSION
|
#undef YBCON_VERSION
|
||||||
#undef YBCON_FLAGS
|
#undef YBCON_FLAGS
|
||||||
#undef YBCON_COMPILER
|
#undef YBCON_COMPILER
|
||||||
|
|
|
@ -20,7 +20,7 @@ struct ParseComponent {
|
||||||
virtual ~ParseComponent() = default;
|
virtual ~ParseComponent() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NamedIdentifier: ParseComponent {
|
struct NamedIdentifier: virtual ParseComponent {
|
||||||
const string name;
|
const string name;
|
||||||
explicit NamedIdentifier(string_view nameText): name(nameText) {}
|
explicit NamedIdentifier(string_view nameText): name(nameText) {}
|
||||||
};
|
};
|
||||||
|
@ -28,7 +28,7 @@ struct NamedIdentifier: ParseComponent {
|
||||||
typedef unique_ptr<ParseComponent> component_ptr;
|
typedef unique_ptr<ParseComponent> component_ptr;
|
||||||
|
|
||||||
#define IS_PARSECOMPONENT IS(ParseComponent)
|
#define IS_PARSECOMPONENT IS(ParseComponent)
|
||||||
class ParseTree: public ParseComponent {
|
class ParseTree: public virtual ParseComponent {
|
||||||
mutable vector<component_ptr> subComponents;
|
mutable vector<component_ptr> subComponents;
|
||||||
using array_type = decltype(subComponents);
|
using array_type = decltype(subComponents);
|
||||||
using iterator = array_type::iterator;
|
using iterator = array_type::iterator;
|
||||||
|
@ -61,7 +61,7 @@ public:
|
||||||
vector<T*> filteredComponents;
|
vector<T*> filteredComponents;
|
||||||
for_each(cbegin(), cend(), [&filteredComponents](const component_ptr& it) {
|
for_each(cbegin(), cend(), [&filteredComponents](const component_ptr& it) {
|
||||||
if (it->getId() == typeid(T)) {
|
if (it->getId() == typeid(T)) {
|
||||||
filteredComponents.push_back(reinterpret_cast<T*>(it.get()));
|
filteredComponents.push_back(dynamic_cast<T*>(it.get()));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return filteredComponents;
|
return filteredComponents;
|
||||||
|
|
|
@ -66,7 +66,7 @@ protected:
|
||||||
}
|
}
|
||||||
typedef function<void (const ParseTree& parsedTree, unsigned int& index)> task;
|
typedef function<void (const ParseTree& parsedTree, unsigned int& index)> task;
|
||||||
#define make_task_base(start, type, captures, function_body) make_pair(type_index(typeid(type)), [captures](const ParseTree& parsedTree, unsigned int& index) { start; function_body })
|
#define make_task_base(start, type, captures, function_body) make_pair(type_index(typeid(type)), [captures](const ParseTree& parsedTree, unsigned int& index) { start; function_body })
|
||||||
#define make_task_base_R(T, C, F) make_task_base(const T& parseComponent = pointerAs<T>(parsedTree[index]), T, C, F)
|
#define make_task_base_R(T, C, F) make_task_base(const T& parseComponent = dynamic_cast<T&>(*parsedTree[index]), T, C, F)
|
||||||
#define make_task(T, F) make_task_base_R(T, this, F)
|
#define make_task(T, F) make_task_base_R(T, this, F)
|
||||||
#define make_task_noR(T, F) make_task_base(,T, this, F)
|
#define make_task_noR(T, F) make_task_base(,T, this, F)
|
||||||
#define make_nonlocal_task(T, F) make_task_base_R(T, , F)
|
#define make_nonlocal_task(T, F) make_task_base_R(T, , F)
|
||||||
|
|
Loading…
Reference in New Issue