]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/spirit/include/boost/spirit/home/x3/string/tst.hpp
add subtree-ish sources for 12.0.3
[ceph.git] / ceph / src / boost / libs / spirit / include / boost / spirit / home / x3 / string / tst.hpp
1 /*=============================================================================
2 Copyright (c) 2001-2014 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_X3_TST_JUNE_03_2007_1031AM)
8 #define BOOST_SPIRIT_X3_TST_JUNE_03_2007_1031AM
9
10 #include <boost/spirit/home/x3/string/detail/tst.hpp>
11
12 namespace boost { namespace spirit { namespace x3
13 {
14 struct tst_pass_through
15 {
16 template <typename Char>
17 Char operator()(Char ch) const
18 {
19 return ch;
20 }
21 };
22
23 template <typename Char, typename T>
24 struct tst
25 {
26 typedef Char char_type; // the character type
27 typedef T value_type; // the value associated with each entry
28 typedef detail::tst_node<Char, T> node;
29
30 tst()
31 : root(0)
32 {
33 }
34
35 ~tst()
36 {
37 clear();
38 }
39
40 tst(tst const& rhs)
41 : root(0)
42 {
43 copy(rhs);
44 }
45
46 tst& operator=(tst const& rhs)
47 {
48 return assign(rhs);
49 }
50
51 template <typename Iterator, typename CaseCompare>
52 T* find(Iterator& first, Iterator last, CaseCompare caseCompare) const
53 {
54 return node::find(root, first, last, caseCompare);
55 }
56
57 /*template <typename Iterator>
58 T* find(Iterator& first, Iterator last) const
59 {
60 return find(first, last, case_compare<tst_pass_through());
61 }*/
62
63 template <typename Iterator>
64 T* add(
65 Iterator first
66 , Iterator last
67 , typename boost::call_traits<T>::param_type val)
68 {
69 return node::add(root, first, last, val, this);
70 }
71
72 template <typename Iterator>
73 void remove(Iterator first, Iterator last)
74 {
75 node::remove(root, first, last, this);
76 }
77
78 void clear()
79 {
80 node::destruct_node(root, this);
81 root = 0;
82 }
83
84 template <typename F>
85 void for_each(F f) const
86 {
87 node::for_each(root, std::basic_string<Char>(), f);
88 }
89
90 private:
91
92 friend struct detail::tst_node<Char, T>;
93
94 void copy(tst const& rhs)
95 {
96 root = node::clone_node(rhs.root, this);
97 }
98
99 tst& assign(tst const& rhs)
100 {
101 if (this != &rhs)
102 {
103 clear();
104 copy(rhs);
105 }
106 return *this;
107 }
108
109 node* root;
110
111 node* new_node(Char id)
112 {
113 return new node(id);
114 }
115
116 T* new_data(typename boost::call_traits<T>::param_type val)
117 {
118 return new T(val);
119 }
120
121 void delete_node(node* p)
122 {
123 delete p;
124 }
125
126 void delete_data(T* p)
127 {
128 delete p;
129 }
130 };
131 }}}
132
133 #endif