#ifndef RFL_PARSING_PARSER_STRING_VIEW_HPP_ #define RFL_PARSING_PARSER_STRING_VIEW_HPP_ #include #include #include #include #include "../Result.hpp" #include "../always_false.hpp" #include "Parser_base.hpp" #include "schema/Type.hpp" namespace rfl { namespace parsing { template requires AreReaderAndWriter struct Parser { using InputVarType = typename R::InputVarType; static Result read(const R& _r, const InputVarType& _var) noexcept { if constexpr (!ProcessorsType::allow_raw_ptrs_) { static_assert( always_false_v, "Reading into std::string_view is dangerous and " "therefore unsupported. " "Please consider using std::string instead or wrapping " "std::string in rfl::Box or rfl::Ref." "If you absolutely must use std::string_view, " "you can pass the rfl::AllowRawPtrs processor. " "Please note that it is then YOUR responsibility " "to delete the allocated memory. Please also refer " "to the related documentation (in the section on processors)."); return error("Unsupported."); } else { return Parser::read(_r, _var) .transform([](std::string&& str) { char* data = new char[str.size() + 1]; // +1 for the null terminator std::memcpy(data, str.data(), str.size() + 1); return std::string_view(data, str.size()); }); } } template static void write(const W& _w, const std::string_view& _str, const P& _p) { Parser::write(_w, std::string(_str), _p); } static schema::Type to_schema( std::map* _definitions) { return Parser::to_schema(_definitions); } }; } // namespace parsing } // namespace rfl #endif