1 /*=============================================================================
2     Copyright (c) 2001-2014 Joel de Guzman
3     Copyright (c) 2001-2011 Hartmut Kaiser
4     http://spirit.sourceforge.net/
5 
6     Distributed under the Boost Software License, Version 1.0. (See accompanying
7     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 =============================================================================*/
9 #if !defined(BOOST_SPIRIT_X3_OPTIONAL_TRAITS_FEBRUARY_06_2007_1001AM)
10 #define BOOST_SPIRIT_X3_OPTIONAL_TRAITS_FEBRUARY_06_2007_1001AM
11 
12 #include <boost/spirit/home/x3/support/unused.hpp>
13 #include <boost/optional/optional.hpp>
14 #include <boost/mpl/identity.hpp>
15 
16 namespace boost { namespace spirit { namespace x3 { namespace traits
17 {
18     ///////////////////////////////////////////////////////////////////////////
19     template <typename T, typename Enable = void>
20     struct is_optional
21       : mpl::false_
22     {};
23 
24     template <typename T>
25     struct is_optional<boost::optional<T>>
26       : mpl::true_
27     {};
28 
29     ///////////////////////////////////////////////////////////////////////////
30     // build_optional
31     //
32     // Build a boost::optional from T. Return unused_type if T is unused_type.
33     ///////////////////////////////////////////////////////////////////////////
34     template <typename T>
35     struct build_optional
36     {
37         typedef boost::optional<T> type;
38     };
39 
40     template <typename T>
41     struct build_optional<boost::optional<T> >
42     {
43         typedef boost::optional<T> type;
44     };
45 
46     template <>
47     struct build_optional<unused_type>
48     {
49         typedef unused_type type;
50     };
51 
52     ///////////////////////////////////////////////////////////////////////////
53     // optional_value
54     //
55     // Get the optional's value_type. Handles unused_type as well.
56     ///////////////////////////////////////////////////////////////////////////
57     template <typename T>
58     struct optional_value : mpl::identity<T> {};
59 
60     template <typename T>
61     struct optional_value<boost::optional<T> >
62       : mpl::identity<T> {};
63 
64     template <>
65     struct optional_value<unused_type>
66       : mpl::identity<unused_type> {};
67 
68     template <>
69     struct optional_value<unused_type const>
70       : mpl::identity<unused_type> {};
71 
72 }}}}
73 
74 #endif
75