insert_whitespace_detection.hpp
来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 514 行 · 第 1/2 页
HPP
514 行
/*============================================================================= Boost.Wave: A Standard compliant C++ preprocessor library Detect the need to insert a whitespace token into the output stream http://www.boost.org/ Copyright (c) 2001-2008 Hartmut Kaiser. 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(INSERT_WHITESPACE_DETECTION_HPP_765EF77B_0513_4967_BDD6_6A38148C4C96_INCLUDED)#define INSERT_WHITESPACE_DETECTION_HPP_765EF77B_0513_4967_BDD6_6A38148C4C96_INCLUDED#include <boost/wave/wave_config.hpp> #include <boost/wave/token_ids.hpp> // this must occur after all of the includes and before any code appears#ifdef BOOST_HAS_ABI_HEADERS#include BOOST_ABI_PREFIX#endif///////////////////////////////////////////////////////////////////////////////namespace boost {namespace wave {namespace util {namespace impl {// T_IDENTIFIER template <typename StringT> inline bool would_form_universal_char (StringT const &value) { if ('u' != value[0] && 'U' != value[0]) return false; if ('u' == value[0] && value.size() < 5) return false; if ('U' == value[0] && value.size() < 9) return false; typename StringT::size_type pos = value.find_first_not_of("0123456789abcdefABCDEF", 1); if (StringT::npos == pos || ('u' == value[0] && pos > 5) || ('U' == value[0] && pos > 9)) { return true; // would form an universal char } return false; } template <typename StringT> inline bool handle_identifier(boost::wave::token_id prev, boost::wave::token_id before, StringT const &value) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_IDENTIFIER: case T_NONREPLACABLE_IDENTIFIER: case T_COMPL_ALT: case T_OR_ALT: case T_AND_ALT: case T_NOT_ALT: case T_XOR_ALT: case T_ANDASSIGN_ALT: case T_ORASSIGN_ALT: case T_XORASSIGN_ALT: case T_NOTEQUAL_ALT: case T_FIXEDPOINTLIT: return true; case T_FLOATLIT: case T_INTLIT: case T_PP_NUMBER: return (value.size() > 1 || (value[0] != 'e' && value[0] != 'E')); // avoid constructing universal characters (\u1234) case TOKEN_FROM_ID('\\', UnknownTokenType): return would_form_universal_char(value); } return false; }// T_INTLIT inline bool handle_intlit(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_IDENTIFIER: case T_NONREPLACABLE_IDENTIFIER: case T_INTLIT: case T_FLOATLIT: case T_FIXEDPOINTLIT: case T_PP_NUMBER: return true; } return false; }// T_FLOATLIT inline bool handle_floatlit(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_IDENTIFIER: case T_NONREPLACABLE_IDENTIFIER: case T_INTLIT: case T_FLOATLIT: case T_FIXEDPOINTLIT: case T_PP_NUMBER: return true; } return false; }// <% T_LEFTBRACE inline bool handle_alt_leftbrace(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_LESS: // <<% case T_SHIFTLEFT: // <<<% return true; } return false; }// <: T_LEFTBRACKET inline bool handle_alt_leftbracket(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_LESS: // <<: case T_SHIFTLEFT: // <<<: return true; } return false; }// T_FIXEDPOINTLIT inline bool handle_fixedpointlit(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_IDENTIFIER: case T_NONREPLACABLE_IDENTIFIER: case T_INTLIT: case T_FLOATLIT: case T_FIXEDPOINTLIT: case T_PP_NUMBER: return true; } return false; }// T_DOT inline bool handle_dot(boost::wave::token_id prev, boost::wave::token_id before) { using namespace boost::wave; switch (static_cast<unsigned int>(prev)) { case T_DOT: if (T_DOT == before) return true; // ... break; } return false; }// T_QUESTION_MARK inline bool handle_questionmark(boost::wave::token_id prev, boost::wave::token_id /*before*/) { using namespace boost::wave; switch(static_cast<unsigned int>(prev)) { case TOKEN_FROM_ID('\\', UnknownTokenType): // \? case T_QUESTION_MARK: // ?? return true; } return false; }// T_NEWLINE inline bool handle_newline(boost::wave::token_id prev, boost::wave::token_id before) { using namespace boost::wave; switch(static_cast<unsigned int>(prev)) { case TOKEN_FROM_ID('\\', UnknownTokenType): // \ \n case T_DIVIDE: if (T_QUESTION_MARK == before) return true; // ?/\n // may be \\n break; } return false; } inline bool handle_parens(boost::wave::token_id prev) { switch (static_cast<unsigned int>(prev)) { case T_LEFTPAREN: case T_RIGHTPAREN: case T_LEFTBRACKET: case T_RIGHTBRACKET: case T_LEFTBRACE: case T_RIGHTBRACE: case T_SEMICOLON: case T_COMMA: case T_COLON: // no insertion between parens/brackets/braces and operators return false; default: break; } return true; } } // namespace implclass insert_whitespace_detection {public: insert_whitespace_detection(bool insert_whitespace_ = true) : insert_whitespace(insert_whitespace_), prev(boost::wave::T_EOF), beforeprev(boost::wave::T_EOF) {} template <typename StringT> bool must_insert(boost::wave::token_id current, StringT const &value) { if (!insert_whitespace) return false; // skip whitespace insertion alltogether using namespace boost::wave; switch (static_cast<unsigned int>(current)) { case T_NONREPLACABLE_IDENTIFIER: case T_IDENTIFIER: return impl::handle_identifier(prev, beforeprev, value); case T_PP_NUMBER: case T_INTLIT: return impl::handle_intlit(prev, beforeprev); case T_FLOATLIT: return impl::handle_floatlit(prev, beforeprev); case T_STRINGLIT: if (TOKEN_FROM_ID('L', IdentifierTokenType) == prev) // 'L' return true; break; case T_LEFTBRACE_ALT: return impl::handle_alt_leftbrace(prev, beforeprev); case T_LEFTBRACKET_ALT:
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?