Skip to content
Snippets Groups Projects
archive.hpp 3.89 KiB
Newer Older
JasonChmn's avatar
JasonChmn committed
// Copyright (c) 2015-2018, CNRS
// Authors: Justin Carpentier <jcarpent@laas.fr>

#ifndef __curves_serialization_archive_hpp__
#define __curves_serialization_archive_hpp__
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
#include "fwd.hpp"
JasonChmn's avatar
JasonChmn committed

#include <fstream>
#include <string>
#include <stdexcept>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/archive/xml_iarchive.hpp>
#include <boost/archive/xml_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/archive/binary_oarchive.hpp>

Guilhem Saurel's avatar
Guilhem Saurel committed
namespace curves {
namespace serialization {
struct Serializable {
 private:
  template <class Derived>
  Derived& derived() {
    return *static_cast<Derived*>(this);
  }
  template <class Derived>
  const Derived& derived() const {
    return *static_cast<const Derived*>(this);
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
 public:
  /// \brief Loads a Derived object from a text file.
  template <class Derived>
  void loadFromText(const std::string& filename) throw(std::invalid_argument) {
    std::ifstream ifs(filename.c_str());
    if (ifs) {
      boost::archive::text_iarchive ia(ifs);
      ia >> derived<Derived>();
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
  /// \brief Saved a Derived object as a text file.
  template <class Derived>
  void saveAsText(const std::string& filename) const throw(std::invalid_argument) {
    std::ofstream ofs(filename.c_str());
    if (ofs) {
      boost::archive::text_oarchive oa(ofs);
      oa << derived<Derived>();
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
  /// \brief Loads a Derived object from an XML file.
  template <class Derived>
  void loadFromXML(const std::string& filename, const std::string& tag_name) throw(std::invalid_argument) {
    assert(!tag_name.empty());
    std::ifstream ifs(filename.c_str());
    if (ifs) {
      boost::archive::xml_iarchive ia(ifs);
      ia >> boost::serialization::make_nvp(tag_name.c_str(), derived<Derived>());
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
  /// \brief Saved a Derived object as an XML file.
  template <class Derived>
  void saveAsXML(const std::string& filename, const std::string& tag_name) const throw(std::invalid_argument) {
    assert(!tag_name.empty());
    std::ofstream ofs(filename.c_str());
    if (ofs) {
      boost::archive::xml_oarchive oa(ofs);
      oa << boost::serialization::make_nvp(tag_name.c_str(), derived<Derived>());
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
  /// \brief Loads a Derived object from an binary file.
  template <class Derived>
  void loadFromBinary(const std::string& filename) throw(std::invalid_argument) {
    std::ifstream ifs(filename.c_str());
    if (ifs) {
      boost::archive::binary_iarchive ia(ifs);
      ia >> derived<Derived>();
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
  }
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
  /// \brief Saved a Derived object as an binary file.
  template <class Derived>
  void saveAsBinary(const std::string& filename) const throw(std::invalid_argument) {
    std::ofstream ofs(filename.c_str());
    if (ofs) {
      boost::archive::binary_oarchive oa(ofs);
      oa << derived<Derived>();
    } else {
      const std::string exception_message(filename + " does not seem to be a valid file.");
      throw std::invalid_argument(exception_message);
    }
JasonChmn's avatar
JasonChmn committed
  }
Guilhem Saurel's avatar
Guilhem Saurel committed
};  // End struct Serializable

}  // namespace serialization
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
}  // namespace curves
JasonChmn's avatar
JasonChmn committed

Guilhem Saurel's avatar
Guilhem Saurel committed
#endif  // ifndef __multicontact_api_serialization_archive_hpp__