debug.hpp

来自「Boost provides free peer-reviewed portab」· HPP 代码 · 共 215 行

HPP
215
字号
////////////////////////////////////////////////////////////////////////////////// \file debug.hpp/// Utilities for debugging Proto expression trees////  Copyright 2008 Eric Niebler. 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)#ifndef BOOST_PROTO_DEBUG_HPP_EAN_12_31_2006#define BOOST_PROTO_DEBUG_HPP_EAN_12_31_2006#include <boost/preprocessor/iteration/local.hpp>#include <boost/preprocessor/repetition/repeat.hpp>#if !defined(__WAVE__) || !defined(BOOST_PROTO_DOXYGEN_INVOKED)#include <iomanip>#include <iostream>#include <typeinfo>#include <boost/xpressive/proto/proto_fwd.hpp>#include <boost/xpressive/proto/expr.hpp>#include <boost/xpressive/proto/traits.hpp>#else/// INTERNAL ONLY/// Needed to work around doxygen bugstruct a_dummy_global;#endifnamespace boost { namespace proto{    namespace tag    {        namespace hidden_detail_        {            typedef char (&not_ostream)[sizeof(std::ostream)+1];            not_ostream operator<<(std::ostream &, detail::dont_care);            template<typename Tag, std::size_t S>            struct printable_tag_            {                typedef char const *type;                static type call() { return typeid(Tag).name(); }            };            template<typename Tag>            struct printable_tag_<Tag, sizeof(std::ostream)>            {                typedef Tag type;                static type call() { return Tag(); }            };            template<typename Tag>            struct printable_tag              : printable_tag_<Tag, sizeof(std::cout << Tag())>            {};        }        /// INTERNAL ONLY        template<typename Tag>        inline typename hidden_detail_::printable_tag<Tag>::type proto_tag_name(Tag)        {            return hidden_detail_::printable_tag<Tag>::call();        }    #define BOOST_PROTO_DEFINE_TAG_NAME(Tag)                                    \        /** \brief INTERNAL ONLY */                                             \        inline char const *proto_tag_name(tag::Tag)                             \        {                                                                       \            return #Tag;                                                        \        }                                                                       \        /**/        BOOST_PROTO_DEFINE_TAG_NAME(posit)        BOOST_PROTO_DEFINE_TAG_NAME(negate)        BOOST_PROTO_DEFINE_TAG_NAME(dereference)        BOOST_PROTO_DEFINE_TAG_NAME(complement)        BOOST_PROTO_DEFINE_TAG_NAME(address_of)        BOOST_PROTO_DEFINE_TAG_NAME(logical_not)        BOOST_PROTO_DEFINE_TAG_NAME(pre_inc)        BOOST_PROTO_DEFINE_TAG_NAME(pre_dec)        BOOST_PROTO_DEFINE_TAG_NAME(post_inc)        BOOST_PROTO_DEFINE_TAG_NAME(post_dec)        BOOST_PROTO_DEFINE_TAG_NAME(shift_left)        BOOST_PROTO_DEFINE_TAG_NAME(shift_right)        BOOST_PROTO_DEFINE_TAG_NAME(multiplies)        BOOST_PROTO_DEFINE_TAG_NAME(divides)        BOOST_PROTO_DEFINE_TAG_NAME(modulus)        BOOST_PROTO_DEFINE_TAG_NAME(plus)        BOOST_PROTO_DEFINE_TAG_NAME(minus)        BOOST_PROTO_DEFINE_TAG_NAME(less)        BOOST_PROTO_DEFINE_TAG_NAME(greater)        BOOST_PROTO_DEFINE_TAG_NAME(less_equal)        BOOST_PROTO_DEFINE_TAG_NAME(greater_equal)        BOOST_PROTO_DEFINE_TAG_NAME(equal_to)        BOOST_PROTO_DEFINE_TAG_NAME(not_equal_to)        BOOST_PROTO_DEFINE_TAG_NAME(logical_or)        BOOST_PROTO_DEFINE_TAG_NAME(logical_and)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_and)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_or)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_xor)        BOOST_PROTO_DEFINE_TAG_NAME(comma)        BOOST_PROTO_DEFINE_TAG_NAME(mem_ptr)        BOOST_PROTO_DEFINE_TAG_NAME(assign)        BOOST_PROTO_DEFINE_TAG_NAME(shift_left_assign)        BOOST_PROTO_DEFINE_TAG_NAME(shift_right_assign)        BOOST_PROTO_DEFINE_TAG_NAME(multiplies_assign)        BOOST_PROTO_DEFINE_TAG_NAME(divides_assign)        BOOST_PROTO_DEFINE_TAG_NAME(modulus_assign)        BOOST_PROTO_DEFINE_TAG_NAME(plus_assign)        BOOST_PROTO_DEFINE_TAG_NAME(minus_assign)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_and_assign)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_or_assign)        BOOST_PROTO_DEFINE_TAG_NAME(bitwise_xor_assign)        BOOST_PROTO_DEFINE_TAG_NAME(subscript)        BOOST_PROTO_DEFINE_TAG_NAME(if_else_)        BOOST_PROTO_DEFINE_TAG_NAME(function)    #undef BOOST_PROTO_DEFINE_TAG_NAME    }    namespace functional    {        /// \brief Pretty-print a Proto expression tree.        ///        /// A PolymorphicFunctionObject which accepts a Proto expression        /// tree and pretty-prints it to an \c ostream for debugging        /// purposes.        struct display_expr        {            typedef void result_type;            /// \param depth The starting indentation depth for this node.            ///              Children nodes will be displayed at a starting            ///              depth of <tt>depth+4</tt>.            /// \param sout  The \c ostream to which the expression tree            ///              will be written.            display_expr(int depth = 0, std::ostream &sout = std::cout)              : depth_(depth)              , first_(true)              , sout_(sout)            {}            /// \brief Pretty-print the current node in a Proto expression            /// tree.            template<typename Args>            void operator()(proto::expr<tag::terminal, Args, 0> const &expr) const            {                this->sout_ << std::setw(this->depth_) << (this->first_? "" : ", ")                    << "terminal(" << proto::arg(expr) << ")\n";                this->first_ = false;            }        #define BOOST_PROTO_ARG(z, n, data)                                                         \            display(proto::arg_c<n>(expr));                                                         \            /**/        #define BOOST_PP_LOCAL_MACRO(N)                                                             \            /** \overload */                                                                        \            template<typename Tag, typename Args>                                                   \            void operator()(proto::expr<Tag, Args, N> const &expr) const                            \            {                                                                                       \                using namespace tag;                                                                \                this->sout_ << std::setw(this->depth_) << (this->first_? "" : ", ")                 \                    << proto_tag_name(Tag()) << "(\n";                                              \                display_expr display(this->depth_ + 4, this->sout_);                                \                BOOST_PP_REPEAT(N, BOOST_PROTO_ARG, _)                                              \                this->sout_ << std::setw(this->depth_) << "" << ")\n";                              \                this->first_ = false;                                                               \            }                                                                                       \            /**/        #define BOOST_PP_LOCAL_LIMITS (1, BOOST_PROTO_MAX_ARITY)        #include BOOST_PP_LOCAL_ITERATE()        #undef BOOST_PROTO_ARG            /// \overload            ///            template<typename T>            void operator()(T const &t) const            {                (*this)(t.proto_base());            }        private:            display_expr &operator =(display_expr const &);            int depth_;            mutable bool first_;            std::ostream &sout_;        };    }    /// \brief Pretty-print a Proto expression tree.    ///    /// \note Equivalent to <tt>functional::display_expr(0, sout)(expr)</tt>    /// \param expr The Proto expression tree to pretty-print    /// \param sout The \c ostream to which the output should be    ///             written. If not specified, defaults to    ///             <tt>std::cout</tt>.    template<typename Expr>    void display_expr(Expr const &expr, std::ostream &sout)    {        functional::display_expr(0, sout)(expr);    }    /// \overload    ///    template<typename Expr>    void display_expr(Expr const &expr)    {        functional::display_expr()(expr);    }}}#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?