diff --git a/src/io/serialization_local_parametrization_base.h b/src/io/serialization_local_parametrization_base.h new file mode 100644 index 0000000000000000000000000000000000000000..921577bbfe1397441cf28696a2c609ac2ea510ba --- /dev/null +++ b/src/io/serialization_local_parametrization_base.h @@ -0,0 +1,116 @@ +#ifndef WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_BASE_H_ +#define WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_BASE_H_ + +#include "../local_parametrization_base.h" + +#include <boost/serialization/serialization.hpp> + +#include <boost/serialization/split_free.hpp> + +#include <boost/serialization/nvp.hpp> +#include <boost/serialization/assume_abstract.hpp> + +BOOST_SERIALIZATION_ASSUME_ABSTRACT(wolf::LocalParametrizationBase) + +namespace boost { +namespace serialization { + +// Since classes deriving from LocalParametrizationBase +// have default constructor calling the non-default +// LocalParametrizationBase constructor with pre-defined +// arguments, there is nothing to save here. +// The only necessary thing to do is to register this +// abstract class and define an empty serialize function. +template<class Archive> +inline void serialize( + Archive &/*ar*/, + wolf::LocalParametrizationBase &/*lpb*/, + const unsigned int /*file_version*/) +{ + // +} + +// Example of what might need to be the serialization +// in case LocalParametrizationBase was not pure abstract. + +/* +template<class Archive> +inline void save( + Archive &ar, + const wolf::LocalParametrizationBase &lpb, + const unsigned int file_version ) +{ + unsigned int global_size = lpb.getGlobalSize(); + unsigned int local_size = lpb.getLocalSize(); + + ar << BOOST_SERIALIZATION_NVP(global_size); + ar << BOOST_SERIALIZATION_NVP(local_size); +} + +template<class Archive> +inline void load( + Archive &ar, + wolf::LocalParametrizationBase &lpb, + const unsigned int file_version ) +{ + unsigned int global_size(0); + unsigned int local_size(0); + + ar >> BOOST_SERIALIZATION_NVP(global_size); + ar >> BOOST_SERIALIZATION_NVP(local_size); + + // 'placement new' + // 1/ it assumes memory already allocated + // 2/ an instance of LocalParametrizationBase is constructed at + // the memory location + ::new(&lpb)wolf::LocalParametrizationBase(global_size, local_size); +} + +// split non-intrusive serialization function member into separate +// non intrusive save/load member functions +template<class Archive> +inline void serialize( + Archive &ar, + wolf::LocalParametrizationBase &lpb, + const unsigned int file_version) +{ + boost::serialization::split_free(ar, lpb, file_version); +} + +// The two functions below allows for serialization of pointers +// (dynamic allocation) + +template<class Archive> +inline void save_construct_data( + Archive &ar, + const wolf::LocalParametrizationBase *lpb, + const unsigned int file_version) +{ + unsigned int global_size = lpb->getGlobalSize(); + unsigned int local_size = lpb->getLocalSize(); + + ar << BOOST_SERIALIZATION_NVP(global_size); + ar << BOOST_SERIALIZATION_NVP(local_size); +} + +template<class Archive> +inline void load_construct_data( + Archive &ar, + wolf::LocalParametrizationBase *lpb, + const unsigned int file_version) +{ + unsigned int global_size(0); + unsigned int local_size(0); + + ar >> BOOST_SERIALIZATION_NVP(global_size); + ar >> BOOST_SERIALIZATION_NVP(local_size); + + ::new(lpb)wolf::LocalParametrizationBase(global_size, local_size); +} + +*/ + +} //namespace serialization +} //namespace boost + +#endif /* WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_BASE_H_ */ diff --git a/src/io/serialization_local_parametrization_homogeneous.h b/src/io/serialization_local_parametrization_homogeneous.h new file mode 100644 index 0000000000000000000000000000000000000000..bf72d8f15f2b554fdc190673bae6cdbaee6b083c --- /dev/null +++ b/src/io/serialization_local_parametrization_homogeneous.h @@ -0,0 +1,29 @@ +#ifndef WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_HOMOGENEOUS_H_ +#define WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_HOMOGENEOUS_H_ + +#include "../local_parametrization_homogeneous.h" + +#include "serialization_local_parametrization_base.h" + +#include <boost/serialization/export.hpp> + +BOOST_CLASS_EXPORT_GUID(wolf::LocalParametrizationHomogeneous, + "wolf_LocalParametrizationHomogeneous") + +namespace boost { +namespace serialization { + +template<class Archive> +inline void serialize( + Archive &ar, + wolf::LocalParametrizationHomogeneous &lp, + const unsigned int /*file_version*/) +{ + ar & boost::serialization::make_nvp("LocalParametrizationBase", + boost::serialization::base_object<wolf::LocalParametrizationBase>(lp)); +} + +} //namespace serialization +} //namespace boost + +#endif /* WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_HOMOGENEOUS_H_ */ diff --git a/src/io/serialization_local_parametrization_quaternion.h b/src/io/serialization_local_parametrization_quaternion.h new file mode 100644 index 0000000000000000000000000000000000000000..b2f721a65830f7727433c07b6da8e5538ef2f63b --- /dev/null +++ b/src/io/serialization_local_parametrization_quaternion.h @@ -0,0 +1,32 @@ +#ifndef WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ +#define WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ + +#include "../local_parametrization_quaternion.h" + +#include "serialization_local_parametrization_base.h" + +#include <boost/serialization/export.hpp> + +BOOST_CLASS_EXPORT_GUID(wolf::LocalParametrizationQuaternion<wolf::DQ_LOCAL>, + "wolf_LocalParametrizationQuaternion_DQ_LOCAL") + +BOOST_CLASS_EXPORT_GUID(wolf::LocalParametrizationQuaternion<wolf::DQ_GLOBAL>, + "wolf_LocalParametrizationQuaternion_DQ_GLOBAL") + +namespace boost { +namespace serialization { + +template<class Archive, unsigned int DeltaReference> +inline void serialize( + Archive &ar, + wolf::LocalParametrizationQuaternion<DeltaReference> &lp, + const unsigned int /*file_version*/) +{ + ar & boost::serialization::make_nvp("LocalParametrizationBase", + boost::serialization::base_object<wolf::LocalParametrizationBase>(lp)); +} + +} //namespace serialization +} //namespace boost + +#endif /* WOLF_IO_SERIALIZATION_LOCAL_PARAMETRIZATION_QUATERNION_H_ */