123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- /*=============================================================================
- Copyright (c) 2001-2011 Joel de Guzman
- Distributed under the Boost Software License, Version 1.0. (See accompanying
- file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- ==============================================================================*/
- #if !defined(BOOST_SPIRIT_TST_JUNE_03_2007_1031AM)
- #define BOOST_SPIRIT_TST_JUNE_03_2007_1031AM
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #include <boost/spirit/home/qi/string/detail/tst.hpp>
- namespace boost { namespace spirit { namespace qi
- {
- struct tst_pass_through
- {
- template <typename Char>
- Char operator()(Char ch) const
- {
- return ch;
- }
- };
- template <typename Char, typename T>
- struct tst
- {
- typedef Char char_type; // the character type
- typedef T value_type; // the value associated with each entry
- typedef detail::tst_node<Char, T> node;
- tst()
- : root(0)
- {
- }
- ~tst()
- {
- clear();
- }
- tst(tst const& rhs)
- : root(0)
- {
- copy(rhs);
- }
- tst& operator=(tst const& rhs)
- {
- return assign(rhs);
- }
- template <typename Iterator, typename Filter>
- T* find(Iterator& first, Iterator last, Filter filter) const
- {
- return node::find(root, first, last, filter);
- }
- template <typename Iterator>
- T* find(Iterator& first, Iterator last) const
- {
- return find(first, last, tst_pass_through());
- }
- template <typename Iterator>
- T* add(
- Iterator first
- , Iterator last
- , typename boost::call_traits<T>::param_type val)
- {
- return node::add(root, first, last, val, this);
- }
- template <typename Iterator>
- void remove(Iterator first, Iterator last)
- {
- node::remove(root, first, last, this);
- }
- void clear()
- {
- node::destruct_node(root, this);
- root = 0;
- }
- template <typename F>
- void for_each(F f) const
- {
- node::for_each(root, std::basic_string<Char>(), f);
- }
- private:
- friend struct detail::tst_node<Char, T>;
- void copy(tst const& rhs)
- {
- root = node::clone_node(rhs.root, this);
- }
- tst& assign(tst const& rhs)
- {
- if (this != &rhs)
- {
- clear();
- copy(rhs);
- }
- return *this;
- }
- node* root;
- node* new_node(Char id)
- {
- return new node(id);
- }
- T* new_data(typename boost::call_traits<T>::param_type val)
- {
- return new T(val);
- }
- void delete_node(node* p)
- {
- delete p;
- }
- void delete_data(T* p)
- {
- delete p;
- }
- };
- }}}
- #endif
|