You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
144 lines
5.0 KiB
144 lines
5.0 KiB
#ifndef DATE_TIME_TIME_RESOLUTION_TRAITS_HPP |
|
#define DATE_TIME_TIME_RESOLUTION_TRAITS_HPP |
|
|
|
/* Copyright (c) 2002,2003 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: 2009-06-06 07:25:55 -0400 (Sat, 06 Jun 2009) $ |
|
*/ |
|
|
|
|
|
#include <boost/cstdint.hpp> |
|
#include <boost/date_time/time_defs.hpp> |
|
#include <boost/date_time/int_adapter.hpp> |
|
#include <boost/date_time/compiler_config.hpp> |
|
|
|
namespace boost { |
|
namespace date_time { |
|
|
|
//! Simple function to calculate absolute value of a numeric type |
|
template <typename T> |
|
// JDG [7/6/02 made a template], |
|
// moved here from time_duration.hpp 2003-Sept-4. |
|
inline T absolute_value(T x) |
|
{ |
|
return x < 0 ? -x : x; |
|
} |
|
|
|
//! traits struct for time_resolution_traits implementation type |
|
struct time_resolution_traits_bi32_impl { |
|
typedef boost::int32_t int_type; |
|
typedef boost::int32_t impl_type; |
|
static int_type as_number(impl_type i){ return i;} |
|
//! Used to determine if implemented type is int_adapter or int |
|
static bool is_adapted() { return false;} |
|
}; |
|
//! traits struct for time_resolution_traits implementation type |
|
struct time_resolution_traits_adapted32_impl { |
|
typedef boost::int32_t int_type; |
|
typedef boost::date_time::int_adapter<boost::int32_t> impl_type; |
|
static int_type as_number(impl_type i){ return i.as_number();} |
|
//! Used to determine if implemented type is int_adapter or int |
|
static bool is_adapted() { return true;} |
|
}; |
|
//! traits struct for time_resolution_traits implementation type |
|
struct time_resolution_traits_bi64_impl { |
|
typedef boost::int64_t int_type; |
|
typedef boost::int64_t impl_type; |
|
static int_type as_number(impl_type i){ return i;} |
|
//! Used to determine if implemented type is int_adapter or int |
|
static bool is_adapted() { return false;} |
|
}; |
|
//! traits struct for time_resolution_traits implementation type |
|
struct time_resolution_traits_adapted64_impl { |
|
typedef boost::int64_t int_type; |
|
typedef boost::date_time::int_adapter<boost::int64_t> impl_type; |
|
static int_type as_number(impl_type i){ return i.as_number();} |
|
//! Used to determine if implemented type is int_adapter or int |
|
static bool is_adapted() { return true;} |
|
}; |
|
|
|
template<typename frac_sec_type, |
|
time_resolutions res, |
|
#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) |
|
boost::int64_t resolution_adjust, |
|
#else |
|
typename frac_sec_type::int_type resolution_adjust, |
|
#endif |
|
unsigned short frac_digits, |
|
typename v_type = boost::int32_t > |
|
class time_resolution_traits { |
|
public: |
|
typedef typename frac_sec_type::int_type fractional_seconds_type; |
|
typedef typename frac_sec_type::int_type tick_type; |
|
typedef typename frac_sec_type::impl_type impl_type; |
|
typedef v_type day_type; |
|
typedef v_type hour_type; |
|
typedef v_type min_type; |
|
typedef v_type sec_type; |
|
|
|
// bring in function from frac_sec_type traits structs |
|
static fractional_seconds_type as_number(impl_type i) |
|
{ |
|
return frac_sec_type::as_number(i); |
|
} |
|
static bool is_adapted() |
|
{ |
|
return frac_sec_type::is_adapted(); |
|
} |
|
|
|
//Would like this to be frac_sec_type, but some compilers complain |
|
#if (defined(BOOST_MSVC) && (_MSC_VER < 1300)) |
|
BOOST_STATIC_CONSTANT(boost::int64_t, ticks_per_second = resolution_adjust); |
|
#else |
|
BOOST_STATIC_CONSTANT(fractional_seconds_type, ticks_per_second = resolution_adjust); |
|
#endif |
|
|
|
static time_resolutions resolution() |
|
{ |
|
return res; |
|
} |
|
static unsigned short num_fractional_digits() |
|
{ |
|
return frac_digits; |
|
} |
|
static fractional_seconds_type res_adjust() |
|
{ |
|
return resolution_adjust; |
|
} |
|
//! Any negative argument results in a negative tick_count |
|
static tick_type to_tick_count(hour_type hours, |
|
min_type minutes, |
|
sec_type seconds, |
|
fractional_seconds_type fs) |
|
{ |
|
if(hours < 0 || minutes < 0 || seconds < 0 || fs < 0) |
|
{ |
|
hours = absolute_value(hours); |
|
minutes = absolute_value(minutes); |
|
seconds = absolute_value(seconds); |
|
fs = absolute_value(fs); |
|
return (((((fractional_seconds_type(hours)*3600) |
|
+ (fractional_seconds_type(minutes)*60) |
|
+ seconds)*res_adjust()) + fs) * -1); |
|
} |
|
|
|
return (((fractional_seconds_type(hours)*3600) |
|
+ (fractional_seconds_type(minutes)*60) |
|
+ seconds)*res_adjust()) + fs; |
|
} |
|
|
|
}; |
|
|
|
typedef time_resolution_traits<time_resolution_traits_adapted32_impl, milli, 1000, 3 > milli_res; |
|
typedef time_resolution_traits<time_resolution_traits_adapted64_impl, micro, 1000000, 6 > micro_res; |
|
typedef time_resolution_traits<time_resolution_traits_adapted64_impl, nano, 1000000000, 9 > nano_res; |
|
|
|
|
|
} } //namespace date_time |
|
|
|
|
|
|
|
#endif
|
|
|