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_FLAGS
 | 
			
		||||
#undef YBCON_COMPILER
 | 
			
		||||
 | 
			
		||||
@ -20,7 +20,7 @@ struct ParseComponent {
 | 
			
		||||
    virtual ~ParseComponent() = default;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct NamedIdentifier: ParseComponent {
 | 
			
		||||
struct NamedIdentifier: virtual ParseComponent {
 | 
			
		||||
    const string name;
 | 
			
		||||
    explicit NamedIdentifier(string_view nameText): name(nameText) {}
 | 
			
		||||
};
 | 
			
		||||
@ -28,7 +28,7 @@ struct NamedIdentifier: ParseComponent {
 | 
			
		||||
typedef unique_ptr<ParseComponent> component_ptr;
 | 
			
		||||
 | 
			
		||||
#define IS_PARSECOMPONENT IS(ParseComponent)
 | 
			
		||||
class ParseTree: public ParseComponent {
 | 
			
		||||
class ParseTree: public virtual ParseComponent {
 | 
			
		||||
    mutable vector<component_ptr> subComponents;
 | 
			
		||||
    using array_type = decltype(subComponents);
 | 
			
		||||
    using iterator = array_type::iterator;
 | 
			
		||||
@ -61,7 +61,7 @@ public:
 | 
			
		||||
        vector<T*> filteredComponents;
 | 
			
		||||
        for_each(cbegin(), cend(), [&filteredComponents](const component_ptr& it) {
 | 
			
		||||
            if (it->getId() == typeid(T)) {
 | 
			
		||||
                filteredComponents.push_back(reinterpret_cast<T*>(it.get()));
 | 
			
		||||
                filteredComponents.push_back(dynamic_cast<T*>(it.get()));
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        return filteredComponents;
 | 
			
		||||
 | 
			
		||||
@ -66,7 +66,7 @@ protected:
 | 
			
		||||
    }
 | 
			
		||||
    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_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_noR(T, F) make_task_base(,T, this, F)
 | 
			
		||||
    #define make_nonlocal_task(T, F) make_task_base_R(T, , F)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user