CppCMS
booster/locale/date_time_facet.h
00001 //
00002 //  Copyright (c) 2009-2011 Artyom Beilis (Tonkikh)
00003 //
00004 //  Distributed under the Boost Software License, Version 1.0. (See
00005 //  accompanying file LICENSE_1_0.txt or copy at
00006 //  http://www.boost.org/LICENSE_1_0.txt)
00007 //
00008 #ifndef BOOSTER_LOCALE_DATE_TIME_FACET_H_INCLUDED
00009 #define BOOSTER_LOCALE_DATE_TIME_FACET_H_INCLUDED
00010 
00011 #include <booster/config.h>
00012 #ifdef BOOSTER_MSVC
00013 #  pragma warning(push)
00014 #  pragma warning(disable : 4275 4251 4231 4660)
00015 #endif
00016 
00017 #include <booster/cstdint.h>
00018 #include <locale>
00019 
00020 namespace booster {
00021     namespace locale {
00025         namespace period {
00029             namespace marks {
00031                 enum period_mark {
00032                     invalid,                    
00033                     era,                        
00034                     year,                       
00035                     extended_year,              
00036                     month,                      
00037                     day,                        
00038                     day_of_year,                
00039                     day_of_week,                
00040 
00041 
00042 
00043 
00044                     day_of_week_in_month,       
00045 
00046                     day_of_week_local,          
00047                     hour,                       
00048                     hour_12,                    
00049                     am_pm,                      
00050                     minute,                     
00051                     second,                     
00052                     week_of_year,               
00053                     week_of_month,              
00054                     first_day_of_week,          
00055                 };
00056 
00057             } // marks
00058 
00070             class period_type {
00071             public:
00075                 period_type(marks::period_mark m = marks::invalid) : mark_(m) 
00076                 {
00077                 }
00078                
00082                 marks::period_mark mark() const
00083                 {
00084                     return mark_;
00085                 }
00086 
00090                 bool operator==(period_type const &other) const
00091                 {
00092                     return mark()==other.mark();
00093                 }
00097                 bool operator!=(period_type const &other) const
00098                 {
00099                     return mark()!=other.mark();
00100                 }
00101             private:
00102                 marks::period_mark mark_;
00103             };
00104 
00105         } // namespace period
00106 
00111         struct posix_time {
00112             int64_t seconds; 
00113             uint32_t nanoseconds;  
00114         };
00115 
00121 
00122         class abstract_calendar {
00123         public:
00124 
00128             typedef enum {
00129                 absolute_minimum,   
00130                 actual_minimum,     
00131                 greatest_minimum,   
00132                 current,            
00133                 least_maximum,      
00134 
00135                 actual_maximum,     
00136                 absolute_maximum,   
00137             } value_type;
00138 
00142             typedef enum {
00143                 move,   
00144                 roll,   
00145             } update_type;
00146 
00150             typedef enum {
00151                 is_gregorian,   
00152                 is_dst          
00153             } calendar_option_type;
00154 
00158             virtual abstract_calendar *clone() const = 0;
00159 
00170             virtual void set_value(period::marks::period_mark p,int value) = 0;
00171 
00175             virtual void normalize() = 0;
00176 
00180             virtual int get_value(period::marks::period_mark p,value_type v) const = 0;
00181 
00185             virtual void set_time(posix_time const &p)  = 0;
00189             virtual posix_time get_time() const  = 0;
00190 
00194             virtual void set_option(calendar_option_type opt,int v) = 0;
00198             virtual int get_option(calendar_option_type opt) const = 0;
00199 
00204             virtual void adjust_value(period::marks::period_mark p,update_type u,int difference) = 0;
00205 
00209             virtual int difference(abstract_calendar const *other,period::marks::period_mark p) const = 0;
00210 
00214             virtual void set_timezone(std::string const &tz) = 0;
00218             virtual std::string get_timezone() const = 0;
00219 
00223             virtual bool same(abstract_calendar const *other) const = 0;
00224 
00225             virtual ~abstract_calendar()
00226             {
00227             }
00228 
00229         };
00230 
00234         class BOOSTER_API calendar_facet : public std::locale::facet {
00235         public:
00239             calendar_facet(size_t refs = 0) : std::locale::facet(refs) 
00240             {
00241             }
00245             virtual abstract_calendar *create_calendar() const = 0;
00246 
00250             static std::locale::id id;
00251         };
00252 
00253     } // locale
00254 } // boost
00255 
00256 #ifdef BOOSTER_MSVC
00257 #pragma warning(pop)
00258 #endif
00259 
00260 
00261 #endif
00262 // vim: tabstop=4 expandtab shiftwidth=4 softtabstop=4
00263