Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2003 Joel de Guzman Chris@16: http://spirit.sourceforge.net/ Chris@16: Chris@16: Use, modification and distribution is subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt) Chris@16: =============================================================================*/ Chris@16: #ifndef BOOST_SPIRIT_SYMBOLS_IPP Chris@16: #define BOOST_SPIRIT_SYMBOLS_IPP Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #include Chris@16: #include Chris@16: Chris@16: // MSVC: void warning about the use of 'this' pointer in constructors Chris@16: #if defined(BOOST_MSVC) Chris@16: #pragma warning(push) Chris@16: #pragma warning(disable : 4355) Chris@16: #endif Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: namespace boost { namespace spirit { Chris@16: Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_BEGIN Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // symbols class implementation Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: inline symbols::symbols() Chris@16: : SetT() Chris@16: , add(*this) Chris@16: { Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: symbols::symbols(symbols const& other) Chris@16: : SetT(other) Chris@16: // Tru64 CXX seems to be confused by the explicit call of the default Chris@16: // constructor and generates wrong code which invalidates the just contructed Chris@16: // first base class in the line above. Chris@16: #if !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590041)) Chris@16: , parser >() Chris@16: #endif Chris@16: , add(*this) Chris@16: { Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline symbols::~symbols() Chris@16: {} Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline symbols& Chris@16: symbols::operator=(symbols const& other) Chris@16: { Chris@16: SetT::operator=(other); Chris@16: return *this; Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline symbol_inserter const& Chris@16: symbols::operator=(CharT const* str) Chris@16: { Chris@16: return add, str; Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Symbol table utilities Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: template Chris@16: inline T* Chris@16: find(symbols const& table, CharT const* sym) Chris@16: { Chris@16: CharT const* last = sym; Chris@16: while (*last) Chris@16: last++; Chris@16: scanner scan(sym, last); Chris@16: T* result = table.find(scan); Chris@16: return scan.at_end()? result: 0; Chris@16: } Chris@16: Chris@16: ////////////////////////////////// Chris@16: template Chris@16: inline T* Chris@16: add(symbols& table, CharT const* sym, T const& data) Chris@16: { Chris@16: CharT const* first = sym; Chris@16: CharT const* last = sym; Chris@16: while (*last) Chris@16: last++; Chris@16: scanner scan(first, last); Chris@16: if (table.find(scan) && scan.at_end()) Chris@16: return 0; // symbol already contained in symbol table Chris@16: table.add(sym, last, data); Chris@16: first = sym; Chris@16: return table.find(scan); // refind the inserted symbol Chris@16: } Chris@16: Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: BOOST_SPIRIT_CLASSIC_NAMESPACE_END Chris@16: Chris@16: }} // namespace boost::spirit Chris@16: Chris@16: #if defined(BOOST_MSVC) Chris@16: #pragma warning(pop) Chris@16: #endif Chris@16: Chris@16: #endif