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