annotate DEPENDENCIES/generic/include/boost/spirit/home/x3/string/detail/tst.hpp @ 118:770eb830ec19 emscripten

Typo fix
author Chris Cannam
date Wed, 18 May 2016 16:14:08 +0100
parents f46d142149f5
children
rev   line source
Chris@102 1 /*=============================================================================
Chris@102 2 Copyright (c) 2001-2014 Joel de Guzman
Chris@102 3
Chris@102 4 Distributed under the Boost Software License, Version 1.0. (See accompanying
Chris@102 5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
Chris@102 6 ==============================================================================*/
Chris@102 7 #if !defined(BOOST_SPIRIT_X3_TST_MARCH_09_2007_0905AM)
Chris@102 8 #define BOOST_SPIRIT_X3_TST_MARCH_09_2007_0905AM
Chris@102 9
Chris@102 10 #if defined(_MSC_VER)
Chris@102 11 #pragma once
Chris@102 12 #endif
Chris@102 13
Chris@102 14 #include <boost/call_traits.hpp>
Chris@102 15 #include <boost/detail/iterator.hpp>
Chris@102 16 #include <boost/foreach.hpp>
Chris@102 17 #include <boost/assert.hpp>
Chris@102 18
Chris@102 19 namespace boost { namespace spirit { namespace x3 { namespace detail
Chris@102 20 {
Chris@102 21 // This file contains low level TST routines, not for
Chris@102 22 // public consumption.
Chris@102 23
Chris@102 24 template <typename Char, typename T>
Chris@102 25 struct tst_node
Chris@102 26 {
Chris@102 27 tst_node(Char id)
Chris@102 28 : id(id), data(0), lt(0), eq(0), gt(0)
Chris@102 29 {
Chris@102 30 }
Chris@102 31
Chris@102 32 template <typename Alloc>
Chris@102 33 static void
Chris@102 34 destruct_node(tst_node* p, Alloc* alloc)
Chris@102 35 {
Chris@102 36 if (p)
Chris@102 37 {
Chris@102 38 if (p->data)
Chris@102 39 alloc->delete_data(p->data);
Chris@102 40 destruct_node(p->lt, alloc);
Chris@102 41 destruct_node(p->eq, alloc);
Chris@102 42 destruct_node(p->gt, alloc);
Chris@102 43 alloc->delete_node(p);
Chris@102 44 }
Chris@102 45 }
Chris@102 46
Chris@102 47 template <typename Alloc>
Chris@102 48 static tst_node*
Chris@102 49 clone_node(tst_node* p, Alloc* alloc)
Chris@102 50 {
Chris@102 51 if (p)
Chris@102 52 {
Chris@102 53 tst_node* clone = alloc->new_node(p->id);
Chris@102 54 if (p->data)
Chris@102 55 clone->data = alloc->new_data(*p->data);
Chris@102 56 clone->lt = clone_node(p->lt, alloc);
Chris@102 57 clone->eq = clone_node(p->eq, alloc);
Chris@102 58 clone->gt = clone_node(p->gt, alloc);
Chris@102 59 return clone;
Chris@102 60 }
Chris@102 61 return 0;
Chris@102 62 }
Chris@102 63
Chris@102 64 template <typename Iterator, typename Filter>
Chris@102 65 static T*
Chris@102 66 find(tst_node* start, Iterator& first, Iterator last, Filter filter)
Chris@102 67 {
Chris@102 68 if (first == last)
Chris@102 69 return 0;
Chris@102 70
Chris@102 71 Iterator i = first;
Chris@102 72 Iterator latest = first;
Chris@102 73 tst_node* p = start;
Chris@102 74 T* found = 0;
Chris@102 75
Chris@102 76 while (p && i != last)
Chris@102 77 {
Chris@102 78 typename
Chris@102 79 boost::detail::iterator_traits<Iterator>::value_type
Chris@102 80 c = filter(*i); // filter only the input
Chris@102 81
Chris@102 82 if (c == p->id)
Chris@102 83 {
Chris@102 84 if (p->data)
Chris@102 85 {
Chris@102 86 found = p->data;
Chris@102 87 latest = i;
Chris@102 88 }
Chris@102 89 p = p->eq;
Chris@102 90 i++;
Chris@102 91 }
Chris@102 92 else if (c < p->id)
Chris@102 93 {
Chris@102 94 p = p->lt;
Chris@102 95 }
Chris@102 96 else
Chris@102 97 {
Chris@102 98 p = p->gt;
Chris@102 99 }
Chris@102 100 }
Chris@102 101
Chris@102 102 if (found)
Chris@102 103 first = ++latest; // one past the last matching char
Chris@102 104 return found;
Chris@102 105 }
Chris@102 106
Chris@102 107 template <typename Iterator, typename Alloc>
Chris@102 108 static T*
Chris@102 109 add(
Chris@102 110 tst_node*& start
Chris@102 111 , Iterator first
Chris@102 112 , Iterator last
Chris@102 113 , typename boost::call_traits<T>::param_type val
Chris@102 114 , Alloc* alloc)
Chris@102 115 {
Chris@102 116 if (first == last)
Chris@102 117 return 0;
Chris@102 118
Chris@102 119 tst_node** pp = &start;
Chris@102 120 for(;;)
Chris@102 121 {
Chris@102 122 typename
Chris@102 123 boost::detail::iterator_traits<Iterator>::value_type
Chris@102 124 c = *first;
Chris@102 125
Chris@102 126 if (*pp == 0)
Chris@102 127 *pp = alloc->new_node(c);
Chris@102 128 tst_node* p = *pp;
Chris@102 129
Chris@102 130 if (c == p->id)
Chris@102 131 {
Chris@102 132 if (++first == last)
Chris@102 133 {
Chris@102 134 if (p->data == 0)
Chris@102 135 p->data = alloc->new_data(val);
Chris@102 136 return p->data;
Chris@102 137 }
Chris@102 138 pp = &p->eq;
Chris@102 139 }
Chris@102 140 else if (c < p->id)
Chris@102 141 {
Chris@102 142 pp = &p->lt;
Chris@102 143 }
Chris@102 144 else
Chris@102 145 {
Chris@102 146 pp = &p->gt;
Chris@102 147 }
Chris@102 148 }
Chris@102 149 }
Chris@102 150
Chris@102 151 template <typename Iterator, typename Alloc>
Chris@102 152 static void
Chris@102 153 remove(tst_node*& p, Iterator first, Iterator last, Alloc* alloc)
Chris@102 154 {
Chris@102 155 if (p == 0 || first == last)
Chris@102 156 return;
Chris@102 157
Chris@102 158 typename
Chris@102 159 boost::detail::iterator_traits<Iterator>::value_type
Chris@102 160 c = *first;
Chris@102 161
Chris@102 162 if (c == p->id)
Chris@102 163 {
Chris@102 164 if (++first == last)
Chris@102 165 {
Chris@102 166 if (p->data)
Chris@102 167 {
Chris@102 168 alloc->delete_data(p->data);
Chris@102 169 p->data = 0;
Chris@102 170 }
Chris@102 171 }
Chris@102 172 remove(p->eq, first, last, alloc);
Chris@102 173 }
Chris@102 174 else if (c < p->id)
Chris@102 175 {
Chris@102 176 remove(p->lt, first, last, alloc);
Chris@102 177 }
Chris@102 178 else
Chris@102 179 {
Chris@102 180 remove(p->gt, first, last, alloc);
Chris@102 181 }
Chris@102 182
Chris@102 183 if (p->data == 0 && p->lt == 0 && p->eq == 0 && p->gt == 0)
Chris@102 184 {
Chris@102 185 alloc->delete_node(p);
Chris@102 186 p = 0;
Chris@102 187 }
Chris@102 188 }
Chris@102 189
Chris@102 190 template <typename F>
Chris@102 191 static void
Chris@102 192 for_each(tst_node* p, std::basic_string<Char> prefix, F f)
Chris@102 193 {
Chris@102 194 if (p)
Chris@102 195 {
Chris@102 196 for_each(p->lt, prefix, f);
Chris@102 197 std::basic_string<Char> s = prefix + p->id;
Chris@102 198 for_each(p->eq, s, f);
Chris@102 199 if (p->data)
Chris@102 200 f(s, *p->data);
Chris@102 201 for_each(p->gt, prefix, f);
Chris@102 202 }
Chris@102 203 }
Chris@102 204
Chris@102 205 Char id; // the node's identity character
Chris@102 206 T* data; // optional data
Chris@102 207 tst_node* lt; // left pointer
Chris@102 208 tst_node* eq; // middle pointer
Chris@102 209 tst_node* gt; // right pointer
Chris@102 210 };
Chris@102 211 }}}}
Chris@102 212
Chris@102 213 #endif