

#include "boost/date_time/gregorian/gregorian.hpp"
#include "boost/date_time/gregorian/greg_serialize.hpp"
#include "boost/serialization/set.hpp"
#include "boost/serialization/list.hpp"
#include "boost/archive/text_oarchive.hpp"
#include "boost/archive/text_iarchive.hpp"
#include <iostream>
#include <fstream>

using namespace boost::gregorian;
typedef std::set<date> date_set;
typedef std::list<date> date_list;

void print(std::ostream& os, const date_set& ds) 
{
  os << "******** Date Set *********" << std::endl;
  date_set::const_iterator itr = ds.begin();
  while (itr != ds.end()) 
  {
    os << (*itr) << " ";
    itr++;
  }
  os << "\n***************************" << std::endl;
}

class foo {
 public:
  foo(date d = date(not_a_date_time), 
      int i = 0) :
    my_date(d),
    my_int(i)
  {}
  void insert_date(date d)
  {
    my_dates.push_back(d);
  }
  void print(std::ostream& os) const
  {
    os << "foo= my_date is: " << my_date 
       << " my_int is: " << my_int;
    date_list::const_iterator i = my_dates.begin();
    os << " Important dates: ";
    while (i != my_dates.end()) {
      os << (*i) << " ";
      i++;
    }
    os << std::endl;
  }
 private:
  friend class boost::serialization::access;
 
  // is a type of input archive the & operator is defined similar to >>.
  template<class Archive>
  void serialize(Archive & ar, const unsigned int version)
  {
    ar & my_date;
    ar & my_int;
    ar & my_dates;
  }

  date my_date;
  int my_int;
  date_list my_dates;
};


int
main()
{
  try {
    date d(2004, Apr, 5);
    std::cout << "Date: " << to_iso_string(d) << std::endl;
    std::cout << "Date: " << d << std::endl;
    std::ofstream ofs("date_demo.txt");
    boost::archive::text_oarchive oa(ofs);
    oa << d;
    
    std::cout << "Construct a foo" << std::endl;
    foo f(d, 1);
    f.insert_date(d+days(1));
    f.insert_date(d+days(2));
    f.insert_date(d+days(3));
    f.print(std::cout);
    oa << f;
    
    date_set dates;
    dates.insert(date(2004, Apr,1));
    dates.insert(date(2004, Apr,10));
    dates.insert(date(2004, Apr,15));
    print(std::cout, dates);
    
    oa << dates;
    ofs.close();

    std::cout << "Now do the input streaming" << std::endl;
    date d2(not_a_date_time);
    std::ifstream ifs("date_demo.txt");
    boost::archive::text_iarchive ia(ifs);
    ia >> d2;
    
    std::cout << "New date is: " << d2 << std::endl;
    
    foo f2;
    ia >> f2;
    f2.print(std::cout);
    
    date_set dates2;
    ia >> dates2; //exception here
    print(std::cout, dates2);

  }
  catch(std::exception& e) {
    std::cout << "Caught Exception: " << e.what() << std::endl;
  }

}


/*  Copyright 2001-2004: CrystalClear Software, Inc
 *  http://www.crystalclearsoftware.com
 *
 *  Subject to the Boost Software License, Version 1.0.
 * (See accompanying file LICENSE-1.0 or http://www.boost.org/LICENSE-1.0)
 */

