#pragma once // Standard C++ #include #include #include #include class XML { public: XML() = default; virtual ~XML() = default; XML(const XML&) = default; XML(XML&&) = default; XML& operator=(const XML&) = default; XML& operator=(XML&&) = default; void parse(std::istream& ins); protected: virtual void handle_start(std::string_view name, const std::vector>& attr) = 0; virtual void handle_end(std::string_view name) = 0; virtual void handle_cdata_start() {} virtual void handle_cdata_end() {} virtual void handle_character_data(std::span /* data */) {} private: static void tag_start(void* self, const char* name, const char** attr); static void tag_end(void* self, const char* name); static void cdata_start(void* self); static void cdata_end(void* self); static void data(void* self, const char* dat, int len); };