Changeset 48327


Ignore:
Timestamp:
Aug 23, 2008, 8:37:36 PM (10 years ago)
Author:
Hartmut Kaiser
Message:

Spirit.Karma: Fixed optional to accept non-optional attributes.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/boost/spirit/home/karma/operator/optional.hpp

    r47380 r48327  
    1313
    1414#include <boost/spirit/home/support/component.hpp>
     15#include <boost/spirit/home/support/attribute_of.hpp>
    1516#include <boost/spirit/home/support/attribute_transform.hpp>
    1617#include <boost/mpl/assert.hpp>
     
    2223    {
    2324        template <typename Parameter>
    24         inline bool
    25         optional_is_valid(boost::optional<Parameter> const& opt)
     25        struct optional_attribute
    2626        {
    27             return opt;
    28         }
     27            static inline bool
     28            is_valid(boost::optional<Parameter> const& opt)
     29            {
     30                return opt;
     31            }
    2932
    30         inline bool
    31         optional_is_valid(unused_type)
    32         {
    33             return true;
    34         }
     33            static inline bool
     34            is_valid(Parameter const&)
     35            {
     36                return true;
     37            }
    3538
    36         template <typename Parameter>
    37         inline Parameter const&
    38         optional_get(boost::optional<Parameter> const& opt)
    39         {
    40             return get(opt) ;
    41         }
     39            static inline bool
     40            is_valid(unused_type)
     41            {
     42                return true;
     43            }
    4244
    43         inline unused_type
    44         optional_get(unused_type)
    45         {
    46             return unused;
    47         }
     45            static inline Parameter const&
     46            get(boost::optional<Parameter> const& opt)
     47            {
     48                return boost::get(opt);
     49            }
     50
     51            static inline Parameter const&
     52            get(Parameter const& p)
     53            {
     54                return p;
     55            }
     56
     57            static inline unused_type
     58            get(unused_type)
     59            {
     60                return unused;
     61            }
     62        };
    4863    }
    4964
     
    7287            director;
    7388
    74             if (detail::optional_is_valid(param))
     89            typedef typename traits::attribute_of<
     90                karma::domain, typename result_of::subject<Component>::type,
     91                Context, unused_type
     92            >::type attribute_type;
     93
     94            typedef detail::optional_attribute<attribute_type> optional_type;
     95            if (optional_type::is_valid(param))
    7596            {
    7697                director::generate(subject(component), sink, ctx, d,
    77                     detail::optional_get(param));
     98                    optional_type::get(param));
    7899            }
    79100            return true;
  • trunk/libs/spirit/test/karma/optional.cpp

    r44718 r48327  
    3232
    3333    {
     34        int opt = 10;
     35        BOOST_TEST(test("10", -int_, opt));
     36    }
     37
     38    {
    3439        using namespace boost::spirit::ascii;
    3540       
     
    3843
    3944        opt = 10;
     45        BOOST_TEST(test_delimited("10 ", -int_, opt, space));
     46    }
     47
     48    {
     49        using namespace boost::spirit::ascii;
     50
     51        int opt = 10;
    4052        BOOST_TEST(test_delimited("10 ", -int_, opt, space));
    4153    }
     
    5769        namespace phoenix = boost::phoenix;
    5870        using namespace boost::spirit::arg_names;
     71
     72        int n = 1234;
     73        BOOST_TEST(test("1234", (-int_)[_1 = phoenix::ref(n)]));
     74    }
     75
     76    {   // test action
     77        using namespace boost::phoenix;
     78        namespace phoenix = boost::phoenix;
     79        using namespace boost::spirit::arg_names;
    5980        using namespace boost::spirit::ascii;
    6081
     
    6687    }
    6788
     89    {   // test action
     90        using namespace boost::phoenix;
     91        namespace phoenix = boost::phoenix;
     92        using namespace boost::spirit::arg_names;
     93        using namespace boost::spirit::ascii;
     94
     95        int n = 1234;
     96        BOOST_TEST(test_delimited("1234 ", (-int_)[_1 = phoenix::ref(n)], space));
     97    }
     98
    6899    return boost::report_errors();
    69100}
Note: See TracChangeset for help on using the changeset viewer.