$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r84380 - in sandbox/chrono_date: boost/chrono/date libs/date/example libs/date/src libs/date/test libs/date/test/wrappers
From: vicente.botet_at_[hidden]
Date: 2013-05-19 19:29:50
Author: viboes
Date: 2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
New Revision: 84380
URL: http://svn.boost.org/trac/boost/changeset/84380
Log:
Chrono/Date: Added again specific tags instead of a single type for tags; remove unuseful part in rel_date.cpp.
Added:
   sandbox/chrono_date/boost/chrono/date/nth_tag.hpp   (contents, props changed)
Text files modified: 
   sandbox/chrono_date/boost/chrono/date/date_generators.hpp     |    46                                         
   sandbox/chrono_date/boost/chrono/date/day.hpp                 |    20                                         
   sandbox/chrono_date/boost/chrono/date/include.hpp             |     2                                         
   sandbox/chrono_date/boost/chrono/date/month_nth.hpp           |    37 -                                       
   sandbox/chrono_date/boost/chrono/date/month_nth_weekday.hpp   |    76 +-                                      
   sandbox/chrono_date/boost/chrono/date/nth_week.hpp            |    18                                         
   sandbox/chrono_date/boost/chrono/date/nth_weekday.hpp         |    80 ++                                      
   sandbox/chrono_date/boost/chrono/date/relative_date.hpp       |    26                                         
   sandbox/chrono_date/boost/chrono/date/tuples.hpp              |     2                                         
   sandbox/chrono_date/libs/date/example/hello_world.cpp         |    31                                         
   sandbox/chrono_date/libs/date/src/rel_date.cpp                |  1191 +++------------------------------------ 
   sandbox/chrono_date/libs/date/src/vars.cpp                    |    26                                         
   sandbox/chrono_date/libs/date/test/Jamfile.v2                 |     2                                         
   sandbox/chrono_date/libs/date/test/wrappers/nth_week_pass.cpp |    10                                         
   14 files changed, 310 insertions(+), 1257 deletions(-)
Modified: sandbox/chrono_date/boost/chrono/date/date_generators.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/date_generators.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/date_generators.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -19,7 +19,7 @@
 #include <boost/chrono/date/month_nth_weekday.hpp>
 #include <boost/chrono/date/month_nth.hpp>
 #include <boost/chrono/date/nth_week.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 #include <boost/chrono/date/date_io.hpp>
 
 namespace boost
@@ -114,52 +114,52 @@
       return res;
     }
 
-    template <typename Date>
-    BOOST_FORCEINLINE Date
-    operator >(nth n, Date d)
+    //template <typename Date>
+    BOOST_FORCEINLINE ymd_date
+    operator >(day n, ymd_date d)
     {
-      Date res;
+      ymd_date res;
       if (month(d)==dec)
       {  // dec and jan have 31 days
-        res = Date(year(d),month(d),day(n.value()));
+        res = ymd_date(year(d),month(d),n);
 
         if (res > d) return res;
-        return Date(year(d),jan,day(n.value()));
+        return ymd_date(year(d),jan,n);
       }
 
       if (n.value()>28)
       { // As feb could have 29,30 and 31, we need to validate the two first dates
         if (res.set_if_valid_date(year(d),month(d),day(n.value(), no_check)) && res > d) return res;
         if (res.set_if_valid_date(year(d),month(month(d)+1),day(n.value(), no_check)) && res > d) return res;
-        return Date(year(d),month(month(d)+2),day(n.value(), no_check)) ;
+        return ymd_date(year(d),month(month(d)+2),day(n.value(), no_check)) ;
       }
-      // nth <= 28 is always valid, so the next is either in this month or the next one
-      res = Date(year(d),month(d),day(n.value()));
+      // day <= 28 is always valid, so the next is either in this month or the next one
+      res = ymd_date(year(d),month(d),day(n.value()));
       if (res > d) return res;
-      return Date(year(d),month(month(d)+1),day(n.value(), no_check));
+      return ymd_date(year(d),month(month(d)+1),day(n.value(), no_check));
     }
-    template <typename Date>
-    BOOST_FORCEINLINE Date
-    operator >=(nth n, Date d)
+    //template <typename Date>
+    BOOST_FORCEINLINE ymd_date
+    operator >=(day n, ymd_date d)
     {
-      Date res;
+      ymd_date res;
       if (month(d)==dec)
       {  // dec and jan have 31 days
-        res = Date(year(d),month(d),n.value());
+        res = ymd_date(year(d),month(d),n);
         if (res >= d) return res;
-        return Date(year(d),jan,n.value());
+        return ymd_date(year(d),jan,n);
       }
 
       if (n.value()>28)
       { // As feb could have 29,30 and 31, we need to validate the two first dates
-        if (res.set_if_valid_date(year(d),month(d),day(n.value(), no_check)) && res >= d) return res;
-        if (res.set_if_valid_date(year(d),month(month(d)+1),day(n.value(), no_check)) && res >= d) return res;
-        return Date(year(d),month(d)+2,n.value(), no_check) ;
+        if (res.set_if_valid_date(year(d),month(d),n) && res >= d) return res;
+        if (res.set_if_valid_date(year(d),month(month(d)+1),n) && res >= d) return res;
+        return ymd_date(year(d),month(month(d)+2),n, no_check) ;
       }
-      // nth <= 28 is always valid, so the next is either in this month or the next one
-      res = Date(year(d),month(d),n.value());
+      // day <= 28 is always valid, so the next is either in this month or the next one
+      res = ymd_date(year(d),month(d),n);
       if (res >= d) return res;
-      return Date(year(d),month(month(d)+1),n.value(), no_check);
+      return ymd_date(year(d),month(month(d)+1),n, no_check);
     }
 
 
Modified: sandbox/chrono_date/boost/chrono/date/day.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/day.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/day.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -12,6 +12,7 @@
 #include <boost/cstdint.hpp>
 #include <boost/chrono/date/detail/bounded.hpp>
 #include <boost/chrono/date/detail/helpers.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 
 namespace boost
 {
@@ -67,6 +68,25 @@
         base_type(v, check)
       {
       }
+
+      /**
+       * @Effects Constructs an object of class day by storing y.
+       * @Postconditions <c>static_cast<rep>(*this) == v.value()</c>.
+       */
+      BOOST_FORCEINLINE BOOST_CONSTEXPR day(nth_1_5_tag v) :
+        base_type(v.value(), no_check)
+      {
+      }
+
+      /**
+       * @Effects Constructs an object of class day by storing y.
+       * @Postconditions <c>static_cast<rep>(*this) == v.value()</c>.
+       */
+      BOOST_FORCEINLINE BOOST_CONSTEXPR day(nth_6_31_tag v) :
+        base_type(v.value(), no_check)
+      {
+      }
+
       /**
        * @Effects Constructs an object of class day by storing y.
        * @Postconditions <c>static_cast<rep>(*this) == v.value()</c>.
Modified: sandbox/chrono_date/boost/chrono/date/include.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/include.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/include.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -17,7 +17,7 @@
 #include <boost/chrono/date/month_nth.hpp>
 #include <boost/chrono/date/month_nth_weekday.hpp>
 #include <boost/chrono/date/week.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 #include <boost/chrono/date/nth_week.hpp>
 #include <boost/chrono/date/nth_weekday.hpp>
 #include <boost/chrono/date/weekday.hpp>
Modified: sandbox/chrono_date/boost/chrono/date/month_nth.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/month_nth.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/month_nth.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -11,7 +11,7 @@
 
 #include <boost/cstdint.hpp>
 #include <boost/chrono/date/config.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 #include <boost/chrono/date/no_check.hpp>
 #include <boost/chrono/date/exceptions.hpp>
 #include <boost/chrono/date/detail/to_string.hpp>
@@ -29,31 +29,15 @@
     class month_nth
     {
       month m_; // :4
-      nth d_; // :6
     public:
       /**
        * @Effects Constructs an object of class @c month_nth by storing @c m and @c d.
-       * @Postconditions month() == m && nth() == d && is_valid().
-       * @Throws: if d is outside of the valid range of days of month @c m, throws an exception of type bad_date.
-       */
-      month_nth(month m, nth d, check_t)
-      : m_(m),
-      d_(d)
-      {
-        if (!(is_valid()))
-        {
-          throw_exception( bad_date("nth " + boost::chrono::to_string(int(d)) + "is out of range respect to month" + boost::chrono::to_string(m)) );
-        }
-      }
-      /**
-       * @Effects Constructs an object of class @c month_nth by storing @c m and @c d.
        * @Postconditions month() == m && nth() == d.
        * @Note This function doesn't check the parameters validity.
        * It is up to the user to provide the valid ones.
        */
-      BOOST_CONSTEXPR month_nth(month m, nth d) BOOST_NOEXCEPT
-      : m_(m),
-      d_(d)
+      BOOST_CONSTEXPR month_nth(month m, last_tag) BOOST_NOEXCEPT
+      : m_(m)
       {
       }
       /**
@@ -64,27 +48,20 @@
       {
         return m_;
       }
-      /**
-       * @Return the @c nth component.
-       */
-      //BOOST_CONSTEXPR nth nth() const BOOST_NOEXCEPT
-      BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::nth() const BOOST_NOEXCEPT
-      {
-        return d_;
-      }
+
       /**
        * @Return if the stored value is a valid one.
        */
       bool is_valid() const BOOST_NOEXCEPT
       {
-        return (m_.is_valid() && d_.is_valid() && d_<= days_in_month(1,m_));
+        return (m_.is_valid());
       }
     };
     /**
      * @Return a the @c month_nth with the associated parameters.
      * @Throws if d is outside of the valid range of days of month @c m, throws an exception of type bad_date.
      */
-    inline BOOST_CONSTEXPR month_nth operator/(chrono::month m, nth d)
+    inline BOOST_CONSTEXPR month_nth operator/(chrono::month m, last_tag d)
     BOOST_NOEXCEPT
     {
       return month_nth(m, d);
@@ -94,7 +71,7 @@
      * @Returns the @c month_nth with the associated parameters.
      * @Throws if @c d is outside of the valid range of days of month @c m, throws an exception of type bad_date.
      */
-    inline BOOST_CONSTEXPR month_nth operator/(nth d, chrono::month m)
+    inline BOOST_CONSTEXPR month_nth operator/(last_tag d, chrono::month m)
 BOOST_NOEXCEPT  {
     return month_nth(m, d);
   }
Modified: sandbox/chrono_date/boost/chrono/date/month_nth_weekday.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/month_nth_weekday.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/month_nth_weekday.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -13,7 +13,7 @@
 #include <boost/cstdint.hpp>
 #include <boost/chrono/date/config.hpp>
 #include <boost/chrono/date/no_check.hpp>
-#include <boost/chrono/date/nth.hpp>
+//#include <boost/chrono/date/nth.hpp>
 #include <boost/chrono/date/nth_week.hpp>
 #include <boost/chrono/date/nth_weekday.hpp>
 
@@ -92,68 +92,64 @@
     }
 
     /**
-     *
-     * The class dom is used to specify a small integral value that indicates the nth day of the month (example: last, 1st).
-     * valid from -32..31,
-     * 1..31 means the nth day of the month,
-     * 0 means last and
-     * -30..-1 means last but -nth.
-     * -32 means not_applicable
+     * The class @c month_nth_weekday is a tuple of @c month and @c nth_weekday that is useful when constructing dates.
      */
-    class dom
-    {
-    public:
-      typedef int_least8_t rep;
-      static const rep not_applicable=-31;
-
-      BOOST_CONSTEXPR dom(rep s) BOOST_NOEXCEPT : value_(s)
-      {
-      }
-      BOOST_CONSTEXPR rep value() const BOOST_NOEXCEPT
-      {
-        return value_;
-      }
-      BOOST_CONSTEXPR bool is_not_applicable() const BOOST_NOEXCEPT
-      {
-        return value_==not_applicable;
-      }
-    private:
-      rep value_; // :6 bits
-    };
-
-    class month_dom
+    class month_last_weekday
     {
       month m_; // :4
-      dom d_; // :6
+      last_weekday d_; // :6
     public:
-      BOOST_CONSTEXPR month_dom(month m, dom d) BOOST_NOEXCEPT
+      /**
+       * @Effects Constructs an object of class @c month_last_weekday by storing @c m and @c nwd.
+       * @Postconditions month() == m && last_weekday() == nwd.
+       * @Note This function doesn't check the parameters validity.
+       * It is up to the user to provide a valid ones.
+       */
+      BOOST_CONSTEXPR month_last_weekday(month::rep m, last_weekday d) BOOST_NOEXCEPT
       : m_(m),
       d_(d)
       {
       }
+      /**
+       * @Return the @c month component.
+       */
       //month month() const BOOST_NOEXCEPT
       BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::month() const BOOST_NOEXCEPT
       {
         return m_;
       }
-      //BOOST_CONSTEXPR dom dom() const BOOST_NOEXCEPT
-      BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::dom() const BOOST_NOEXCEPT
+      /**
+       * @Return the @c last_weekday component.
+       */
+      //BOOST_CONSTEXPR last_weekday last_weekday() const BOOST_NOEXCEPT
+      BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::last_weekday() const BOOST_NOEXCEPT
       {
         return d_;
       }
+      /**
+       * @Return if the stored value is a valid one.
+       */
+      BOOST_CONSTEXPR  bool is_valid() const BOOST_NOEXCEPT
+      {
+        return ( m_.is_valid() &&  d_.is_valid() );
+      }
     };
 
-    inline BOOST_CONSTEXPR month_dom operator/(month m, dom d) BOOST_NOEXCEPT
+    /**
+     * @return a @c month_last_weekday build with the given parameters.
+     */
+    inline BOOST_CONSTEXPR month_last_weekday operator/(month m, last_weekday d) BOOST_NOEXCEPT
     {
-      return month_dom(m, d);
+      return month_last_weekday(m, d);
     }
-    inline BOOST_CONSTEXPR month_dom operator/(dom d, month m) BOOST_NOEXCEPT
+    /**
+     * @return a @c month_last_weekday build with the given parameters.
+     */
+    inline BOOST_CONSTEXPR month_last_weekday operator/(last_weekday d, month m) BOOST_NOEXCEPT
     {
-      return month_dom(m, d);
+      return month_last_weekday(m, d);
     }
 
-
-
   } // chrono
 
 } // boost
Added: sandbox/chrono_date/boost/chrono/date/nth_tag.hpp
==============================================================================
--- (empty file)
+++ sandbox/chrono_date/boost/chrono/date/nth_tag.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -0,0 +1,62 @@
+//  date
+//
+//  (C) Copyright Howard Hinnant
+//  Copyright 2011 Vicente J. Botet Escriba
+//  Use, modification and distribution are subject to the Boost Software License,
+//  Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt).
+
+#ifndef BOOST_CHRONO_DATE_NTH_TAG_HPP
+#define BOOST_CHRONO_DATE_NTH_TAG_HPP
+
+#include <boost/chrono/date/config.hpp>
+
+namespace boost
+{
+  namespace chrono
+  {
+
+    struct last_tag {};
+    BOOST_CONSTEXPR_OR_CONST last_tag last = {};
+
+    /**
+     * nth 1..5 tag
+     */
+    struct nth_1_5_tag
+    {
+      const int value_;
+      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_1_5_tag(int v) BOOST_NOEXCEPT
+      : value_(v)
+      {}
+      BOOST_FORCEINLINE BOOST_CONSTEXPR int value() BOOST_NOEXCEPT {return value_;};
+    };
+    /**
+     * nth 6..31 tag
+     */
+    struct nth_6_31_tag
+    {
+      const int value_;
+      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_6_31_tag(int v) BOOST_NOEXCEPT
+      : value_(v)
+      {}
+      BOOST_FORCEINLINE BOOST_CONSTEXPR int value() BOOST_NOEXCEPT {return value_;};
+
+    };
+    //BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_tag, last, 0);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_1_5_tag, _1st, 1);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_1_5_tag, _2nd, 2);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_1_5_tag, _3rd, 3);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_1_5_tag, _4th, 4);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_1_5_tag, _5th, 5);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _6th, 6);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _7th, 7);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _8th, 8);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _9th, 9);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _10th, 10);
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DCL(nth_6_31_tag, _29th, 29);
+
+  } // chrono
+
+} // boost
+
+#endif  // header
Modified: sandbox/chrono_date/boost/chrono/date/nth_week.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/nth_week.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/nth_week.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -12,7 +12,7 @@
 
 #include <boost/cstdint.hpp>
 #include <boost/chrono/date/detail/bounded.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 
 namespace boost
 {
@@ -25,16 +25,13 @@
 
     /**
      * The class nth_week is used to specify a small integral value that indicates the nth week of the month
-     * (example: last_week, 1st_week).  Its range is [1,6].
+     * (example: last_week, 1st_week).  Its range is [1,5].
      */
-    class nth_week : public bounded<nth_week_tag, 1, 6, int_least8_t>
+    class nth_week : public bounded<nth_week_tag, 1, 5, int_least8_t>
     {
-      typedef bounded<nth_week_tag, 1, 6, int_least8_t> base_type;
+      typedef bounded<nth_week_tag, 1, 5, int_least8_t> base_type;
 
     public:
-      BOOST_STATIC_CONSTEXPR rep not_applicable=7;
-      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_week() : base_type(not_applicable) {}
-
       /**
        * @Effects Constructs an object of class @c nth_week by storing @c s.
        * Throws: if @c s is outside of the range [1, 6], throws an exception of type bad_date.
@@ -49,14 +46,9 @@
       BOOST_FORCEINLINE BOOST_CONSTEXPR nth_week(int s) BOOST_NOEXCEPT
           : base_type(s)
       {}
-      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_week(nth_tag s) BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_week(nth_1_5_tag s) BOOST_NOEXCEPT
           : base_type(s.value_)
       {}
-
-      BOOST_FORCEINLINE BOOST_CONSTEXPR bool is_not_applicable() const BOOST_NOEXCEPT
-      {
-        return value()==not_applicable;
-      }
     };
 
   } // chrono
Modified: sandbox/chrono_date/boost/chrono/date/nth_weekday.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/nth_weekday.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/nth_weekday.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -11,8 +11,7 @@
 
 
 #include <boost/cstdint.hpp>
-#include <boost/chrono/config.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/config.hpp>
 #include <boost/chrono/date/nth_week.hpp>
 #include <boost/chrono/date/weekday.hpp>
 #include <boost/chrono/date/no_check.hpp>
@@ -36,7 +35,7 @@
        * @param dow the day of the year
        * @Effects Constructs a pair of nth-weekday.
        */
-      BOOST_CONSTEXPR nth_weekday(nth_week n, weekday dow, check_t) BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_weekday(nth_week n, weekday dow, check_t) BOOST_NOEXCEPT
       :
       n_(n, check),
       dow_(dow, check)
@@ -51,7 +50,7 @@
        * @Note This function doesn't check the parameters validity.
        * It is up to the user to provide a valid ones.
        */
-      BOOST_CONSTEXPR nth_weekday(nth_week n, weekday dow) BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CONSTEXPR nth_weekday(nth_week n, weekday dow) BOOST_NOEXCEPT
       :
       n_(n),
       dow_(dow)
@@ -61,7 +60,7 @@
       /**
        * @Return if the stored value is a valid one.
        */
-      BOOST_CONSTEXPR bool is_valid() const BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CONSTEXPR bool is_valid() const BOOST_NOEXCEPT
       {
         return (n_.is_valid() && dow_.is_valid());
       }
@@ -69,7 +68,7 @@
        * @Return The nth stored component.
        */
       //BOOST_CONSTEXPR nth_week nth_week() const BOOST_NOEXCEPT
-      BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::nth_week() const BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::nth_week() const BOOST_NOEXCEPT
       {
         return n_;
       }
@@ -77,7 +76,54 @@
        * @Return The weekday stored component.
        */
       //BOOST_CONSTEXPR weekday weekday() const BOOST_NOEXCEPT
-      BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::weekday() const BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::weekday() const BOOST_NOEXCEPT
+      {
+        return dow_;
+      }
+    };
+
+    class last_weekday
+    {
+      weekday dow_; // :3
+
+    public:
+      /**
+       * @param n the nth week
+       * @param dow the day of the year
+       * @Effects Constructs a pair of nth-weekday.
+       */
+      BOOST_FORCEINLINE BOOST_CONSTEXPR last_weekday(weekday dow, check_t) BOOST_NOEXCEPT
+      :
+      dow_(dow, check)
+      {
+        // No invalid condition
+      }
+      /**
+       * @param n the nth week
+       * @param dow the day of the year
+       * @param tag to state that no check is performed.
+       * @Effects Constructs a pair of nth-weekday.
+       * @Note This function doesn't check the parameters validity.
+       * It is up to the user to provide a valid ones.
+       */
+      BOOST_FORCEINLINE BOOST_CONSTEXPR last_weekday(weekday dow) BOOST_NOEXCEPT
+      :
+      dow_(dow)
+      {
+      }
+
+      /**
+       * @Return if the stored value is a valid one.
+       */
+      BOOST_FORCEINLINE BOOST_CONSTEXPR bool is_valid() const BOOST_NOEXCEPT
+      {
+        return (dow_.is_valid());
+      }
+      /**
+       * @Return The weekday stored component.
+       */
+      //BOOST_CONSTEXPR weekday weekday() const BOOST_NOEXCEPT
+      BOOST_FORCEINLINE BOOST_CHRONO_EXPLICIT BOOST_CONSTEXPR operator chrono::weekday() const BOOST_NOEXCEPT
       {
         return dow_;
       }
@@ -89,21 +135,25 @@
      * @param wd the weekday
      * @return a nth_weekday with the given parameters
      */
-    inline BOOST_CONSTEXPR nth_weekday operator*(nth_week nw, weekday wd) BOOST_NOEXCEPT
+    BOOST_FORCEINLINE BOOST_CONSTEXPR nth_weekday operator*(nth_week nw, weekday wd) BOOST_NOEXCEPT
     {
       return nth_weekday(nw, wd);
     }
+    BOOST_FORCEINLINE BOOST_CONSTEXPR last_weekday operator*(last_tag, weekday wd) BOOST_NOEXCEPT
+    {
+      return last_weekday(wd);
+    }
 
     /**
      * nth_weekday pseudo-literals.
      */
-    extern const nth_weekday last_sun;
-    extern const nth_weekday last_mon;
-    extern const nth_weekday last_tue;
-    extern const nth_weekday last_wed;
-    extern const nth_weekday last_thu;
-    extern const nth_weekday last_fri;
-    extern const nth_weekday last_sat;
+    extern const last_weekday last_sun;
+    extern const last_weekday last_mon;
+    extern const last_weekday last_tue;
+    extern const last_weekday last_wed;
+    extern const last_weekday last_thu;
+    extern const last_weekday last_fri;
+    extern const last_weekday last_sat;
     extern const nth_weekday _1st_sun;
     extern const nth_weekday _1st_mon;
     extern const nth_weekday _1st_tue;
Modified: sandbox/chrono_date/boost/chrono/date/relative_date.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/relative_date.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/relative_date.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -18,7 +18,7 @@
 #include <boost/chrono/date/month_nth_weekday.hpp>
 #include <boost/chrono/date/month_nth.hpp>
 #include <boost/chrono/date/nth_week.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 #include <boost/chrono/date/days_date.hpp>
 #include <boost/chrono/date/ymd_date.hpp>
 #include <boost/chrono/date/ydoy_date.hpp>
@@ -77,8 +77,12 @@
       rel_date() BOOST_NOEXCEPT;
       rel_date(chrono::year, chrono::month, nth_weekday);
       rel_date(chrono::year, chrono::month, nth_weekday, check_t) BOOST_NOEXCEPT;
-      rel_date(chrono::year, chrono::month, nth);
-      rel_date(chrono::year, chrono::month, nth, check_t)BOOST_NOEXCEPT;
+      rel_date(chrono::year, chrono::month, last_weekday);
+      rel_date(chrono::year, chrono::month, last_weekday, check_t) BOOST_NOEXCEPT;
+      rel_date(chrono::year, chrono::month_nth);
+      rel_date(chrono::year, chrono::month_nth, check_t)BOOST_NOEXCEPT;
+      rel_date(chrono::year, chrono::month, last_tag);
+      rel_date(chrono::year, chrono::month, last_tag, check_t)BOOST_NOEXCEPT;
 #if BOOST_CHRONO_DATE_REL_DATE_IS_A_MODEL_OF_DATE
       rel_date(chrono::year, chrono::month, chrono::day); // TODO
       rel_date(chrono::year, chrono::month, chrono::day, check_t)BOOST_NOEXCEPT;// TODO
@@ -354,24 +358,36 @@
     {
       return rel_date(year(ym), month(ym), d);
     }
-    inline rel_date operator/(year_month ym, nth d)
+    inline rel_date operator/(year_month ym, last_weekday d)
     {
       return rel_date(year(ym), month(ym), d);
     }
+    inline rel_date operator/(year_month ym, last_tag)
+    {
+      return rel_date(year(ym), month(ym), last);
+    }
 
     inline rel_date operator/(month_nth_weekday md, chrono::year y)
     {
       return rel_date(y, month(md), nth_weekday(md));
     }
+    inline rel_date operator/(month_last_weekday md, chrono::year y)
+    {
+      return rel_date(y, month(md), last_weekday(md));
+    }
 
     inline rel_date operator/(month_nth_weekday md, year::rep y)
     {
       return md / chrono::year(y);
     }
+    inline rel_date operator/(month_last_weekday md, year::rep y)
+    {
+      return md / chrono::year(y);
+    }
 
     inline rel_date operator/(month_nth md, chrono::year y)
     {
-      return rel_date(y, month(md), nth(md));
+      return rel_date(y, month(md), last);
     }
 
     inline rel_date operator/(month_nth md, year::rep y)
Modified: sandbox/chrono_date/boost/chrono/date/tuples.hpp
==============================================================================
--- sandbox/chrono_date/boost/chrono/date/tuples.hpp	(original)
+++ sandbox/chrono_date/boost/chrono/date/tuples.hpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -17,7 +17,7 @@
 #include <boost/chrono/date/day.hpp>
 #include <boost/chrono/date/day_of_year.hpp>
 #include <boost/chrono/date/week.hpp>
-#include <boost/chrono/date/nth.hpp>
+#include <boost/chrono/date/nth_tag.hpp>
 #include <boost/chrono/date/detail/helpers.hpp>
 
 namespace boost
Modified: sandbox/chrono_date/libs/date/example/hello_world.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/example/hello_world.cpp	(original)
+++ sandbox/chrono_date/libs/date/example/hello_world.cpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -22,14 +22,14 @@
     typedef boost::chrono::high_resolution_clock Clock;
     typedef boost::chrono::duration<double,boost::micro> micros;
 
-    std::cout << jan/day(2)/2011 << '\n';  // 2011-01-02
-    std::cout << month(1)/day(2)/2011 << '\n';  // 2011-01-02
-    std::cout << date(year(2011),jan,day(2)) << '\n';  // 2011-01-02
+    std::cout << jan/_2nd/2011 << '\n';  // 2011-01-02
+    std::cout << month(1)/_2nd/2011 << '\n';  // 2011-01-02
+    std::cout << date(year(2011),jan,_2nd) << '\n';  // 2011-01-02
     std::cout << '\n';
 
-    std::cout << jan/day(1)/2011 << '\n';  // 2011-01-02
-    std::cout << jan/day(2)/2011 << '\n';  // 2011-01-02
-    std::cout << feb/day(1)/2011 << '\n';  // 2011-01-02
+    std::cout << jan/_1st/2011 << '\n';  // 2011-01-02
+    std::cout << jan/_2nd/2011 << '\n';  // 2011-01-02
+    std::cout << feb/_1st/2011 << '\n';  // 2011-01-02
 
     // Print Feb. 28 for each year in the decade
     for (ymd_date d = feb/day(28)/2010, e = feb/day(28)/2020; d <= e; d += years(1))
@@ -52,7 +52,7 @@
 
     {
     // How many days between may/1/2011 and jan/1/2011?
-    std::cout <<"How many days between may/1/2011 and jan/1/2011? "<<  days_date(may/day(01)/2011) - jan/day(01)/2011 << '\n';  // x == 120
+    std::cout <<"How many days between may/1/2011 and jan/1/2011? "<<  days_date(may/_1st/2011) - jan/_1st/2011 << '\n';  // x == 120
 
     std::cout << '\n';
     }
@@ -71,7 +71,7 @@
     date dt = aug/day(16)/2011;
     // ...
     // Create date with the same month and year but on the 5th
-    date dt2 = year_month(dt)/day(5, no_check);  // aug/5/2011
+    date dt2 = year_month(dt)/_5th;  // aug/5/2011
     (void)dt2;
     int d = day(dt);   // d == 5
     int m = month(dt); // m == 8
@@ -134,7 +134,7 @@
 
     {
 //      int num_fri_in_may = (_fri[last]/may/2011).day() > 28 ? 5 : 4;  // 4
-      int num_fri_in_may = day(last*fri/may/2011) > 28 ? 5 : 4;  // 4
+      int num_fri_in_may = (day(_1st*fri/may/2011) > 28) ? 5 : 4;  // 4
       std::cout <<"Number of fridays in May"<< num_fri_in_may << '\n';
 
 //      date d1 = rel_weekday(5)[_1st]/may/2011;
@@ -160,9 +160,9 @@
 //    }
 
     {
-      rel_date d1 =  jan/_2nd/2011;          // jan/2/2011
-      rel_date d2 =  year(2011)/jan/_2nd;    // jan/2/2011
-      rel_date d3 =  _2nd/jan/2011;          // jan/2/2011
+      ymd_date d1 =  jan/_2nd/2011;          // jan/2/2011
+      ymd_date d2 =  year(2011)/jan/_2nd;    // jan/2/2011
+      ymd_date d3 =  _2nd/jan/2011;          // jan/2/2011
 
       std::cout << d1 << '\n';
       std::cout << d2 << '\n';
@@ -187,7 +187,7 @@
       for (rel_date d = last/jan/2011, e = last/dec/2011; d <= e; d += months(1))
       {
           if (day(d) >= 29)
-              std::cout << year(d)/month(d)/day(29,no_check) << '\n';
+              std::cout << year(d)/month(d)/_29th << '\n';
       }
     }
     {
@@ -221,10 +221,9 @@
       std::cout << dt2 << '\n';
     }
     {
-      ymd_date ISO_week_start(mon <= jan/day(4)/2012);
+      ymd_date ISO_week_start(mon <= jan/_4th/2012);
       std::cout << "ISO_week_start " << ISO_week_start << '\n';
     }
-
     {
       // How many weeks until Christmas?
       days_date dt = dec/day(25)/2011;
@@ -244,7 +243,7 @@
     {
       std::cout << __FILE__<<"["<<__LINE__ <<"] "<< "How many days until next 28th?" << '\n';
       // How many days until next 28th?
-      days d=days_date(nth(5)>date::today()) - date::today();
+      days d=days_date(_5th>date::today()) - date::today();
       std::cout << d << '\n';
     }
     {
Modified: sandbox/chrono_date/libs/date/src/rel_date.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/src/rel_date.cpp	(original)
+++ sandbox/chrono_date/libs/date/src/rel_date.cpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -23,88 +23,37 @@
   namespace chrono
   {
 
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date()
-    BOOST_NOEXCEPT
-    : x_(11979588),
-    y_(0),
-    m_(1),
-    leap_(1),
-    dow_(weekday::not_applicable),
-    d_(1),
-    n_(nth_week::not_applicable)
-    {
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date()
-    BOOST_NOEXCEPT
-    : x_(11979588),
-    n_(nth_week::not_applicable),
-    dow_(weekday::not_applicable)
-    {
+    namespace detail {
+      struct weekday
+      {
+            BOOST_STATIC_CONSTEXPR int not_applicable=7;
+      };
+      struct nth_week
+      {
+        BOOST_STATIC_CONSTEXPR int not_applicable=7;
+      };
     }
 
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     rel_date::rel_date() BOOST_NOEXCEPT
     : y_(0),
     m_(1),
     leap_(1),
-    dow_(weekday::not_applicable),
+    dow_(detail::weekday::not_applicable),
     d_(1),
-    n_(nth_week::not_applicable)
+    n_(detail::nth_week::not_applicable)
     {
     }
 
-#endif
 #if BOOST_CHRONO_DATE_REL_DATE_IS_A_MODEL_OF_DATE
 
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(chrono::year y, chrono::month m, day d)
-    :
-    y_(y),
-    m_(m),
-    leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
-    d_(d),
-    n_(nth_week::not_applicable)
-    {
-      const day_of_year::rep* year_data = days_in_year_before(leap_);
-      if (!(d <= year_data[m] - year_data[m - 1]))
-      {
-        return throw bad_date("");
-      }
-      year::rep by = y.value() + 32799;
-      x_ = days_before_year(by) + year_data[m - 1] + d;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(chrono::year y, chrono::month m, day d)
-    {
-      bool leap = is_leap(y);
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      if (!(d <= year_data[m] - year_data[m - 1]))
-      {
-        return throw bad_date("");
-      }
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[m - 1] + d;
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     rel_date::rel_date(chrono::year y, chrono::month m, day d)
     :
     y_(y),
     m_(m),
     leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
+    dow_(detail::weekday::not_applicable),
     d_(d),
-    n_(nth_week::not_applicable)
+    n_(detail::nth_week::not_applicable)
     {
       const day_of_year::rep* year_data = days_in_year_before(leap_);
       if (!(d <= year_data[m] - year_data[m - 1]))
@@ -113,89 +62,26 @@
       }
 
     }
-#endif
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(year y, chrono::month m, day d) BOOST_NOEXCEPT
-    :
-    y_(y),
-    m_(m),
-    leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
-    d_(d),
-    n_(nth_week::not_applicable)
-    {
-      const day_of_year::rep* year_data = days_in_year_before(leap_);
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[m - 1] + d;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(chrono::year y, chrono::month m, day d)BOOST_NOEXCEPT
-    {
-      bool leap = is_leap(y);
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[m - 1] + d;
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
     rel_date::rel_date(chrono::year y, chrono::month m, day d)BOOST_NOEXCEPT
     :
     y_(y),
     m_(m),
     leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
+    dow_(detail::weekday::not_applicable),
     d_(d),
-    n_(nth_week::not_applicable)
-    {
-    }
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(chrono::year y, chrono::month_day md, check_t)
-    :
-    y_(y),
-    m_(month(md)),
-    leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
-    d_(day(md)),
-    n_(nth_week::not_applicable)
-    {
-      const day_of_year::rep* year_data = days_in_year_before(leap_);
-      if (!(day(md) <= year_data[month(md)] - year_data[month(md) - 1]))
-      {
-        return throw bad_date("");
-      }
-      year::rep by = y.value() + 32799;
-      x_ = days_before_year(by) + year_data[month(md) - 1] + day(md);
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(chrono::year y, chrono::month_day md, check_t)
+    n_(detail::nth_week::not_applicable)
     {
-      bool leap = is_leap(y);
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      if (!(day(md) <= year_data[month(md)] - year_data[month(md) - 1]))
-      {
-        return throw bad_date("");
-      }
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[month(md) - 1] + day(md);
     }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
     rel_date::rel_date(chrono::year y, chrono::month_day md, check_t)
     :
     y_(y),
     m_(month(md)),
     leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
+    dow_(detail::weekday::not_applicable),
     d_(day(md)),
-    n_(nth_week::not_applicable)
+    n_(detail::nth_week::not_applicable)
     {
       const day_of_year::rep* year_data = days_in_year_before(leap_);
       if (!(d_ <= year_data[m_] - year_data[m_ - 1]))
@@ -204,46 +90,17 @@
       }
 
     }
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(year::rep y, chrono::month_day md)
-    BOOST_NOEXCEPT    :
-    y_(y),
-    m_(month(md)),
-    leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
-    d_(day(md)),
-    n_(nth_week::not_applicable)
-    {
-      const day_of_year::rep* year_data = days_in_year_before(leap_);
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[month(md) - 1] + day(md);
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(year::rep y, chrono::month_day md)
-    BOOST_NOEXCEPT    {
-      bool leap = is_leap(y);
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      year::rep by = y + 32799;
-      x_ = days_before_year(by) + year_data[month(md) - 1] + day(md);
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
     rel_date::rel_date(year::rep y, chrono::month_day md)
     BOOST_NOEXCEPT    :
     y_(y),
     m_(month(md)),
     leap_(is_leap(y)),
-    dow_(weekday::not_applicable),
+    dow_(detail::weekday::not_applicable),
     d_(day(md)),
-    n_(nth_week::not_applicable)
+    n_(detail::nth_week::not_applicable)
     {
     }
-#endif
 
     rel_date::rel_date(days d)
     {
@@ -261,26 +118,7 @@
           + to_string(y) );
     }
 
-//#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-//
-//    rel_date::rel_date(year::rep y, day_of_year::rep d) // TODO
-//    BOOST_NOEXCEPT
-//    {
-//
-//    }
-//
-//
-//
-//#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-//
-//    rel_date::rel_date(year::rep y, day_of_year::rep d)// TODO
-//    BOOST_NOEXCEPT
-//    {
-//
-//    }
-//
-//
-//#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
+
 //
 //    rel_date::rel_date(year::rep y, day_of_year::rep d)// TODO
 //    BOOST_NOEXCEPT
@@ -289,50 +127,6 @@
 //    }
 //
 //
-//#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    bool rel_date::set_if_valid_date(chrono::year y, chrono::month m, day d) BOOST_NOEXCEPT
-    {
-      bool leap = is_leap(y);
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-
-      if (!(d <= year_data[m] - year_data[m - 1]))
-      {
-        return false;
-      }
-      y_ = y.value();
-      m_ = m.value();
-      d_ = d.value();
-      leap_ = leap;
-      year::rep by = y.value() + 32799;
-      x_ = days_before_year(by) + year_data[m - 1] + d;
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return true;
-    }
-
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    bool rel_date::set_if_valid_date(chrono::year y, chrono::month m, day d) BOOST_NOEXCEPT
-    {
-      bool leap = is_leap(y.value());
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-
-      if (!(d.value() <= year_data[m.value()] - year_data[m.value()-1]))
-      {
-        return false;
-      }
-      year::rep by = y.value() + 32799;
-      x_ = days_before_year(by) + year_data[m.value()-1] + d.value();
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return true;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
     bool rel_date::set_if_valid_date(chrono::year y, chrono::month m, day d) BOOST_NOEXCEPT
     {
@@ -347,45 +141,11 @@
       m_ = m.value();
       d_ = d.value();
       leap_ = leap;
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
+      dow_=detail::weekday::not_applicable;
+      n_=detail::nth_week::not_applicable;
       return true;
     }
 
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    bool rel_date::set_if_valid_date(chrono::year y, day_of_year doy) BOOST_NOEXCEPT
-
-    {
-      bool leap = is_leap(y);
-      if (!leap && doy == 366)
-         return false;
-
-      y_ = y.value();
-      m_ = day_of_year_month(leap,doy);
-      d_ = day_of_year_day_of_month(leap,doy);
-      leap_ = leap;
-      year::rep by = y.value() + 32799;
-      x_ = days_before_year(by) + doy -1;
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return true;
-    }
-
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    bool rel_date::set_if_valid_date(chrono::year y, day_of_year doy) BOOST_NOEXCEPT// TODO
-    {
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return false;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     bool rel_date::set_if_valid_date(year y, day_of_year doy) BOOST_NOEXCEPT
     {
       bool leap = is_leap(y);
@@ -396,45 +156,11 @@
       m_ = day_of_year_month(leap,doy);
       d_ = day_of_year_day_of_month(leap,doy);
       leap_ = leap;
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return true;
-    }
-
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    bool rel_date::set_if_valid_date(days x) BOOST_NOEXCEPT
-    {
-      if (!(11322 <= x.count() && x.count() <= 23947853))
-      {
-        return false;
-      }
-      year_month_day_leap dt = to_ymd_leap(x);
-      y_=year(dt);
-      m_=month(dt);
-      d_=day(dt);
-      leap_=dt.is_leap_year();
-      x_=x.count();
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
+      dow_=detail::weekday::not_applicable;
+      n_=detail::nth_week::not_applicable;
       return true;
-
-    }
-
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    bool rel_date::set_if_valid_date(days x) BOOST_NOEXCEPT// TODO
-    {
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
-      return false;
     }
 
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     bool rel_date::set_if_valid_date(days x) BOOST_NOEXCEPT
     {
       if (!(11322 <= x.count() && x.count() <= 23947853))
@@ -446,55 +172,32 @@
       m_=month(dt);
       d_=day(dt);
       leap_=dt.is_leap_year();
-      dow_=weekday::not_applicable;
-      n_=nth_week::not_applicable;
+      dow_=detail::weekday::not_applicable;
+      n_=detail::nth_week::not_applicable;
       return true;
 
     }
 
-#endif
-
-
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    bool rel_date::is_valid() const BOOST_NOEXCEPT
-    {
-      return x_ >= 11322 && x_ <= 23947853;
-
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    bool rel_date::is_valid() const
-    BOOST_NOEXCEPT
-    {
-      return x_ >= 11322 && x_ <= 23947853;
-
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     bool rel_date::is_valid() const BOOST_NOEXCEPT
     {
       if (chrono::year(y_).is_valid() && chrono::month(m_).is_valid())
       {
         if (d_!=0 && day(d_).is_valid()) {
-        const day_of_year::rep* year_data = days_in_year_before(leap_);
+          const day_of_year::rep* year_data = days_in_year_before(leap_);
 
-        if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
-        {
-          return false;
-        }
-        else
-        {
-          return true;
-        }
+          if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
+          {
+            return false;
+          }
+          else
+          {
+            return true;
+          }
         } else return true;
       }
       return false;
 
     }
-#endif
 
     rel_date
     rel_date::today()
@@ -532,44 +235,13 @@
 
 #endif //BOOST_CHRONO_DATE_REL_DATE_IS_A_MODEL_OF_DATE
 
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-//    rel_date::rel_date(ymd_date dt) :
-//    x_(dt.days_since_epoch().count()),
-//    y_(year(dt).value()),
-//    m_(month(dt).value()),
-//    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
-//    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
-//    {
-//
-//    }
-    rel_date::operator ymd_date() const
-    {
-      return ymd_date(x_, y_, m_, d_, leap_);
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-//    rel_date::rel_date(ymd_date dt) :
-//      x_(dt.days_since_epoch().count())
-//    {
-//
-//    }
-    rel_date::operator ymd_date() const
-    {
-      return days_date(x_);
-
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
 //    rel_date::rel_date(ymd_date dt) :
 //    y_(year(dt).value()),
 //    m_(month(dt).value()),
 //    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
+//    dow_(detail::weekday::not_applicable),
 //    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
+//    n_(detail::nth_week::not_applicable)
 //    {
 //
 //    }
@@ -578,659 +250,125 @@
       return ymd_date(y_,m_,d_,leap_);
 
     }
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
 
 //    rel_date::rel_date(days_date dt) :
-//    x_(dt.days_since_epoch().count()),
 //    y_(year(dt).value()),
 //    m_(month(dt).value()),
 //    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
+//    dow_(detail::weekday::not_applicable),
 //    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
-//    {
-//
-//    }
-    rel_date::operator days_date() const
-    {
-      return days_date(x_);
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-//    rel_date::rel_date(days_date dt) :
-//      x_(dt.days_since_epoch().count())
+//    n_(detail::nth_week::not_applicable)
 //    {
 //
 //    }
     rel_date::operator days_date() const
     {
-      return days_date(x_);
+      // @todo improve this
+      return days_date(ymd_date(y_,m_,d_,leap_));
 
     }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
-//    rel_date::rel_date(days_date dt) :
+//    rel_date::rel_date(ydoy_date dt) :
 //    y_(year(dt).value()),
 //    m_(month(dt).value()),
 //    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
+//    dow_(detail::weekday::not_applicable),
 //    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
+//    n_(detail::nth_week::not_applicable)
 //    {
 //
 //    }
-    rel_date::operator days_date() const
+    rel_date::operator ydoy_date() const
     {
       // @todo improve this
-      return days_date(ymd_date(y_,m_,d_,leap_));
+      return ydoy_date(ymd_date(y_,m_,d_,leap_));
 
     }
-#endif
 
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-//    rel_date::rel_date(ydoy_date dt) :
-//    x_(dt.days_since_epoch().count()),
-//    y_(year(dt).value()),
-//    m_(month(dt).value()),
-//    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
-//    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
-//    {
-//
-//    }
-    rel_date::operator ydoy_date() const
-    {
-      return date(x_, y_, m_, d_, leap_);
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-//    rel_date::rel_date(ydoy_date dt) :
-//      x_(dt.days_since_epoch().count())
-//    {
-//
-//    }
-    rel_date::operator ydoy_date() const
-    {
-      return date(x_);
-
-    }
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
-//    rel_date::rel_date(ydoy_date dt) :
-//    y_(year(dt).value()),
-//    m_(month(dt).value()),
-//    leap_(dt.is_leap_year()),
-//    dow_(weekday::not_applicable),
-//    d_(day(dt).value()),
-//    n_(nth_week::not_applicable)
-//    {
-//
-//    }
-    rel_date::operator ydoy_date() const
-    {
-      // @todo improve this
-      return ydoy_date(ymd_date(y_,m_,d_,leap_));
-
-    }
-#endif
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(chrono::year y, chrono::month m, nth_weekday d) :
-    y_(y.value()),
+    rel_date::rel_date(chrono::year y, chrono::month m, nth_weekday rd)
+    : y_(y.value()),
     m_(m.value()),
-    dow_(weekday(d)),
+    leap_(0),
+    dow_(weekday(rd)),
+    //d_(rd.d_),
     d_(0),
-    n_(nth_week(d))
+    n_(nth_week(rd))
     {
-      leap_ = chrono::year(y_).is_leap();
+      leap_ = chrono::year(y).is_leap();
       const day_of_year::rep* year_data = days_in_year_before(leap_);
-      if (n_ != nth_week::not_applicable) // if a nth is involved
-
       {
-        if (dow_ == weekday::not_applicable) // if we want nth day of month
 
+        // dow_ = [0 - 5] 0 means last
+        // n_ = [0 - 5] 0 means last
+        int32_t by = y.value() + 32799;
+        int32_t fy = by*365 + by/4 - by/100 + by/400;
+        int n_days_in_month = year_data[m_] - year_data[m_-1];
+        int d;
+        int fdow = (fy + year_data[m_-1] + 2) % weekday::size;
+        d = 1 + (n_-1) * weekday::size;
+        if (dow_ < fdow)
         {
-          if (n_ == last.value_) // want last day of month
-
-          {
-            d_ = year_data[m_] - year_data[m_ - 1];
-          }
-          else
-          {
-            d_ = n_; // want nth day of month
-          }
+          d += weekday::size - (fdow - dow_);
         }
-        else // we want nth weekday of month
-
+        else if (dow_ > fdow)
         {
-          // dow_ = [0 - 6]
-          // n_ = [1 - 6] 6 means last
-          int32_t by = y.value() + 32799;
-          int32_t fy = by * 365 + by / 4 - by / 100 + by / 400;
-          int n_days_in_month = year_data[m_] - year_data[m_ - 1];
-          int d;
-          if (n_ == last.value_)
-          {
-            int ldow = (fy + year_data[m_] + 1) % weekday::size;
-            d = n_days_in_month;
-            if (dow_ < ldow)
-            {
-              d -= ldow - dow_;
-            }
-            else if (dow_ > ldow)
-            {
-              d -= weekday::size - (dow_ - ldow);
-            }
-          }
-          else
-          {
-            int fdow = (fy + year_data[m_ - 1] + 2) % weekday::size;
-            d = 1 + (n_ - 1) * weekday::size;
-            if (dow_ < fdow)
-            {
-              d += weekday::size - (fdow - dow_);
-            }
-            else if (dow_ > fdow)
-            {
-              d += dow_ - fdow;
-            }
-            if (d > n_days_in_month)
-            {
-              throw bad_date("day " + to_string(d) + " is out of range for "
-                  + to_string(y_) + '-' + to_string(m_));
-            }
-          }
-          d_ = d;
-          x_ = fy + year_data[m_ - 1] + d_;
-          return;
+          d += dow_ - fdow;
         }
-      }
-      if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
-      {
-        throw bad_date("day " + to_string(d_) + " is out of range for "
-            + to_string(y_) + '-' + to_string(m_));
-      }
-      int32_t by = y.value() + 32799;
-      x_ = by * 365 + by / 4 - by / 100 + by / 400 + year_data[m_ - 1] + d_;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(year y, chrono::month m, nth_weekday nwd) :
-      n_(nth_week(nwd)), dow_(weekday(nwd))
-    {
-      bool leap = y.is_leap();
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      if (n_ != nth_week::not_applicable) // if a nth is involved
-
-      {
-        if (dow_ == weekday::not_applicable) // if we want nth day of month
-
+        if (d > n_days_in_month)
         {
-          int d;
-          if (n_ == last.value_) // want last day of month
-
-          {
-            d = year_data[m.value()] - year_data[m.value() - 1];
-          }
-          else
-          {
-            d = n_; // want nth day of month
-          }
-          if (!(1 <= d && d <= year_data[m.value()] - year_data[m.value() - 1]))
-          {
-            throw bad_date("day " + to_string(d) + " is out of range for "
-                + to_string(y.value()) + '-' + to_string(m.value()));
-          }
-          int32_t by = y.value() + 32799;
-          x_ = by * 365 + by / 4 - by / 100 + by / 400 + year_data[m.value()
-              - 1] + d;
-          return;
-        }
-        else // we want nth weekday of month
-
-        {
-          // dow_ = [0 - 6]
-          // n_ = [1 - 6] 6 means last
-          int32_t by = y.value() + 32799;
-          int32_t fy = by * 365 + by / 4 - by / 100 + by / 400;
-          int n_days_in_month = year_data[m.value()] - year_data[m.value() - 1];
-          int d;
-          if (n_ == last.value_)
-          {
-            int ldow = (fy + year_data[m.value()] + 1) % weekday::size;
-            d = n_days_in_month;
-            if (dow_ < ldow)
-            {
-              d -= ldow - dow_;
-            }
-            else if (dow_ > ldow)
-            {
-              d -= weekday::size - (dow_ - ldow);
-            }
-          }
-          else
-          {
-            int fdow = (fy + year_data[m.value() - 1] + 2) % weekday::size;
-            d = 1 + (n_ - 1) * weekday::size;
-            if (dow_ < fdow)
-            {
-              d += weekday::size - (fdow - dow_);
-            }
-            else if (dow_ > fdow)
-            {
-              d += dow_ - fdow;
-            }
-            if (d > n_days_in_month)
-            {
-              throw bad_date("day " + to_string(d) + " is out of range for "
-                  + to_string(y.value()) + '-' + to_string(m.value()));
-            }
-          }
-          x_ = fy + year_data[m.value() - 1] + d;
-          return;
+          throw bad_date("day " + to_string(int(d)) +
+              " is out of range for " + to_string(y_) +
+              '-' + to_string(int(m_)));
         }
+        d_ = d;
       }
-      //      if (!(1 <= d.d_ && d.d_ <= year_data[m.value()] - year_data[m.value()-1]))
-      //      {
-      //        throw bad_date("day " + to_string(d.d_) +
-      //            " is out of range for " + to_string(y.value()) +
-      //            '-' + to_string(m.value()));
-      //      }
-      //      int32_t by = y.value() + 32799;
-      //      x_ = by*365 + by/4 - by/100 + by/400 + year_data[m.value()-1] + d.d_;
     }
 
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
-    rel_date::rel_date(chrono::year y, chrono::month m, nth_weekday rd)
+    rel_date::rel_date(chrono::year y, chrono::month m, last_weekday rd)
     : y_(y.value()),
     m_(m.value()),
     leap_(0),
     dow_(weekday(rd)),
     //d_(rd.d_),
     d_(0),
-    n_(nth_week(rd))
+    n_(0)
     {
-      std::cout <<" =========== d= "<< int(d_) << std::endl;
-
       leap_ = chrono::year(y).is_leap();
       const day_of_year::rep* year_data = days_in_year_before(leap_);
-//      if (n_ != nth_week::not_applicable) // if a nth is involved
-
-      {
-//        if (dow_ == weekday::not_applicable) // if we want nth day of month
-//
-//        {
-//          if (n_ == last.value_) // want last day of month
-//
-//          {
-//            d_ = year_data[m_] - year_data[m_-1];
-//            std::cout <<"  =========== d= "<< int(d_) << std::endl;
-//          }
-//          else
-//          {
-//            d_ = n_; // want nth day of month
-//            std::cout <<"   =========== d= "<< int(d_) << std::endl;
-//          }
-//        }
-//        else // we want nth weekday of month
-
-        {
-          // dow_ = [0 - 5] 0 means last
-          // n_ = [0 - 5] 0 means last
-          int32_t by = y.value() + 32799;
-          int32_t fy = by*365 + by/4 - by/100 + by/400;
-          int n_days_in_month = year_data[m_] - year_data[m_-1];
-          int d;
-          if (n_ == last.value_)
-          {
-            int ldow = (fy + year_data[m_] + 1) % weekday::size;
-            d = n_days_in_month;
-            if (dow_ < ldow)
-            {
-              d -= ldow - dow_;
-            }
-            else if (dow_ > ldow)
-            {
-              d -= weekday::size - (dow_ - ldow);
-            }
-          }
-          else
-          {
-            int fdow = (fy + year_data[m_-1] + 2) % weekday::size;
-            d = 1 + (n_-1) * weekday::size;
-            if (dow_ < fdow)
-            {
-              d += weekday::size - (fdow - dow_);
-            }
-            else if (dow_ > fdow)
-            {
-              d += dow_ - fdow;
-            }
-            if (d > n_days_in_month)
-            {
-              throw bad_date("day " + to_string(int(d)) +
-                  " is out of range for " + to_string(y_) +
-                  '-' + to_string(int(m_)));
-            }
-          }
-          d_ = d;
-          std::cout <<"    =========== d= "<< int(d_) << std::endl;
-        }
-      }
-//      if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_-1]))
-//      {
-//        std::cout <<"===== ====== d= "<< int(d_) << std::endl;
-//        throw bad_date("day " + to_string(int(d_)) +
-//            " is out of range for " + to_string(y_) +
-//            '-' + to_string(int(m_)));
-//      }
-    }
-
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-
-    rel_date::rel_date(chrono::year y, chrono::month m, nth n) :
-    y_(y.value()),
-    m_(m.value()),
-    dow_(weekday::not_applicable),
-    d_(0),
-    n_(n.value())
-    {
-      leap_ = chrono::year(y_).is_leap();
-      const day_of_year::rep* year_data = days_in_year_before(leap_);
-      if (n_ != nth_week::not_applicable) // if a nth is involved
-
-      {
-        if (dow_ == weekday::not_applicable) // if we want nth day of month
-
-        {
-          if (n_ == last.value_) // want last day of month
-
-          {
-            d_ = year_data[m_] - year_data[m_ - 1];
-          }
-          else
-          {
-            d_ = n_; // want nth day of month
-          }
-        }
-        else // we want nth weekday of month
+      // dow_ = [0 - 5] 0 means last
+      // n_ = [0 - 5] 0 means last
+      int32_t by = y.value() + 32799;
+      int32_t fy = by*365 + by/4 - by/100 + by/400;
+      int n_days_in_month = year_data[m_] - year_data[m_-1];
+      int d;
 
-        {
-          // dow_ = [0 - 6]
-          // n_ = [1 - 6] 6 means last
-          int32_t by = y.value() + 32799;
-          int32_t fy = by * 365 + by / 4 - by / 100 + by / 400;
-          int n_days_in_month = year_data[m_] - year_data[m_ - 1];
-          int d;
-          if (n_ == last.value_)
-          {
-            int ldow = (fy + year_data[m_] + 1) % weekday::size;
-            d = n_days_in_month;
-            if (dow_ < ldow)
-            {
-              d -= ldow - dow_;
-            }
-            else if (dow_ > ldow)
-            {
-              d -= weekday::size - (dow_ - ldow);
-            }
-          }
-          else
-          {
-            int fdow = (fy + year_data[m_ - 1] + 2) % weekday::size;
-            d = 1 + (n_ - 1) * weekday::size;
-            if (dow_ < fdow)
-            {
-              d += weekday::size - (fdow - dow_);
-            }
-            else if (dow_ > fdow)
-            {
-              d += dow_ - fdow;
-            }
-            if (d > n_days_in_month)
-            {
-              throw bad_date("day " + to_string(d) + " is out of range for "
-                  + to_string(y_) + '-' + to_string(m_));
-            }
-          }
-          d_ = d;
-          x_ = fy + year_data[m_ - 1] + d_;
-          return;
-        }
-      }
-      if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_ - 1]))
+      int ldow = (fy + year_data[m_] + 1) % weekday::size;
+      d = n_days_in_month;
+      if (dow_ < ldow)
       {
-        throw bad_date("day " + to_string(d_) + " is out of range for "
-            + to_string(y_) + '-' + to_string(m_));
+        d -= ldow - dow_;
       }
-      int32_t by = y.value() + 32799;
-      x_ = by * 365 + by / 4 - by / 100 + by / 400 + year_data[m_ - 1] + d_;
-    }
-
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date::rel_date(chrono::year y, chrono::month m, nth n) :
-      n_(n.value()), dow_(weekday::not_applicable)
-    {
-      bool leap = y.is_leap();
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      if (n_ != nth_week::not_applicable) // if a nth is involved
-
+      else if (dow_ > ldow)
       {
-        if (dow_ == weekday::not_applicable) // if we want nth day of month
-
-        {
-          int d;
-          if (n_ == last.value_) // want last day of month
-
-          {
-            d = year_data[m.value()] - year_data[m.value() - 1];
-          }
-          else
-          {
-            d = n_; // want nth day of month
-          }
-          if (!(1 <= d && d <= year_data[m.value()] - year_data[m.value() - 1]))
-          {
-            throw bad_date("day " + to_string(d) + " is out of range for "
-                + to_string(y.value()) + '-' + to_string(m.value()));
-          }
-          int32_t by = y.value() + 32799;
-          x_ = by * 365 + by / 4 - by / 100 + by / 400 + year_data[m.value()
-              - 1] + d;
-          return;
-        }
-        else // we want nth weekday of month
-
-        {
-          // dow_ = [0 - 6]
-          // n_ = [1 - 6] 6 means last
-          int32_t by = y.value() + 32799;
-          int32_t fy = by * 365 + by / 4 - by / 100 + by / 400;
-          int n_days_in_month = year_data[m.value()] - year_data[m.value() - 1];
-          int d;
-          if (n_ == last.value_)
-          {
-            int ldow = (fy + year_data[m.value()] + 1) % weekday::size;
-            d = n_days_in_month;
-            if (dow_ < ldow)
-            {
-              d -= ldow - dow_;
-            }
-            else if (dow_ > ldow)
-            {
-              d -= weekday::size - (dow_ - ldow);
-            }
-          }
-          else
-          {
-            int fdow = (fy + year_data[m.value() - 1] + 2) % weekday::size;
-            d = 1 + (n_ - 1) * weekday::size;
-            if (dow_ < fdow)
-            {
-              d += weekday::size - (fdow - dow_);
-            }
-            else if (dow_ > fdow)
-            {
-              d += dow_ - fdow;
-            }
-            if (d > n_days_in_month)
-            {
-              throw bad_date("day " + to_string(d) + " is out of range for "
-                  + to_string(y.value()) + '-' + to_string(m.value()));
-            }
-          }
-          x_ = fy + year_data[m.value() - 1] + d;
-          return;
-        }
+        d -= weekday::size - (dow_ - ldow);
       }
-      //      if (!(1 <= d.d_ && d.d_ <= year_data[m.value()] - year_data[m.value()-1]))
-      //      {
-      //        throw bad_date("day " + to_string(d.d_) +
-      //            " is out of range for " + to_string(y.value()) +
-      //            '-' + to_string(m.value()));
-      //      }
-      //      int32_t by = y.value() + 32799;
-      //      x_ = by*365 + by/4 - by/100 + by/400 + year_data[m.value()-1] + d.d_;
+      d_ = d;
     }
 
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
-    rel_date::rel_date(chrono::year y, chrono::month m, nth n)
+    rel_date::rel_date(chrono::year y, chrono::month m, last_tag)
     : y_(y.value()),
     m_(m.value()),
     leap_(0),
-    dow_(weekday::not_applicable),
-    //d_(rd.d_),
+    dow_(detail::weekday::not_applicable),
     d_(0),
-    n_(n.value())
+    n_(0)
     {
       leap_ = y.is_leap();
       const day_of_year::rep* year_data = days_in_year_before(leap_);
-//      if (n_ != nth_week::not_applicable) // if a nth is involved
-
-      {
-//        if (dow_ == weekday::not_applicable) // if we want nth day of month
-
-        {
-          if (n_ == last.value_) // want last day of month
-
-          {
-            d_ = year_data[m_] - year_data[m_-1];
-          }
-          else
-          {
-            d_ = n_; // want nth day of month
-          }
-        }
-//        else // we want nth weekday of month
-//
-//        {
-//          // dow_ = [0 - 6]
-//          // n_ = [1 - 6] 6 means last
-//          int32_t by = y.value() + 32799;
-//          int32_t fy = by*365 + by/4 - by/100 + by/400;
-//          int n_days_in_month = year_data[m_] - year_data[m_-1];
-//          int d;
-//          if (n_ == last.value_)
-//          {
-//            int ldow = (fy + year_data[m_] + 1) % weekday::size;
-//            d = n_days_in_month;
-//            if (dow_ < ldow)
-//            {
-//              d -= ldow - dow_;
-//            }
-//            else if (dow_ > ldow)
-//            {
-//              d -= weekday::size - (dow_ - ldow);
-//            }
-//          }
-//          else
-//          {
-//            int fdow = (fy + year_data[m_-1] + 2) % weekday::size;
-//            d = 1 + (n_-1) * weekday::size;
-//            if (dow_ < fdow)
-//            {
-//              d += weekday::size - (fdow - dow_);
-//            }
-//            else if (dow_ > fdow)
-//            {
-//              d += dow_ - fdow;
-//            }
-//            if (d > n_days_in_month)
-//            {
-//              throw bad_date("day " + to_string(int(d)) +
-//                  " is out of range for " + to_string(y_) +
-//                  '-' + to_string(int(m_)));
-//            }
-//          }
-//          d_ = d;
-//        }
-      }
-//      if (!(1 <= d_ && d_ <= year_data[m_] - year_data[m_-1]))
-//      {
-//        throw bad_date("day " + to_string(int(d_)) +
-//            " is out of range for " + to_string(y_) +
-//            '-' + to_string(int(m_)));
-//      }
+      d_ = year_data[m_] - year_data[m_-1];
     }
 
-#endif
 
-//#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1
-//
-//    rel_date&
-//    rel_date::operator+=(days d)
-//    {
-//      x_ += d.count();
-//      if (!(11322 <= x_ && x_ <= 23947853))
-//      {
-//        throw bad_date("year is out of range [-32768, 32767]");
-//      }
-//      year::rep y = to_average_year(x_);
-//      int doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-//      if (doy < 0)
-//      {
-//        --y;
-//        doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-//      }
-//      y_ = static_cast<int16_t> (y - 32799);
-//      leap_ = year(y).is_leap();
-//      const day_of_year::rep* year_data = days_in_year_before(leap_);
-//      m_ = static_cast<uint16_t> (std::lower_bound(year_data, year_data + 13, doy)
-//          - year_data);
-//      d_ = static_cast<uint16_t> (doy - year_data[m_ - 1]);
-//      n_ = nth_week::not_applicable;
-//      dow_ = weekday::not_applicable;
-//      return *this;
-//    }
-//
-//#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-//
-//    rel_date&
-//    rel_date::operator+=(days d)
-//    {
-//      x_ += d.count();
-//      if (!(11322 <= x_ && x_ <= 23947853))
-//      {
-//        throw bad_date("year is out of range [-32768, 32767]");
-//      }
-//      n_ = nth_week::not_applicable;
-//      dow_ = weekday::not_applicable;
-//      return *this;
-//    }
-//
-//#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 //
 //    rel_date&
 //    rel_date::operator+=(days d)
@@ -1256,14 +394,11 @@
 //      d_ = static_cast<uint16_t>(doy - year_data[m_-1]);
 //
 //
-//      n_ = nth_week::not_applicable;
-//      dow_ = weekday::not_applicable;
+//      n_ = detail::nth_week::not_applicable;
+//      dow_ = detail::weekday::not_applicable;
 //      return *this;
 //    }
 //
-//#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 1 || BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
 
     rel_date&
     rel_date::operator+=(months mn)
@@ -1283,10 +418,13 @@
         y += dy;
         m -= 12 * dy;
       }
-      //if (d_==0)
+
+      if (dow_==detail::weekday::not_applicable)
+        *this = last/chrono::month(m)/y;
+      else if (n_==0)
+        *this = last_weekday(chrono::weekday(dow_)) / chrono::month(m) / y;
+      else
         *this = nth_weekday(nth_week(n_), chrono::weekday(dow_)) / chrono::month(m) / y;
-      //else
-        //*this = rel_date(year(y), chrono::month(m), day(d_));
       return *this;
     }
 
@@ -1301,130 +439,6 @@
 
     }
 
-#elif BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    rel_date&
-    rel_date::operator+=(months mn)
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-      }
-      y -= 32799;
-      bool leap = year(y).is_leap();
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      int m = std::lower_bound(year_data, year_data + 13, doy) - year_data;
-      m += mn.count();
-      if (m < 1)
-      {
-        int dy = (12 - m) / 12;
-        y -= dy;
-        m += 12 * dy;
-      }
-      else if (m > 12)
-      {
-        int dy = (m - 1) / 12;
-        y += dy;
-        m -= 12 * dy;
-      }
-      *this = nth_weekday(nth_week(n_), chrono::weekday(dow_))
-          / chrono::month(m) / y;
-      return *this;
-    }
-
-    rel_date&
-    rel_date::operator+=(years yr)
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y * 365 + y / 4 - y / 100 + y / 400);
-      }
-      y -= 32799;
-      bool leap = year(y).is_leap();
-      const day_of_year::rep* year_data = days_in_year_before(leap);
-      int m = std::lower_bound(year_data, year_data + 13, doy) - year_data;
-      *this = nth_weekday(nth_week(n_), chrono::weekday(dow_))
-          / chrono::month(m) / (y + yr.count());
-      return *this;
-    }
-
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 2
-
-    uint16_t
-    rel_date::day_from_day_number() const
-    BOOST_NOEXCEPT
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      }
-      y -= 32799;
-      const day_of_year::rep* year_data = days_in_year_before(chrono::year(y).is_leap());
-      int m = std::lower_bound(year_data, year_data+13, doy) - year_data;
-      return static_cast<uint16_t>(doy - year_data[m-1]);
-    }
-
-    uint16_t
-    rel_date::month_from_day_number() const
-    BOOST_NOEXCEPT
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      }
-      y -= 32799;
-      const day_of_year::rep* year_data = days_in_year_before(chrono::year(y).is_leap());
-      return std::lower_bound(year_data, year_data+13, doy) - year_data;
-    }
-
-    int16_t
-    rel_date::year_from_day_number() const
-    BOOST_NOEXCEPT
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      }
-      y -= 32799;
-      return static_cast<int16_t>(y);
-    }
-
-    bool
-    rel_date::leap_from_day_number() const
-    BOOST_NOEXCEPT
-    {
-      year::rep y = to_average_year(x_);
-      int doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      if (doy < 0)
-      {
-        --y;
-        doy = x_ - (y*365 + y/4 - y/100 + y/400);
-      }
-      y -= 32799;
-      return chrono::year(y).is_leap();
-    }
-
-#endif
-
-#if BOOST_CHRONO_DATE_REL_DATE_DESIGN == 3
-
     uint32_t
     rel_date::day_number_from_ymd() const BOOST_NOEXCEPT
     {
@@ -1433,8 +447,6 @@
       return by*365 + by/4 - by/100 + by/400 + year_data[m_-1] + d_;
     }
 
-#endif
-
     year_month_day to_ymd(year_week_weekday p)
     BOOST_NOEXCEPT
     {
@@ -1494,11 +506,10 @@
 
     }
 
-    year_week_weekday to_ywwd(days dt)
-BOOST_NOEXCEPT  {
-    return to_ywwd(to_ymd(dt));
-
-  }
+    year_week_weekday to_ywwd(days dt) BOOST_NOEXCEPT
+    {
+      return to_ywwd(to_ymd(dt));
+    }
 
 } // chrono
 } // boost
Modified: sandbox/chrono_date/libs/date/src/vars.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/src/vars.cpp	(original)
+++ sandbox/chrono_date/libs/date/src/vars.cpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -9,7 +9,7 @@
 #include <boost/chrono/date/weekday.hpp>
 #include <boost/chrono/date/month.hpp>
 #include <boost/chrono/date/nth_week.hpp>
-#include <boost/chrono/date/nth.hpp>
+//#include <boost/chrono/date/nth.hpp>
 #include <boost/chrono/date/month_nth.hpp>
 #include <boost/chrono/date/tuples.hpp>
 
@@ -18,18 +18,18 @@
   namespace chrono
   {
 
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, last, 0)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _1st, 1)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _2nd, 2)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _3rd, 3)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _4th, 4)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _5th, 5)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _6th, 6)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _7th, 7)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _8th, 8)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _9th, 9)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _10th, 10)
-    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, _29th, 29)
+    //BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_tag, last, 0)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_1_5_tag, _1st, 1)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_1_5_tag, _2nd, 2)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_1_5_tag, _3rd, 3)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_1_5_tag, _4th, 4)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_1_5_tag, _5th, 5)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _6th, 6)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _7th, 7)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _8th, 8)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _9th, 9)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _10th, 10)
+    BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(nth_6_31_tag, _29th, 29)
 
     BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(month, jan, 1)
     BOOST_CONSTEXPR_OR_EXTERN_CONST_DEF(month, feb, 2)
Modified: sandbox/chrono_date/libs/date/test/Jamfile.v2
==============================================================================
--- sandbox/chrono_date/libs/date/test/Jamfile.v2	(original)
+++ sandbox/chrono_date/libs/date/test/Jamfile.v2	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -131,7 +131,7 @@
     test-suite "wrappers"
         :
         [ date-run-2 wrappers/day_pass.cpp : day_pass ]
-        [ date-run-2 wrappers/nth_pass.cpp : nth_pass ]
+        #[ date-run-2 wrappers/nth_pass.cpp : nth_pass ]
         [ date-run-2 wrappers/weekday_pass.cpp : weekday_pass ]
         [ date-run-2 wrappers/day_of_year_pass.cpp : day_of_year_pass ]
         [ date-run-2 wrappers/nth_week_pass.cpp : nth_week_pass ]
Modified: sandbox/chrono_date/libs/date/test/wrappers/nth_week_pass.cpp
==============================================================================
--- sandbox/chrono_date/libs/date/test/wrappers/nth_week_pass.cpp	(original)
+++ sandbox/chrono_date/libs/date/test/wrappers/nth_week_pass.cpp	2013-05-19 19:29:47 EDT (Sun, 19 May 2013)
@@ -24,7 +24,7 @@
   {
     try
     {
-      nth_week d(7, check);
+      nth_week d(6, check);
       BOOST_TEST(false && "7 is not a valid nth_week");
     }
     catch (...)
@@ -53,10 +53,6 @@
       BOOST_TEST(d.is_valid() );
   }
   {
-      nth_week d(6);
-      BOOST_TEST(d.is_valid() );
-  }
-  {
       nth_week d(2);
       BOOST_TEST(d.is_valid() && "2 is a valid nth_week");
       nth_week::rep i = d;
@@ -88,10 +84,6 @@
 //      BOOST_TEST(_5th_week.is_valid() );
 //      BOOST_TEST(_5th_week==nth_week(5));
 //  }
-//  {
-//      BOOST_TEST(last_week.is_valid() );
-//      BOOST_TEST(last_week==nth_week(6));
-//  }
 
   return boost::report_errors();
 }