<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE library PUBLIC "-//Boost//DTD BoostBook XML V1.0//EN" 
"../../../tools/boostbook/dtd/boostbook.dtd">

<!-- Copyright (c) 2001-2004 CrystalClear Software, Inc.
     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)
-->

<section id="date_time.examples.print_holidays">
  <title>Print Holidays</title>

  <para>  
    This is an example of using functors to define a holiday schedule
  </para>
  <programlisting>
    <![CDATA[

  /* 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;
  }

    ]]>
  </programlisting>
</section>
