138 lines
3.0 KiB
C++
138 lines
3.0 KiB
C++
/*=============================================================================
|
|
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
|