$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r58095 - in trunk: boost/program_options libs/program_options/src libs/program_options/test
From: s.ochsenknecht_at_[hidden]
Date: 2009-12-02 08:35:55
Author: s_ochsenknecht
Date: 2009-12-02 08:35:54 EST (Wed, 02 Dec 2009)
New Revision: 58095
URL: http://svn.boost.org/trac/boost/changeset/58095
Log:
Additional parameter to allow user to specify width of column for description text, patch from Chard, Fixes #3703
Text files modified: 
   trunk/boost/program_options/options_description.hpp          |    12 ++++++++-                               
   trunk/libs/program_options/src/options_description.cpp       |    27 +++++++++++++++------                   
   trunk/libs/program_options/test/options_description_test.cpp |    49 ++++++++++++++++++++++++++++++++++++++++
   3 files changed, 78 insertions(+), 10 deletions(-)
Modified: trunk/boost/program_options/options_description.hpp
==============================================================================
--- trunk/boost/program_options/options_description.hpp	(original)
+++ trunk/boost/program_options/options_description.hpp	2009-12-02 08:35:54 EST (Wed, 02 Dec 2009)
@@ -158,12 +158,18 @@
         static const unsigned m_default_line_length;
         
         /** Creates the instance. */
-        options_description(unsigned line_length = m_default_line_length);
+        options_description(unsigned line_length = m_default_line_length,
+                            unsigned description_length = m_default_line_length / 2);
         /** Creates the instance. The 'caption' parameter gives the name of
             this 'options_description' instance. Primarily useful for output.
+            The 'description_length' specifies the number of columns that
+            should be reserved for the description text; if the option text
+            encroaches into this, then the description will start on the next
+            line.
         */
         options_description(const std::string& caption,
-                            unsigned line_length = m_default_line_length);
+                            unsigned line_length = m_default_line_length,
+                            unsigned description_length = m_default_line_length / 2);
         /** Adds new variable description. Throws duplicate_variable_error if
             either short or long name matches that of already present one. 
         */
@@ -213,6 +219,8 @@
 
         std::string m_caption;
         const unsigned m_line_length;
+        const unsigned m_description_length;
+        
         // Data organization is chosen because:
         // - there could be two names for one option
         // - option_add_proxy needs to know the last added option
Modified: trunk/libs/program_options/src/options_description.cpp
==============================================================================
--- trunk/libs/program_options/src/options_description.cpp	(original)
+++ trunk/libs/program_options/src/options_description.cpp	2009-12-02 08:35:54 EST (Wed, 02 Dec 2009)
@@ -205,15 +205,26 @@
 
     const unsigned options_description::m_default_line_length = 80;
 
-    options_description::options_description(unsigned line_length)
+    options_description::options_description(unsigned line_length,
+                                             unsigned description_length)
     : m_line_length(line_length)
-    {}
-
-    options_description::options_description(const string& caption,
-                                             unsigned line_length)
-    : m_caption(caption), m_line_length(line_length)
-    {}
+    , m_description_length(description_length)
+    {
+        // we require a space between the option and description parts, so add 1.
+        assert(m_description_length < m_line_length - 1);    
+    }
 
+    options_description::options_description(const std::string& caption,
+                                             unsigned line_length,
+                                             unsigned description_length)
+    : m_caption(caption)
+    , m_line_length(line_length)
+    , m_description_length(description_length)
+    {
+        // we require a space between the option and description parts, so add 1.
+        assert(m_description_length < m_line_length - 1);
+    }
+    
     void
     options_description::add(shared_ptr<option_description> desc)
     {
@@ -543,7 +554,7 @@
         }
         /* this is the column were description should start, if first
            column is longer, we go to a new line */
-        unsigned start_of_description_column = m_line_length / 2;
+        const unsigned start_of_description_column = m_line_length - m_description_length;
 
         width = (min)(width, start_of_description_column-1);
         
Modified: trunk/libs/program_options/test/options_description_test.cpp
==============================================================================
--- trunk/libs/program_options/test/options_description_test.cpp	(original)
+++ trunk/libs/program_options/test/options_description_test.cpp	2009-12-02 08:35:54 EST (Wed, 02 Dec 2009)
@@ -111,6 +111,54 @@
    );
 }
 
+void test_formatting_description_length()
+{
+    {
+        options_description desc("",
+                                 options_description::m_default_line_length,
+                                 options_description::m_default_line_length / 2U);
+        desc.add_options()
+            ("an-option-that-sets-the-max", new untyped_value(), // > 40 available for desc
+            "this description sits on the same line, but wrapping should still work correctly")
+            ("a-long-option-that-would-leave-very-little-space-for-description", new untyped_value(),
+            "the description of the long opt, but placed on the next line\n"
+            "    \talso ensure that the tabulation works correctly when a"
+            " description size has been set");
+
+        stringstream ss;
+        ss << desc;
+        BOOST_CHECK_EQUAL(ss.str(),
+        "  --an-option-that-sets-the-max arg     this description sits on the same line,\n"
+        "                                        but wrapping should still work \n"
+        "                                        correctly\n"
+        "  --a-long-option-that-would-leave-very-little-space-for-description arg\n"
+        "                                        the description of the long opt, but \n"
+        "                                        placed on the next line\n"
+        "                                            also ensure that the tabulation \n"
+        "                                            works correctly when a description \n"
+        "                                            size has been set\n");
+    }
+    {
+        // the default behaviour reserves 23 (+1 space) characters for the
+        // option column; this shows that the min_description_length does not
+        // breach that.
+        options_description desc("",
+                                 options_description::m_default_line_length,
+                                 options_description::m_default_line_length - 10U); // leaves < 23 (default option space)
+        desc.add_options()
+            ("an-option-that-encroaches-description", new untyped_value(),
+            "this description should always be placed on the next line, and wrapping should continue as normal");
+
+        stringstream ss;
+        ss << desc;
+        BOOST_CHECK_EQUAL(ss.str(),
+        "  --an-option-that-encroaches-description arg\n"
+       //123456789_123456789_
+        "          this description should always be placed on the next line, and \n"
+        "          wrapping should continue as normal\n");
+    }
+}
+
 void test_long_default_value()
 {
     options_description desc;
@@ -175,6 +223,7 @@
     test_type();
     test_approximation();
     test_formatting();
+    test_formatting_description_length();
     test_long_default_value();
     test_word_wrapping();
     test_default_values();