#pragma once #include #include #include #include #include #include namespace uf { class UF_API Serializer : public ext::json::Document { protected: uf::stl::string m_filename = ""; public: typedef uf::stl::string output_t; typedef uf::stl::string input_t; Serializer( const uf::stl::string& str = "{}" ); Serializer( const ext::json::base_value& ); Serializer( const ext::json::Value& ); #if UF_USE_LUA Serializer( const sol::table& ); #endif Serializer::output_t serialize( bool pretty = false ) const; Serializer::output_t serialize( const ext::json::EncodingSettings& ) const; void deserialize( const uf::stl::string&, const ext::json::DecodingSettings& = {} ); // serializeable template static bool serializeable() { return std::is_standard_layout::value && std::is_trivial::value; // std::is_pod::value; } template static bool serializeable( const T& input ) { return serializeable(); } // serialize to base64 template static uf::Serializer toBase64( const T& input ) { // ensure this is a safe type to serialize if ( !serializeable(input) ) return uf::stl::string(""); pod::Userdata* userdata = uf::userdata::create(input); uf::Serializer res; res["base64"] = uf::userdata::toBase64( userdata ); uf::userdata::destroy( userdata ); return res; } // convert from base64 to POD template static T fromBase64( const uf::Serializer& input ) { // ensure this is a safe type to serialize if ( !serializeable(input) ) return T(); // ensure it's "proper" if ( !input["base64"].is() ) return T(); pod::Userdata* userdata = uf::userdata::fromBase64(input["base64"].as()); T res = uf::userdata::get( userdata ); uf::userdata::destroy( userdata ); return res; } static uf::stl::string resolveFilename( const uf::stl::string& filename, bool compareTimes = true ); bool readFromFile( const uf::stl::string& from, const uf::stl::string& hash = "" ); bool writeToFile( const uf::stl::string& to, const ext::json::EncodingSettings& = {} ) const; void merge( const uf::Serializer& other, bool priority = true ); void import( const uf::Serializer& other ); ext::json::Value& path( const uf::stl::string& ); operator Serializer::output_t(); operator Serializer::output_t() const; uf::Serializer& operator=( const uf::stl::string& str ); uf::Serializer& operator=( const ext::json::base_value& json ); uf::Serializer& operator=( const ext::json::Value& json ); #if UF_USE_LUA uf::Serializer& operator=( const sol::table& json ); #endif uf::Serializer& operator<<( const uf::stl::string& str ); uf::Serializer& operator>>( uf::stl::string& str ); const uf::Serializer& operator>>( uf::stl::string& str ) const; }; typedef Serializer Metadata; }