mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	APT service serialization
This commit is contained in:
		
							parent
							
								
									3e752002c4
								
							
						
					
					
						commit
						5265c79056
					
				
					 25 changed files with 247 additions and 17 deletions
				
			
		
							
								
								
									
										91
									
								
								src/common/serialization/optional.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								src/common/serialization/optional.h
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,91 @@ | |||
| #pragma once | ||||
| 
 | ||||
| #include <boost/config.hpp> | ||||
| 
 | ||||
| #include <boost/archive/detail/basic_iarchive.hpp> | ||||
| 
 | ||||
| #include <optional> | ||||
| #include <boost/move/utility_core.hpp> | ||||
| 
 | ||||
| #include <boost/serialization/item_version_type.hpp> | ||||
| #include <boost/serialization/split_free.hpp> | ||||
| #include <boost/serialization/level.hpp> | ||||
| #include <boost/serialization/nvp.hpp> | ||||
| #include <boost/serialization/version.hpp> | ||||
| #include <boost/type_traits/is_pointer.hpp> | ||||
| #include <boost/serialization/detail/stack_constructor.hpp> | ||||
| #include <boost/serialization/detail/is_default_constructible.hpp> | ||||
| #include <boost/serialization/force_include.hpp> | ||||
| 
 | ||||
| // function specializations must be defined in the appropriate
 | ||||
| // namespace - boost::serialization
 | ||||
| namespace boost { | ||||
| namespace serialization { | ||||
| 
 | ||||
| template<class Archive, class T> | ||||
| void save( | ||||
|     Archive & ar, | ||||
|     const std::optional< T > & t, | ||||
|     const unsigned int /*version*/ | ||||
| ){ | ||||
|     // It is an inherent limitation to the serialization of optional.hpp
 | ||||
|     // that the underlying type must be either a pointer or must have a
 | ||||
|     // default constructor.  It's possible that this could change sometime
 | ||||
|     // in the future, but for now, one will have to work around it.  This can
 | ||||
|     // be done by serialization the optional<T> as optional<T *>
 | ||||
|     #if ! defined(BOOST_NO_CXX11_HDR_TYPE_TRAITS) | ||||
|         BOOST_STATIC_ASSERT( | ||||
|             boost::serialization::detail::is_default_constructible<T>::value | ||||
|             || boost::is_pointer<T>::value | ||||
|         ); | ||||
|     #endif | ||||
|     const bool tflag = t.has_value(); | ||||
|     ar << boost::serialization::make_nvp("initialized", tflag); | ||||
|     if (tflag){ | ||||
|         ar << boost::serialization::make_nvp("value", *t); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| template<class Archive, class T> | ||||
| void load( | ||||
|     Archive & ar, | ||||
|     std::optional< T > & t, | ||||
|     const unsigned int version | ||||
| ){ | ||||
|     bool tflag; | ||||
|     ar >> boost::serialization::make_nvp("initialized", tflag); | ||||
|     if(! tflag){ | ||||
|         t.reset(); | ||||
|         return; | ||||
|     } | ||||
| 
 | ||||
|     if(0 == version){ | ||||
|         boost::serialization::item_version_type item_version(0); | ||||
|         boost::archive::library_version_type library_version( | ||||
|             ar.get_library_version() | ||||
|         ); | ||||
|         if(boost::archive::library_version_type(3) < library_version){ | ||||
|             ar >> BOOST_SERIALIZATION_NVP(item_version); | ||||
|         } | ||||
|     } | ||||
|     if(! t.has_value()) | ||||
|         t = T(); | ||||
|     ar >> boost::serialization::make_nvp("value", *t); | ||||
| } | ||||
| 
 | ||||
| template<class Archive, class T> | ||||
| void serialize( | ||||
|     Archive & ar, | ||||
|     std::optional< T > & t, | ||||
|     const unsigned int version | ||||
| ){ | ||||
|     boost::serialization::split_free(ar, t, version); | ||||
| } | ||||
| 
 | ||||
| template<class T> | ||||
| struct version<std::optional<T> > { | ||||
|     BOOST_STATIC_CONSTANT(int, value = 1); | ||||
| }; | ||||
| 
 | ||||
| } // serialization
 | ||||
| } // boost
 | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue