00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef SBUILD_TYPES_H
00021 #define SBUILD_TYPES_H
00022
00023 #include <cassert>
00024 #include <ctime>
00025 #include <ios>
00026 #include <locale>
00027 #include <string>
00028 #include <vector>
00029
00030 namespace sbuild
00031 {
00032
00034 typedef std::vector<std::string> string_list;
00035
00039 class date_base
00040 {
00041 public:
00043 typedef std::tm *(*break_time_func)(const time_t *timep, std:: tm *result);
00044
00051 date_base (time_t unix_time,
00052 break_time_func break_time):
00053 unix_time(unix_time),
00054 break_time(break_time)
00055 {}
00056
00058 ~date_base ()
00059 {}
00060
00068 template <class charT, class traits>
00069 friend
00070 std::basic_ostream<charT,traits>&
00071 operator << (std::basic_ostream<charT,traits>& stream,
00072 date_base const& dt)
00073 {
00074 std::ios_base::iostate err = std::ios_base::goodbit;
00075
00076 std::tm dtm;
00077 if ((dt.break_time(&dt.unix_time, &dtm)) == 0)
00078 {
00079 err = std::ios_base::badbit;
00080 }
00081 else
00082 {
00083 try
00084 {
00085 typename std::basic_ostream<charT, traits>::sentry sentry(stream);
00086 if (sentry)
00087 {
00088 const std::basic_string<char>
00089 nfmt(date_base::get_date_format());
00090 std::basic_string<charT> wfmt(nfmt.size(), 0);
00091 assert(nfmt.size() == wfmt.size());
00092 const char *nptr = nfmt.c_str();
00093 charT *wptr = const_cast<charT *>(wfmt.c_str());
00094
00095 std::use_facet<std::ctype<charT> >(stream.getloc())
00096 .widen(nptr, nptr + nfmt.size(), wptr);
00097
00098 typedef std::time_put<charT,std::ostreambuf_iterator<charT,traits> >
00099 time_type;
00100 if (std::use_facet<time_type>(stream.getloc())
00101 .put(stream, stream, stream.fill(),
00102 &dtm,
00103 wptr, wptr + wfmt.size())
00104 .failed())
00105 {
00106 err = std::ios_base::badbit;
00107 }
00108 stream.width(0);
00109 }
00110 }
00111 catch (...)
00112 {
00113 bool flag = false;
00114 try
00115 {
00116 stream.setstate(std::ios::failbit);
00117 }
00118 catch (std::ios_base::failure const& discard)
00119 {
00120 flag = true;
00121 }
00122 if (flag)
00123 throw;
00124 }
00125 }
00126
00127 if (err)
00128 stream.setstate(err);
00129
00130 return stream;
00131 }
00132
00133 private:
00140 static const char *
00141 get_date_format ();
00142
00144 time_t unix_time;
00146 break_time_func break_time;
00147 };
00148
00152 class gmdate : public date_base
00153 {
00154 public:
00160 gmdate (time_t unix_time):
00161 date_base(unix_time, gmtime_r)
00162 {}
00163
00165 ~gmdate ()
00166 {}
00167 };
00168
00172 class date : public date_base
00173 {
00174 public:
00180 date (time_t unix_time):
00181 date_base(unix_time, localtime_r)
00182 {}
00183
00185 ~date ()
00186 {}
00187 };
00188
00189 }
00190
00191 #endif
00192
00193
00194
00195
00196
00197