#include <boost/config.hpp> /* keep it first to prevent nasty warns in MSVC */
#include <algorithm>
#include <cassert>
#include <boost/archive/text_oarchive.hpp>
#include <boost/archive/text_iarchive.hpp>
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/ordered_index.hpp>
#include <boost/multi_index/sequenced_index.hpp>
#include <boost/multi_index/identity.hpp>
#include <functional>
#include <sstream>

using namespace boost::multi_index;

typedef multi_index_container<
  int,
  indexed_by<
    ordered_non_unique<identity<int> >,
    ordered_non_unique<identity<int>,std::greater<int> >,
    sequenced<>
  >
 > multi_t;

template<typename Archive,typename MultiIndexContainer>
void poor_man_multi_index_save(Archive& ar,const MultiIndexContainer& m)
{
  const typename MultiIndexContainer::size_type s=m.size();
  ar<<s;
  for(typename MultiIndexContainer::const_iterator it=m.begin(),it_end=m.end();
      it!=it_end;++it){
    ar<<*it;
  }
}

template<typename Archive,typename MultiIndexContainer>
void poor_man_multi_index_load(Archive& ar,MultiIndexContainer& m)
{
  typename MultiIndexContainer::size_type s;
  ar>>s;
  while(s--){
    typename MultiIndexContainer::value_type x;
    ar>>x;
    m.insert(m.end(),x);
  }
}

int main()
{
  multi_t m1;
  for(int i=0;i<100;++i)m1.insert(i);

  std::ostringstream oss;
  {
    boost::archive::text_oarchive oa(oss);
    poor_man_multi_index_save(oa,m1);
  }

  multi_t m2;
  std::istringstream iss(oss.str());
  boost::archive::text_iarchive ia(iss);
  poor_man_multi_index_load(ia,m2);

  assert(std::equal(m1.begin(),m1.end(),m2.begin()));
}

