]> git.sesse.net Git - casparcg/blob - dependencies/boost/boost/date_time/date_formatting_limited.hpp
Manually merged pull request #222
[casparcg] / dependencies / boost / boost / date_time / date_formatting_limited.hpp
1 #ifndef DATE_TIME_DATE_FORMATTING_LIMITED_HPP___
2 #define DATE_TIME_DATE_FORMATTING_LIMITED_HPP___
3
4 /* Copyright (c) 2002-2004 CrystalClear Software, Inc.
5  * Use, modification and distribution is subject to the 
6  * Boost Software License, Version 1.0. (See accompanying
7  * file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
8  * Author: Jeff Garland, Bart Garst
9  * $Date: 2008-02-27 15:00:24 -0500 (Wed, 27 Feb 2008) $
10  */
11
12 #include "boost/date_time/iso_format.hpp"
13 #include "boost/date_time/compiler_config.hpp"
14 #include <string>
15 #include <sstream>
16 #include <iomanip>
17
18
19 namespace boost {
20 namespace date_time {
21
22   //! Formats a month as as string into an ostream
23   template<class month_type, class format_type>
24   class month_formatter
25   {
26   public:
27     //! Formats a month as as string into an ostream
28     /*! This function demands that month_type provide
29      *  functions for converting to short and long strings
30      *  if that capability is used.
31      */
32     static std::ostream& format_month(const month_type& month,
33                                       std::ostream& os)
34     {
35       switch (format_type::month_format()) 
36       {
37         case month_as_short_string: 
38         { 
39           os << month.as_short_string(); 
40           break;
41         }
42         case month_as_long_string: 
43         { 
44           os << month.as_long_string(); 
45           break;
46         }
47         case month_as_integer: 
48         { 
49           os << std::setw(2) << std::setfill('0') << month.as_number();
50           break;
51         }
52      
53       }
54       return os;
55     } // format_month
56   };
57
58
59   //! Convert ymd to a standard string formatting policies
60   template<class ymd_type, class format_type>
61   class ymd_formatter
62   {
63   public:
64     //! Convert ymd to a standard string formatting policies
65     /*! This is standard code for handling date formatting with
66      *  year-month-day based date information.  This function 
67      *  uses the format_type to control whether the string will
68      *  contain separator characters, and if so what the character
69      *  will be.  In addtion, it can format the month as either
70      *  an integer or a string as controled by the formatting 
71      *  policy
72      */ 
73     static std::string ymd_to_string(ymd_type ymd)
74     {
75       typedef typename ymd_type::month_type month_type;
76       std::ostringstream ss;
77       ss << ymd.year;
78       if (format_type::has_date_sep_chars()) {
79         ss << format_type::month_sep_char();
80       }
81       //this name is a bit ugly, oh well....
82       month_formatter<month_type,format_type>::format_month(ymd.month, ss);
83       if (format_type::has_date_sep_chars()) {
84         ss << format_type::day_sep_char();
85       }
86       ss  << std::setw(2) << std::setfill('0') 
87           << ymd.day;
88       return ss.str();
89     }
90   };
91
92
93   //! Convert a date to string using format policies
94   template<class date_type, class format_type>
95   class date_formatter
96   {
97   public:
98     //! Convert to a date to standard string using format policies
99     static std::string date_to_string(date_type d)
100     {
101       typedef typename date_type::ymd_type ymd_type;
102       if (d.is_not_a_date()) {
103         return format_type::not_a_date();
104       }
105       if (d.is_neg_infinity()) {
106         return format_type::neg_infinity();
107       }
108       if (d.is_pos_infinity()) {
109         return format_type::pos_infinity();
110       }
111       ymd_type ymd = d.year_month_day();
112       return ymd_formatter<ymd_type, format_type>::ymd_to_string(ymd);
113     }    
114   };
115
116
117 } } //namespace date_time
118
119
120 #endif
121