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