Return pointers in PareTree.findById() and return references in ParseTree.findByName().
This commit is contained in:
		
							parent
							
								
									dd223026a0
								
							
						
					
					
						commit
						e8b2f90263
					
				@ -24,7 +24,7 @@ struct ParseComponent {
 | 
				
			|||||||
namespace StandardComponents {
 | 
					namespace StandardComponents {
 | 
				
			||||||
    struct [[deprecated]] Expression: ParseComponent {};
 | 
					    struct [[deprecated]] Expression: ParseComponent {};
 | 
				
			||||||
    struct NamedIdentifier: public ParseComponent {
 | 
					    struct NamedIdentifier: public ParseComponent {
 | 
				
			||||||
        const string name;
 | 
					        string name;
 | 
				
			||||||
        explicit NamedIdentifier(string_view nameText): ParseComponent(), name(nameText) {}
 | 
					        explicit NamedIdentifier(string_view nameText): ParseComponent(), name(nameText) {}
 | 
				
			||||||
    };
 | 
					    };
 | 
				
			||||||
    struct Define: NamedIdentifier {
 | 
					    struct Define: NamedIdentifier {
 | 
				
			||||||
@ -50,37 +50,35 @@ class ParseTree {
 | 
				
			|||||||
protected:
 | 
					protected:
 | 
				
			||||||
    mutable vector<ParseComponent*> subComponents;
 | 
					    mutable vector<ParseComponent*> subComponents;
 | 
				
			||||||
public:
 | 
					public:
 | 
				
			||||||
    IS(StandardComponents::NamedIdentifier)
 | 
					 | 
				
			||||||
    optional<reference_wrapper<T>> findByName(const string& name) {
 | 
					 | 
				
			||||||
        auto identifiers = findById<T>();
 | 
					 | 
				
			||||||
        for (auto&& identifier: identifiers) {
 | 
					 | 
				
			||||||
            if (identifier.getId() == typeid(T) && identifier.name == name) {
 | 
					 | 
				
			||||||
                return make_optional(reference_wrapper<T>(identifier));
 | 
					 | 
				
			||||||
                break;
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return optional<reference_wrapper<T>>();
 | 
					 | 
				
			||||||
    };
 | 
					 | 
				
			||||||
    IS_PARSECOMPONENT
 | 
					    IS_PARSECOMPONENT
 | 
				
			||||||
    auto findById() const {
 | 
					    auto findById() const {
 | 
				
			||||||
        bool typeFoundOnce = false;
 | 
					        bool typeFoundOnce = false;
 | 
				
			||||||
        auto foundPointers = subComponents | views::filter([&typeFoundOnce](const ParseComponent* it) {
 | 
					        return subComponents | views::filter([&typeFoundOnce](const ParseComponent* it) {
 | 
				
			||||||
            const bool typeFound = it->getId() == typeid(T);
 | 
					            const bool typeFound = it->getId() == typeid(T);
 | 
				
			||||||
            if (typeFound) typeFoundOnce = true;
 | 
					            if (typeFound) typeFoundOnce = true;
 | 
				
			||||||
            return typeFound;
 | 
					            return typeFound;
 | 
				
			||||||
        }) | views::transform([](ParseComponent* it) {
 | 
					        }) | views::transform([](ParseComponent* it) {
 | 
				
			||||||
            return reinterpret_cast<T&>(*it);
 | 
					            return reinterpret_cast<T*>(it);
 | 
				
			||||||
        });
 | 
					        });
 | 
				
			||||||
        return foundPointers;
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					    IS(StandardComponents::NamedIdentifier)
 | 
				
			||||||
 | 
					    optional<reference_wrapper<T>> findByName(const string& name) const {
 | 
				
			||||||
 | 
					        auto identifiers = findById<T>();
 | 
				
			||||||
 | 
					        for (T* identifier: identifiers) {
 | 
				
			||||||
 | 
					            if (identifier->getId() == typeid(T) && identifier->name == name) {
 | 
				
			||||||
 | 
					                return make_optional(ref(*identifier));
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return optional<reference_wrapper<T>>();
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
    inline size_t getCompCount() const { return subComponents.size(); }
 | 
					    inline size_t getCompCount() const { return subComponents.size(); }
 | 
				
			||||||
    auto& getComponents() { return subComponents; }
 | 
					    auto& getComponents() { return subComponents; }
 | 
				
			||||||
    auto getComponents() const { return subComponents; }
 | 
					    auto getComponents() const { return subComponents; }
 | 
				
			||||||
    IS_PARSECOMPONENT
 | 
					    IS_PARSECOMPONENT
 | 
				
			||||||
    void add(const T& component) const {
 | 
					    void add(const T& component) const {
 | 
				
			||||||
        subComponents.push_back(new T(component));
 | 
					        subComponents.push_back(new T(component));
 | 
				
			||||||
    }; void addAll(const vector<ParseComponent>& components) const {
 | 
					    }; IS_PARSECOMPONENT void addAll(const initializer_list<T>& components) const {
 | 
				
			||||||
        for (const auto& comp: components) add(comp);
 | 
					        for (const auto& comp: components) add<T>(comp);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    IS_PARSECOMPONENT
 | 
					    IS_PARSECOMPONENT
 | 
				
			||||||
    const ParseTree& operator<<(const T& component) const { add(component); return *this; }
 | 
					    const ParseTree& operator<<(const T& component) const { add(component); return *this; }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user