📄 symbols.ipp
字号:
/*============================================================================= 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -