text: /* Copyright (c) 2002-2005 CrystalClear Software, Inc.
   * Use, modification and distribution is 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)
   * Author: Jeff Garland, Bart Garst
   * $Date: 2008-11-23 06:13:35 -0500 (Sun, 23 Nov 2008) $
   */
  
  
  
  #ifndef BOOST_DATE_TIME_SOURCE
  #define BOOST_DATE_TIME_SOURCE
  #endif
  #include "boost/date_time/gregorian/greg_month.hpp"
  #include "boost/date_time/gregorian/greg_facet.hpp"
  #include "boost/date_time/date_format_simple.hpp"
  #include "boost/date_time/compiler_config.hpp"
  #if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS)
  #include "boost/date_time/gregorian/formatters_limited.hpp"
  #else
  #include "boost/date_time/gregorian/formatters.hpp"
  #endif
  #include "boost/date_time/date_parsing.hpp"
  #include "boost/date_time/gregorian/parsers.hpp"
  
  #include "greg_names.hpp"
  namespace boost {
  namespace gregorian {
  
    /*! Returns a shared pointer to a map of Month strings & numbers.
     * Strings are both full names and abbreviations.
     * Ex. ("jan",1), ("february",2), etc...
     * Note: All characters are lowercase - for case insensitivity
     */
    greg_month::month_map_ptr_type greg_month::get_month_map_ptr()
    {
      static month_map_ptr_type month_map_ptr(new greg_month::month_map_type());
  
      if(month_map_ptr->empty()) {
        std::string s("");
        for(unsigned short i = 1; i <= 12; ++i) {
          greg_month m(static_cast<month_enum>(i));
          s = m.as_long_string();
          s = date_time::convert_to_lower(s);
          month_map_ptr->insert(std::make_pair(s, i));
          s = m.as_short_string();
          s = date_time::convert_to_lower(s);
          month_map_ptr->insert(std::make_pair(s, i));
        }
      }
      return month_map_ptr;
    }
  
  
    //! Returns 3 char english string for the month ex: Jan, Feb, Mar, Apr
    const char*
    greg_month::as_short_string() const 
    {
      return short_month_names[value_-1];
    }
    
    //! Returns full name of month as string in english ex: January, February
    const char*
    greg_month::as_long_string()  const 
    {
      return long_month_names[value_-1];
    }
   
    //! Return special_value from string argument
    /*! Return special_value from string argument. If argument is 
     * not one of the special value names (defined in names.hpp), 
     * return 'not_special' */
    special_values special_value_from_string(const std::string& s) {
      short i = date_time::find_match(special_value_names,
                                      special_value_names,
                                      date_time::NumSpecialValues,
                                      s);
      if(i >= date_time::NumSpecialValues) { // match not found
        return not_special;
      }
      else {
        return static_cast<special_values>(i);
      }
    }
  
  
  #ifndef BOOST_NO_STD_WSTRING
    //! Returns 3 wchar_t english string for the month ex: Jan, Feb, Mar, Apr
    const wchar_t*
    greg_month::as_short_wstring() const 
    {
      return w_short_month_names[value_-1];
    }
    
    //! Returns full name of month as wchar_t string in english ex: January, February
    const wchar_t*
    greg_month::as_long_wstring()  const 
    {
      return w_long_month_names[value_-1];
    }
  #endif // BOOST_NO_STD_WSTRING
    
  #ifndef BOOST_DATE_TIME_NO_LOCALE
    /*! creates an all_date_names_put object with the correct set of names.
     * This function is only called in the event of an exception where
     * the imbued locale containing the needed facet is for some reason 
     * unreachable.
     */
    BOOST_DATE_TIME_DECL 
    boost::date_time::all_date_names_put<greg_facet_config, char>* 
    create_facet_def(char type)
    {
      typedef 
        boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
      
      return new facet_def(short_month_names,
                           long_month_names,
                           special_value_names,
                           short_weekday_names,
                           long_weekday_names);
    }
    
    //! generates a locale with the set of gregorian name-strings of type char*
    BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, char type){
      typedef boost::date_time::all_date_names_put<greg_facet_config, char> facet_def;
      return std::locale(loc, new facet_def(short_month_names,
                                            long_month_names,
                                            special_value_names,
                                            short_weekday_names,
                                            long_weekday_names)
          );
    }
    
  #ifndef BOOST_NO_STD_WSTRING
    /*! creates an all_date_names_put object with the correct set of names.
     * This function is only called in the event of an exception where
     * the imbued locale containing the needed facet is for some reason 
     * unreachable.
     */
    BOOST_DATE_TIME_DECL 
    boost::date_time::all_date_names_put<greg_facet_config, wchar_t>* 
    create_facet_def(wchar_t type)
    {
      typedef 
        boost::date_time::all_date_names_put<greg_facet_config,wchar_t> facet_def;
      
      return new facet_def(w_short_month_names,
                           w_long_month_names,
                           w_special_value_names,
                           w_short_weekday_names,
                           w_long_weekday_names);
    }
  
    //! generates a locale with the set of gregorian name-strings of type wchar_t*
    BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, wchar_t type){
      typedef boost::date_time::all_date_names_put<greg_facet_config, wchar_t> facet_def;
      return std::locale(loc, new facet_def(w_short_month_names,
                                            w_long_month_names,
                                            w_special_value_names,
                                            w_short_weekday_names,
                                            w_long_weekday_names)
          );
    }
  #endif // BOOST_NO_STD_WSTRING
  #endif // BOOST_DATE_TIME_NO_LOCALE
  
  } } //namespace gregorian
  
  
  
  
  
  
  