1 /*=============================================================================
2     Copyright (c) 2010-2011 Daniel James
3 
4     Use, modification and distribution is subject to the Boost Software
5     License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
6     http://www.boost.org/LICENSE_1_0.txt)
7 =============================================================================*/
8 
9 #if !defined(BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP)
10 #define BOOST_SPIRIT_QUICKBOOK_VALUES_PARSE_HPP
11 
12 #include "values.hpp"
13 #include "parsers.hpp"
14 #include "scoped.hpp"
15 #include <boost/spirit/include/phoenix1_functions.hpp>
16 
17 #include <iostream>
18 
19 namespace quickbook {
20     namespace ph = phoenix;
21 
22     struct value_builder_save : scoped_action_base
23     {
value_builder_savequickbook::value_builder_save24         value_builder_save(value_builder& builder) : builder(builder) {}
25 
startquickbook::value_builder_save26         bool start()
27         {
28             builder.save();
29             return true;
30         }
31 
cleanupquickbook::value_builder_save32         void cleanup() { builder.restore(); }
33 
34         value_builder& builder;
35     };
36 
37     struct value_builder_list : scoped_action_base
38     {
value_builder_listquickbook::value_builder_list39         value_builder_list(value_builder& builder) : builder(builder) {}
40 
startquickbook::value_builder_list41         bool start(value::tag_type tag = value::default_tag)
42         {
43             builder.start_list(tag);
44             return true;
45         }
46 
successquickbook::value_builder_list47         void success(parse_iterator, parse_iterator) { builder.finish_list(); }
failurequickbook::value_builder_list48         void failure() { builder.clear_list(); }
49 
50         value_builder& builder;
51     };
52 
53     struct value_entry
54     {
55         template <typename Arg1, typename Arg2 = void, typename Arg3 = void, typename Arg4 = void>
56         struct result {
57             typedef void type;
58         };
59 
value_entryquickbook::value_entry60         value_entry(value_builder& b, file_ptr* current_file)
61             : b(b), current_file(current_file) {}
62 
operator ()quickbook::value_entry63         void operator()(parse_iterator begin, parse_iterator end,
64                 value::tag_type tag = value::default_tag) const
65         {
66             b.insert(qbk_value(*current_file, begin.base(), end.base(), tag));
67         }
68 
operator ()quickbook::value_entry69         void operator()(int v,
70             value::tag_type tag = value::default_tag) const
71         {
72             b.insert(int_value(v, tag));
73         }
74 
75         value_builder& b;
76         file_ptr* current_file;
77     };
78 
79     struct value_sort
80     {
81         typedef void result_type;
82 
value_sortquickbook::value_sort83         value_sort(value_builder& b)
84             : b(b) {}
85 
operator ()quickbook::value_sort86         void operator()() const {
87             b.sort_list();
88         }
89 
90         value_builder& b;
91     };
92 
93     struct value_parser
94     {
value_parserquickbook::value_parser95         value_parser(file_ptr* current_file)
96             : builder()
97             , save(builder)
98             , list(builder)
99             , entry(value_entry(builder, current_file))
100             , sort(builder)
101             {}
102 
releasequickbook::value_parser103         value release() { return builder.release(); }
104 
105         value_builder builder;
106         scoped_parser<value_builder_save> save;
107         scoped_parser<value_builder_list> list;
108         ph::function<value_entry> entry;
109         ph::function<value_sort> sort;
110     };
111 }
112 
113 #endif
114