1 /*=============================================================================
2     Copyright (c) 2001-2011 Joel de Guzman
3 
4     Distributed under the Boost Software License, Version 1.0. (See accompanying
5     file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6 ==============================================================================*/
7 #if !defined(BOOST_SPIRIT_TST_JUNE_03_2007_1031AM)
8 #define BOOST_SPIRIT_TST_JUNE_03_2007_1031AM
9 
10 #if defined(_MSC_VER)
11 #pragma once
12 #endif
13 
14 #include <boost/spirit/home/qi/string/detail/tst.hpp>
15 
16 namespace boost { namespace spirit { namespace qi
17 {
18     struct tst_pass_through
19     {
20         template <typename Char>
operator ()boost::spirit::qi::tst_pass_through21         Char operator()(Char ch) const
22         {
23             return ch;
24         }
25     };
26 
27     template <typename Char, typename T>
28     struct tst
29     {
30         typedef Char char_type; // the character type
31         typedef T value_type; // the value associated with each entry
32         typedef detail::tst_node<Char, T> node;
33 
tstboost::spirit::qi::tst34         tst()
35           : root(0)
36         {
37         }
38 
~tstboost::spirit::qi::tst39         ~tst()
40         {
41             clear();
42         }
43 
tstboost::spirit::qi::tst44         tst(tst const& rhs)
45           : root(0)
46         {
47             copy(rhs);
48         }
49 
operator =boost::spirit::qi::tst50         tst& operator=(tst const& rhs)
51         {
52             return assign(rhs);
53         }
54 
55         template <typename Iterator, typename Filter>
findboost::spirit::qi::tst56         T* find(Iterator& first, Iterator last, Filter filter) const
57         {
58             return node::find(root, first, last, filter);
59         }
60 
61         template <typename Iterator>
findboost::spirit::qi::tst62         T* find(Iterator& first, Iterator last) const
63         {
64             return find(first, last, tst_pass_through());
65         }
66 
67         template <typename Iterator>
addboost::spirit::qi::tst68         T* add(
69             Iterator first
70           , Iterator last
71           , typename boost::call_traits<T>::param_type val)
72         {
73             return node::add(root, first, last, val, this);
74         }
75 
76         template <typename Iterator>
removeboost::spirit::qi::tst77         void remove(Iterator first, Iterator last)
78         {
79             node::remove(root, first, last, this);
80         }
81 
clearboost::spirit::qi::tst82         void clear()
83         {
84             node::destruct_node(root, this);
85             root = 0;
86         }
87 
88         template <typename F>
for_eachboost::spirit::qi::tst89         void for_each(F f) const
90         {
91             node::for_each(root, std::basic_string<Char>(), f);
92         }
93 
94     private:
95 
96         friend struct detail::tst_node<Char, T>;
97 
copyboost::spirit::qi::tst98         void copy(tst const& rhs)
99         {
100             root = node::clone_node(rhs.root, this);
101         }
102 
assignboost::spirit::qi::tst103         tst& assign(tst const& rhs)
104         {
105             if (this != &rhs)
106             {
107                 clear();
108                 copy(rhs);
109             }
110             return *this;
111         }
112 
113         node* root;
114 
new_nodeboost::spirit::qi::tst115         node* new_node(Char id)
116         {
117             return new node(id);
118         }
119 
new_databoost::spirit::qi::tst120         T* new_data(typename boost::call_traits<T>::param_type val)
121         {
122             return new T(val);
123         }
124 
delete_nodeboost::spirit::qi::tst125         void delete_node(node* p)
126         {
127             delete p;
128         }
129 
delete_databoost::spirit::qi::tst130         void delete_data(T* p)
131         {
132             delete p;
133         }
134     };
135 }}}
136 
137 #endif
138