#ifndef RFL_PARSING_PARSER_PTR_HPP_ #define RFL_PARSING_PARSER_PTR_HPP_ #include #include #include "../Ref.hpp" #include "../Result.hpp" #include "../always_false.hpp" #include "Parent.hpp" #include "Parser_base.hpp" #include "schema/Type.hpp" namespace rfl { namespace parsing { template requires AreReaderAndWriter struct Parser { using InputVarType = typename R::InputVarType; using ParentType = Parent; /// Expresses the variables as type T. static Result read(const R& _r, const InputVarType& _var) noexcept { if constexpr (!ProcessorsType::allow_raw_ptrs_) { static_assert( always_false_v, "Reading into raw pointers is dangerous and " "therefore unsupported by default. " "Please consider using std::unique_ptr, rfl::Box, " "std::shared_ptr, " "rfl::Ref or std::optional instead. " "If you absolutely must use raw pointers, " "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 { if (_r.is_empty(_var)) { return nullptr; } return Parser::read(_r, _var).transform( [](T&& _t) { return new T(std::move(_t)); }); } } template static void write(const W& _w, const T* _ptr, const P& _parent) { if (!_ptr) { ParentType::add_null(_w, _parent); return; } Parser, ProcessorsType>::write(_w, *_ptr, _parent); } static schema::Type to_schema( std::map* _definitions) { return Parser, ProcessorsType>::to_schema( _definitions); } }; } // namespace parsing } // namespace rfl #endif