123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- /*=============================================================================
- 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
|