#include "ublas_ser.hpp"
#include <boost/test/minimal.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <sstream>
#include <string>
#include <boost/range.hpp>
#include <algorithm>

namespace ublas = boost::numeric::ublas;

template<typename V>
std::string Saveit (V const& v) {
  std::ostringstream os;
  boost::archive::binary_oarchive oa (os);
  oa << v;
  return os.str();
}

template<typename V>
V Loadit (std::string const& s) {
  V v;
  std::istringstream is (s);
  boost::archive::binary_iarchive ia (is);
  ia >> v;
  return v;
}

template<typename a_t, typename b_t>
inline bool equal (a_t const& a, b_t const& b) {
  return std::equal (boost::begin (a), boost::end (a), boost::begin (b));
}

int test_main( int, char *[] ) {
  using namespace boost::serialization;
  ublas::vector<int> a (10);
  for (int i = 0; i < a.size(); ++i)
    a[i] = i;

  std::string s = Saveit (a);

  ublas::vector<int> b = Loadit<ublas::vector<int> > (s);
  BOOST_CHECK (equal (a, b));

}
