1 /* Copyright (c) 2002-2005 CrystalClear Software, Inc. 2 * Use, modification and distribution is subject to the 3 * Boost Software License, Version 1.0. (See accompanying 4 * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) 5 * Author: Jeff Garland, Bart Garst 6 * $Date$ 7 */ 8 9 10 11 #ifndef BOOST_DATE_TIME_SOURCE 12 #define BOOST_DATE_TIME_SOURCE 13 #endif 14 #include "boost/date_time/gregorian/greg_month.hpp" 15 #include "boost/date_time/gregorian/greg_facet.hpp" 16 #include "boost/date_time/date_format_simple.hpp" 17 #include "boost/date_time/compiler_config.hpp" 18 #if defined(BOOST_DATE_TIME_INCLUDE_LIMITED_HEADERS) 19 #include "boost/date_time/gregorian/formatters_limited.hpp" 20 #else 21 #include "boost/date_time/gregorian/formatters.hpp" 22 #endif 23 #include "boost/date_time/date_parsing.hpp" 24 #include "boost/date_time/gregorian/parsers.hpp" 25 26 #include "greg_names.hpp" 27 namespace boost { 28 namespace gregorian { 29 30 /*! Returns a shared pointer to a map of Month strings & numbers. 31 * Strings are both full names and abbreviations. 32 * Ex. ("jan",1), ("february",2), etc... 33 * Note: All characters are lowercase - for case insensitivity 34 */ get_month_map_ptr()35 greg_month::month_map_ptr_type greg_month::get_month_map_ptr() 36 { 37 static month_map_ptr_type month_map_ptr(new greg_month::month_map_type()); 38 39 if(month_map_ptr->empty()) { 40 std::string s(""); 41 for(unsigned short i = 1; i <= 12; ++i) { 42 greg_month m(static_cast<month_enum>(i)); 43 s = m.as_long_string(); 44 s = date_time::convert_to_lower(s); 45 month_map_ptr->insert(std::make_pair(s, i)); 46 s = m.as_short_string(); 47 s = date_time::convert_to_lower(s); 48 month_map_ptr->insert(std::make_pair(s, i)); 49 } 50 } 51 return month_map_ptr; 52 } 53 54 55 //! Returns 3 char english string for the month ex: Jan, Feb, Mar, Apr 56 const char* as_short_string() const57 greg_month::as_short_string() const 58 { 59 return short_month_names[value_-1]; 60 } 61 62 //! Returns full name of month as string in english ex: January, February 63 const char* as_long_string() const64 greg_month::as_long_string() const 65 { 66 return long_month_names[value_-1]; 67 } 68 69 //! Return special_value from string argument 70 /*! Return special_value from string argument. If argument is 71 * not one of the special value names (defined in names.hpp), 72 * return 'not_special' */ special_value_from_string(const std::string & s)73 special_values special_value_from_string(const std::string& s) { 74 short i = date_time::find_match(special_value_names, 75 special_value_names, 76 date_time::NumSpecialValues, 77 s); 78 if(i >= date_time::NumSpecialValues) { // match not found 79 return not_special; 80 } 81 else { 82 return static_cast<special_values>(i); 83 } 84 } 85 86 87 #ifndef BOOST_NO_STD_WSTRING 88 //! Returns 3 wchar_t english string for the month ex: Jan, Feb, Mar, Apr 89 const wchar_t* as_short_wstring() const90 greg_month::as_short_wstring() const 91 { 92 return w_short_month_names[value_-1]; 93 } 94 95 //! Returns full name of month as wchar_t string in english ex: January, February 96 const wchar_t* as_long_wstring() const97 greg_month::as_long_wstring() const 98 { 99 return w_long_month_names[value_-1]; 100 } 101 #endif // BOOST_NO_STD_WSTRING 102 103 #ifndef BOOST_DATE_TIME_NO_LOCALE 104 /*! creates an all_date_names_put object with the correct set of names. 105 * This function is only called in the event of an exception where 106 * the imbued locale containing the needed facet is for some reason 107 * unreachable. 108 */ 109 BOOST_DATE_TIME_DECL 110 boost::date_time::all_date_names_put<greg_facet_config, char>* create_facet_def(char)111 create_facet_def(char /*type*/) 112 { 113 typedef 114 boost::date_time::all_date_names_put<greg_facet_config, char> facet_def; 115 116 return new facet_def(short_month_names, 117 long_month_names, 118 special_value_names, 119 short_weekday_names, 120 long_weekday_names); 121 } 122 123 //! generates a locale with the set of gregorian name-strings of type char* generate_locale(std::locale & loc,char)124 BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, char /*type*/){ 125 typedef boost::date_time::all_date_names_put<greg_facet_config, char> facet_def; 126 return std::locale(loc, new facet_def(short_month_names, 127 long_month_names, 128 special_value_names, 129 short_weekday_names, 130 long_weekday_names) 131 ); 132 } 133 134 #ifndef BOOST_NO_STD_WSTRING 135 /*! creates an all_date_names_put object with the correct set of names. 136 * This function is only called in the event of an exception where 137 * the imbued locale containing the needed facet is for some reason 138 * unreachable. 139 */ 140 BOOST_DATE_TIME_DECL 141 boost::date_time::all_date_names_put<greg_facet_config, wchar_t>* create_facet_def(wchar_t)142 create_facet_def(wchar_t /*type*/) 143 { 144 typedef 145 boost::date_time::all_date_names_put<greg_facet_config,wchar_t> facet_def; 146 147 return new facet_def(w_short_month_names, 148 w_long_month_names, 149 w_special_value_names, 150 w_short_weekday_names, 151 w_long_weekday_names); 152 } 153 154 //! generates a locale with the set of gregorian name-strings of type wchar_t* generate_locale(std::locale & loc,wchar_t)155 BOOST_DATE_TIME_DECL std::locale generate_locale(std::locale& loc, wchar_t /*type*/){ 156 typedef boost::date_time::all_date_names_put<greg_facet_config, wchar_t> facet_def; 157 return std::locale(loc, new facet_def(w_short_month_names, 158 w_long_month_names, 159 w_special_value_names, 160 w_short_weekday_names, 161 w_long_weekday_names) 162 ); 163 } 164 #endif // BOOST_NO_STD_WSTRING 165 #endif // BOOST_DATE_TIME_NO_LOCALE 166 167 } } //namespace gregorian 168 169 170 171 172 173 174