action,system数据结构

Parser

class Parser {                                                                     
  public:                                                                          
    //  LineCallback is the type for callbacks that can parse a line starting with a given prefix.
    //                                                                             
    //  They take the form of bool Callback(std::vector<std::string>&& args, std::string* err)
    //                                                                             
    //  Similar to ParseSection() and ParseLineSection(), this function returns bool with false
    //  indicating a failure and has an std::string* err parameter into which an error string can
    //  be written.                                                                
    using LineCallback = std::function<Result<Success>(std::vector<std::string>&&)>;
                                                                                   
    Parser();                                                                      
                                                                                   
    bool ParseConfig(const std::string& path);                                     
    bool ParseConfig(const std::string& path, size_t* parse_errors);               
    void AddSectionParser(const std::string& name, std::unique_ptr<SectionParser> parser);
    void AddSingleLineParser(const std::string& prefix, LineCallback callback); 
                                                                                   
  private:                                                                         
    void ParseData(const std::string& filename, const std::string& data, size_t* parse_errors);
    bool ParseConfigFile(const std::string& path, size_t* parse_errors);           
    bool ParseConfigDir(const std::string& path, size_t* parse_errors);            
                                                                                   
    std::map<std::string, std::unique_ptr<SectionParser>> section_parsers_;        
    std::vector<std::pair<std::string, LineCallback>> line_callbacks_;             
};                                                                                                                                                                                                     

Parser中包括SectionParser类型的容器section_parsers_。

SectionParser

class SectionParser {                                                           
  public:                                                                       
    virtual ~SectionParser() {}                                                 
    virtual Result<Success> ParseSection(std::vector<std::string>&& args,       
                                         const std::string& filename, int line) = 0;
    virtual Result<Success> ParseLineSection(std::vector<std::string>&&, int) { return Success(); };
    virtual Result<Success> EndSection() { return Success(); };                 
    virtual void EndFile(){};                                                   
};                                                                              
   

SectionParser是一个抽象类。

ActionParser

class ActionParser : public SectionParser {                                        
  public:                                                                          
    ActionParser(ActionManager* action_manager, std::vector<Subcontext>* subcontexts)
        : action_manager_(action_manager), subcontexts_(subcontexts), action_(nullptr) {}
    Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename,
                                 int line) override;                               
    Result<Success> ParseLineSection(std::vector<std::string>&& args, int line) override;
    Result<Success> EndSection() override;                                         
                                                                                   
  private:                                                                         
    ActionManager* action_manager_;                                                
    std::vector<Subcontext>* subcontexts_;                                         
    std::unique_ptr<Action> action_;                                               
}; 

ImportParser

class ImportParser : public SectionParser {                                                                                                                                                                 
  public:                                                                          
    ImportParser(Parser* parser) : parser_(parser) {}                           
    Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename,
                                 int line) override;                            
    void EndFile() override;                                                       
                                                                                
  private:                                                                         
    Parser* parser_;                                                               
    // Store filename for later error reporting.                                   
    std::string filename_;                                                         
    // Vector of imports and their line numbers for later error reporting.      
    std::vector<std::pair<std::string, int>> imports_;                          
}; 

ServiceParser

class ServiceParser : public SectionParser {                                       
  public:                                                                          
    ServiceParser(ServiceList* service_list, std::vector<Subcontext>* subcontexts)
        : service_list_(service_list), subcontexts_(subcontexts), service_(nullptr) {}
    Result<Success> ParseSection(std::vector<std::string>&& args, const std::string& filename,
                                 int line) override;                            
    Result<Success> ParseLineSection(std::vector<std::string>&& args, int line) override;
    Result<Success> EndSection() override;                                      
                                                                                
  private:                                                                      
    bool IsValidName(const std::string& name) const;                            
                                                                                
    ServiceList* service_list_;                                                 
    std::vector<Subcontext>* subcontexts_;                                      
    std::unique_ptr<Service> service_;                                          
}; 
发布了120 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/chengbeng1745/article/details/104109473
今日推荐