| /*============================================================================= |
| Copyright (c) 2001-2003 Joel de Guzman |
| http://spirit.sourceforge.net/ |
| |
| Use, modification and distribution is subject to 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) |
| =============================================================================*/ |
| #ifndef BOOST_SPIRIT_SYMBOLS_IPP |
| #define BOOST_SPIRIT_SYMBOLS_IPP |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| #include <boost/spirit/home/classic/symbols/impl/tst.ipp> |
| #include <boost/detail/workaround.hpp> |
| |
| // MSVC: void warning about the use of 'this' pointer in constructors |
| #if defined(BOOST_MSVC) |
| #pragma warning(push) |
| #pragma warning(disable : 4355) |
| #endif |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| namespace boost { namespace spirit { |
| |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // symbols class implementation |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline symbols<T, CharT, SetT>::symbols() |
| : SetT() |
| , add(*this) |
| { |
| } |
| |
| ////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| symbols<T, CharT, SetT>::symbols(symbols const& other) |
| : SetT(other) |
| // Tru64 CXX seems to be confused by the explicit call of the default |
| // constructor and generates wrong code which invalidates the just contructed |
| // first base class in the line above. |
| #if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590041)) |
| , parser<symbols<T, CharT, SetT> >() |
| #endif |
| , add(*this) |
| { |
| } |
| |
| ////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline symbols<T, CharT, SetT>::~symbols() |
| {} |
| |
| ////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline symbols<T, CharT, SetT>& |
| symbols<T, CharT, SetT>::operator=(symbols const& other) |
| { |
| SetT::operator=(other); |
| return *this; |
| } |
| |
| ////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline symbol_inserter<T, SetT> const& |
| symbols<T, CharT, SetT>::operator=(CharT const* str) |
| { |
| return add, str; |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| // |
| // Symbol table utilities |
| // |
| /////////////////////////////////////////////////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline T* |
| find(symbols<T, CharT, SetT> const& table, CharT const* sym) |
| { |
| CharT const* last = sym; |
| while (*last) |
| last++; |
| scanner<CharT const *> scan(sym, last); |
| T* result = table.find(scan); |
| return scan.at_end()? result: 0; |
| } |
| |
| ////////////////////////////////// |
| template <typename T, typename CharT, typename SetT> |
| inline T* |
| add(symbols<T, CharT, SetT>& table, CharT const* sym, T const& data) |
| { |
| CharT const* first = sym; |
| CharT const* last = sym; |
| while (*last) |
| last++; |
| scanner<CharT const *> scan(first, last); |
| if (table.find(scan) && scan.at_end()) |
| return 0; // symbol already contained in symbol table |
| table.add(sym, last, data); |
| first = sym; |
| return table.find(scan); // refind the inserted symbol |
| } |
| |
| /////////////////////////////////////////////////////////////////////////////// |
| BOOST_SPIRIT_CLASSIC_NAMESPACE_END |
| |
| }} // namespace boost::spirit |
| |
| #if defined(BOOST_MSVC) |
| #pragma warning(pop) |
| #endif |
| |
| #endif |