$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r84256 - in sandbox/chrono_date: boost/chrono/date libs/date/src
From: vicente.botet_at_[hidden]
Date: 2013-05-12 16:13:36
Author: viboes
Date: 2013-05-12 16:13:35 EDT (Sun, 12 May 2013)
New Revision: 84256
URL: http://svn.boost.org/trac/boost/changeset/84256
Log:
Chrono/Date: Make is_invalid ymd_date(y, md) constexpr.
Text files modified: 
   sandbox/chrono_date/boost/chrono/date/conversions.hpp |     5 +                                       
   sandbox/chrono_date/boost/chrono/date/ymd_date.hpp    |   102 ++++++++++++++++++++++++++++++--------- 
   sandbox/chrono_date/libs/date/src/conversions.cpp     |    21 +++++++-                                
   sandbox/chrono_date/libs/date/src/ymd_date.cpp        |    58 ++++++++--------------                  
   4 files changed, 121 insertions(+), 65 deletions(-)
Modified: sandbox/chrono_date/boost/chrono/date/conversions.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/conversions.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/conversions.hpp	2013-05-12 16:13:35 EDT (Sun, 12 May 2013)
@@ -42,8 +42,9 @@
     days::rep to_days(int_least32_t y, int_least16_t m, int_least16_t d, bool) BOOST_NOEXCEPT;
     void to_ymd(days::rep dt, int& y, int& m, int& d) BOOST_NOEXCEPT;
     void to_ymd(days::rep dt, int_least32_t& y, int_least16_t& m, int_least16_t& d) BOOST_NOEXCEPT;
-    void to_ymdl(days::rep dt, int_least32_t& y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT;
-    //int_least16_t to_ymdl(days::rep dt, int_least32_t y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT;
+    void to_ymd_leap(days::rep dt, int_least32_t& y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT;
+    void to_ymd_leap(days::rep dt, int_least16_t& y, int_least8_t& m, int_least8_t& d, bool& leap) BOOST_NOEXCEPT;
+    //int_least16_t to_ymd_leap(days::rep dt, int_least32_t y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT;
 
     days to_days(year_month_day) BOOST_NOEXCEPT;
     days to_days(year_day_of_year) BOOST_NOEXCEPT;
Modified: sandbox/chrono_date/boost/chrono/date/ymd_date.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/ymd_date.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/ymd_date.hpp	2013-05-12 16:13:35 EDT (Sun, 12 May 2013)
@@ -96,44 +96,79 @@
 
     public:
 #if ! defined  BOOST_CHRONO_DATE_DOXYGEN_INVOKED
+    private:
 
-#ifndef  BOOST_NO_CXX11_CONSTEXPR
+      /**
+       * Check the validity between the parameters not that the parameters are them self valid.
+       */
       BOOST_FORCEINLINE static BOOST_CHRONO_DATE_CONSTEXPR
-      day check_invariants(year y, month m, day d)
+      bool is_valid_(year y, month m, day d)
       {
           return (m != 2)
               ? ( d <= chrono_detail::max_days_in_month(m)
-                  ? d
-                  : throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m))
+                  ? true
+                  : false
                 )
               : ( y.is_leap()
                 ? ( d <= 29
-                    ? d
-                    : throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m))
+                    ? true
+                    : false
                 )
                 : ( d <= 28
-                    ? d
-                    : throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m))
+                    ? true
+                    : false
                   )
                 );
       }
+      BOOST_FORCEINLINE static BOOST_CHRONO_DATE_CONSTEXPR
+      bool is_valid_(year y, month_day md)
+      {
+          return month(md) != 2 || day(md) <= 28 || y.is_leap()
+              ? true
+              : false;
+      }
+
+#ifndef  BOOST_NO_CXX11_CONSTEXPR
+      BOOST_FORCEINLINE static BOOST_CHRONO_DATE_CONSTEXPR
+      day check_invariants(year y, month m, day d)
+      {
+          return is_valid_(y,m,d)
+                  ? d
+                  : throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m))
+                ;
+      }
+
+      BOOST_FORCEINLINE static BOOST_CHRONO_DATE_CONSTEXPR
+      day check_invariants(year y, month_day md)
+      {
+          return is_valid_(y,md)
+                  ? day(md)
+                  : throw bad_date("day " + to_string(day(md)) + " is out of range for " + to_string(y) + '/' + to_string(month(md)))
+                ;
+      }
+
 #else
       BOOST_FORCEINLINE static
       day check_invariants(year y, month m, day d)
       {
-          if ( m != 2 )
-              if ( d <= chrono_detail::max_days_in_month(m) ) return d;
-              else throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m));
-          else
-            if (y.is_leap())
-                if ( d <= 29 ) return d;
-                else throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m));
-            else
-                if (d <= 28) return d;
-                else throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m));
+          if ( is_valid_(y,m,d) )
+              return d;
+          else throw bad_date("day " + to_string(d) + " is out of range for " + to_string(y) + '/' + to_string(m));
+      }
+
+      BOOST_FORCEINLINE static
+      day check_invariants(year y, month_day md)
+      {
+          if ( is_valid_(y,md) )
+              return day(md);
+          else throw bad_date("day " + to_string(day(md)) + " is out of range for " + to_string(y) + '/' + to_string(month(md)));
       }
 #endif
 
+
+
+
+
 #endif
       /**
        * @Effect Constructs a @c ymd_date using the @c year, @c month, @c day stored in the arguments as follows:
@@ -152,7 +187,7 @@
 #endif
       {
       }
-      ymd_date(int y, chrono::month m, chrono::day d, check_t):
+      BOOST_FORCEINLINE BOOST_CHRONO_DATE_CONSTEXPR ymd_date(int y, chrono::month m, chrono::day d, check_t):
         y_(y),
         m_(m),
         d_(check_invariants(year(y), m, d))
@@ -161,7 +196,7 @@
   #endif
         {
         }
-      ymd_date(chrono::year y, int m, chrono::day d, check_t):
+      BOOST_FORCEINLINE BOOST_CHRONO_DATE_CONSTEXPR ymd_date(chrono::year y, int m, chrono::day d, check_t):
         y_(y),
         m_(m),
         d_(check_invariants(y, month(m), d))
@@ -304,13 +339,29 @@
        * @Throws bad_date if the specified ymd_date is invalid.
        * @Note This constructor can be more efficient as the month_day is already valid.
        */
-      ymd_date(chrono::year y, month_day md, check_t);
+      BOOST_FORCEINLINE BOOST_CHRONO_DATE_CONSTEXPR ymd_date(chrono::year y, month_day md, check_t):
+      y_(y),
+      m_(month(md)),
+      d_(check_invariants(y, md))
+#if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
+      , leap_(y.is_leap())
+#endif
+      {
+      }
       /**
        * @Effect Constructs a ymd_date using the year, month_day stored in the arguments as follows:
        * Constructs a ymd_date for which year() == y, month() == month(md), day() == month(md).
        * @Note This constructor can be more efficient as the month_day is already valid.
        */
-      ymd_date(chrono::year, month_day) BOOST_NOEXCEPT;
+      BOOST_FORCEINLINE BOOST_CHRONO_DATE_CONSTEXPR ymd_date(chrono::year y, month_day md) BOOST_NOEXCEPT:
+      y_(y),
+      m_(month(md)),
+      d_(day(md))
+      #if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
+      , leap_(y.is_leap())
+      #endif
+          {
+          }
 
 //      /**
 //       * @Effect Constructs a ymd_date using the year, day_of_year stored in the arguments as follows:
@@ -434,7 +485,10 @@
        * @Returns whether the year()/month()/day() is a valid proleptic Gregorian date.
        */
       // @todo BOOST_CONSTEXPR
-      bool is_valid() const BOOST_NOEXCEPT;
+      BOOST_FORCEINLINE BOOST_CHRONO_DATE_CONSTEXPR bool is_valid() const BOOST_NOEXCEPT
+      {
+        return month(m_).is_valid() && day(d_).is_valid() && is_valid_(year(y_), month(m_), day(d_));
+      }
 
 //#if ! defined  BOOST_CHRONO_DATE_DOXYGEN_INVOKED
 //    private:
@@ -537,7 +591,7 @@
       BOOST_FORCEINLINE BOOST_CONSTEXPR bool is_leap_year() const BOOST_NOEXCEPT
       {
 #if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
-            return leap_;
+        return leap_;
 #else
         return is_leap(y_);
 #endif
Modified: sandbox/chrono_date/libs/date/src/conversions.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/src/conversions.cpp	(original)
+++ sandbox/chrono_date/libs/date/src/conversions.cpp	2013-05-12 16:13:35 EDT (Sun, 12 May 2013)
@@ -88,7 +88,7 @@
       d = day_of_year_day_of_month(leap,doy+1);
     }
 
-//    int_least16_t to_ymdl(days::rep x_, int_least32_t y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT
+//    int_least16_t to_ymd_leap(days::rep x_, int_least32_t y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT
 //    {
 //      y = static_cast<int_least32_t>(static_cast<int64_t>(x_ + 2) * 400 / 146097);
 //      int doy = x_ - days_before_year(y);
@@ -104,7 +104,7 @@
 //      d = day_of_year_day_of_month(leap,doy+1);
 //      return y;
 //    }
-    void to_ymdl(days::rep x_, int_least32_t& y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT
+    void to_ymd_leap(days::rep x_, int_least32_t& y, int_least16_t& m, int_least16_t& d, bool& leap) BOOST_NOEXCEPT
     {
       y = static_cast<int_least32_t>(static_cast<int64_t>(x_ + 2) * 400 / 146097);
       int doy = x_ - days_before_year(y);
@@ -119,7 +119,22 @@
       m = day_of_year_month(leap,doy+1);
       d = day_of_year_day_of_month(leap,doy+1);
     }
-
+    void to_ymd_leap(days::rep x_, int_least16_t& y, int_least8_t& m, int_least8_t& d, bool& leap) BOOST_NOEXCEPT
+    {
+      int_least32_t y32 = static_cast<int_least32_t>(static_cast<int64_t>(x_ + 2) * 400 / 146097);
+      int doy = x_ - days_before_year(y32);
+      if (doy < 0)
+      {
+        --y32;
+        doy = x_ - days_before_year(y32);
+      }
+      //y += (year::first_-1);
+      y32 -= 32799;
+      leap = is_leap(y32);
+      y  = static_cast<int_least16_t>(y32);
+      m = day_of_year_month(leap,doy+1);
+      d = day_of_year_day_of_month(leap,doy+1);
+    }
     year_month_day to_ymd(days dt) BOOST_NOEXCEPT
     {
       days::rep x_ = dt.count();
Modified: sandbox/chrono_date/libs/date/src/ymd_date.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/src/ymd_date.cpp	(original)
+++ sandbox/chrono_date/libs/date/src/ymd_date.cpp	2013-05-12 16:13:35 EDT (Sun, 12 May 2013)
@@ -46,24 +46,24 @@
       return system_clock::from_time_t(t);
     }
 
-    bool ymd_date::is_valid() const BOOST_NOEXCEPT
-    {
-      //if (chrono::year(y_).is_valid() && chrono::month(m_).is_valid() && chrono::day(d_).is_valid())
-      {
-        const day_of_year::rep* year_data = days_in_year_before(is_leap_year());
-
-        if (! (1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
-        {
-          return false;
-        }
-        else
-        {
-          return true;
-        }
-      }
-      return false;
-
-    }
+//    bool ymd_date::is_valid() const BOOST_NOEXCEPT
+//    {
+//      //if (chrono::year(y_).is_valid() && chrono::month(m_).is_valid() && chrono::day(d_).is_valid())
+//      {
+//        const day_of_year::rep* year_data = days_in_year_before(is_leap_year());
+//
+//        if (! (1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
+//        {
+//          return false;
+//        }
+//        else
+//        {
+//          return true;
+//        }
+//      }
+//      return false;
+//
+//    }
 
     bool ymd_date::set_if_valid_date(chrono::year y, chrono::month m, chrono::day d) BOOST_NOEXCEPT
     {
@@ -109,20 +109,6 @@
 //      return true;
 //    }
 
-    ymd_date::ymd_date(chrono::year y, chrono::month_day md, check_t)
-    {
-      if (set_if_valid_date(y, month(md), day(md))) return;
-      throw bad_date(
-          "day " + to_string(day(md)) + " is out of range for " + to_string(y) + '-' + to_string(month(md)));
-    }
-
-    ymd_date::ymd_date(chrono::year y, chrono::month_day md)BOOST_NOEXCEPT
-    : y_(y), m_(month(md)), d_(day(md))
-#if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
-      , leap_(is_leap(y_))
-#endif
-    {
-    }
 
 //    ymd_date::ymd_date(chrono::year y, day_of_year doy) BOOST_NOEXCEPT
 //    {
@@ -163,14 +149,14 @@
     {
 #if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
 //#if ! defined __clang__
-#if 1
+#if 0
       year_month_day_leap ymdl = to_ymd_leap(dt.days_since_epoch());
       y_=year(ymdl);
       m_=month(ymdl);
       d_=day(ymdl);
       leap_=ymdl.is_leap_year();
 #else
-      to_ymdl(dt.days_since_epoch().count(), y_,m_,d_,leap_);
+      to_ymd_leap(dt.days_since_epoch().count(), y_,m_,d_,leap_);
 #endif
 #else
       to_ymd(dt.days_since_epoch().count(), y_,m_,d_);
@@ -181,14 +167,14 @@
     {
 #if defined  BOOST_CHRONO_DATE_YMD_DATE_HAS_LEAP_FIELD
 //#if ! defined __clang__
-#if 1
+#if 0
       year_month_day_leap ymdl = to_ymd_leap(d);
       leap_=ymdl.is_leap_year();
       y_=year(ymdl);
       m_=month(ymdl);
       d_=day(ymdl);
 #else
-      to_ymdl(d.count(), y_,m_,d_,leap_);
+      to_ymd_leap(d.count(), y_,m_,d_,leap_);
 #endif
 
 #else