/* Generate a set of dates using a collection of date generators
 * Output looks like:
 * Enter Year: 2002
 * 2002-Jan-01 [Tue]
 * 2002-Jan-21 [Mon]
 * 2002-Feb-12 [Tue]
 * 2002-Jul-04 [Thu]
 * 2002-Sep-02 [Mon]
 * 2002-Nov-28 [Thu]
 * 2002-Dec-25 [Wed]
 * Number Holidays: 7
 */

#include "boost/date_time/gregorian/gregorian.hpp"
#include <algorithm>
#include <functional>
#include <vector>
#include <iostream>
#include <set>

void
print_date(boost::gregorian::date d) 
{
  using namespace boost::gregorian;
#if defined(BOOST_DATE_TIME_NO_LOCALE)
  std::cout << to_simple_string(d) << " [" << d.day_of_week() << "]\n";
#else
  std::cout << d << " [" << d.day_of_week() << "]\n";
#endif
}


int
main() {

  std::cout << "Enter Year: ";
  int year;
  std::cin >> year;

  using namespace boost::gregorian;

  //define a collection of holidays fixed by month and day
  std::vector<year_based_generator*> holidays;
  holidays.push_back(new partial_date(1,Jan)); //Western New Year
  holidays.push_back(new partial_date(4,Jul)); //US Independence Day
  holidays.push_back(new partial_date(25, Dec));//Christmas day


  //define a shorthand for the nth_day_of_the_week_in_month function object
  typedef nth_day_of_the_week_in_month nth_dow;
  
  //US labor day
  holidays.push_back(new nth_dow(nth_dow::first,  Monday,   Sep)); 
  //MLK Day
  holidays.push_back(new nth_dow(nth_dow::third,  Monday,   Jan)); 
  //Pres day
  holidays.push_back(new nth_dow(nth_dow::second, Tuesday,  Feb)); 
  //Thanksgiving
  holidays.push_back(new nth_dow(nth_dow::fourth, Thursday, Nov)); 

  typedef std::set<date> date_set;
  date_set all_holidays;
  
  for(std::vector<year_based_generator*>::iterator it = holidays.begin();
      it != holidays.end(); ++it)
  {
    all_holidays.insert((*it)->get_date(year));
  }

  //print the holidays to the screen
  std::for_each(all_holidays.begin(), all_holidays.end(), print_date);
  std::cout << "Number Holidays: " << all_holidays.size() << std::endl;

  return 0;
}

/*  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.txt or http://www.boost.org/LICENSE_1_0.txt)
 */

