manip.hpp

来自「CGAL is a collaborative effort of severa」· HPP 代码 · 共 323 行 · 第 1/2 页

HPP
323
字号
/*=============================================================================    Copyright (c) 1999-2003 Jeremiah Willcock    Copyright (c) 1999-2003 Jaakko J鋜vi    Copyright (c) 2001-2003 Joel de Guzman    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 FUSION_SEQUENCE_DETAIL_MANIP_HPP#define FUSION_SEQUENCE_DETAIL_MANIP_HPP#include <boost/config.hpp>#include <iostream>#include <string>#include <vector>#include <cctype>// Tuple I/O manipulators#include <boost/spirit/fusion/detail/config.hpp>#if BOOST_WORKAROUND(BOOST_MSVC, <= 1200)FUSION_MSVC_ETI_WRAPPER(char_type)FUSION_MSVC_ETI_WRAPPER(traits_type)# define FUSION_GET_CHAR_TYPE(T) get_char_type<T>::type# define FUSION_GET_TRAITS_TYPE(T) get_traits_type<T>::type#else# define FUSION_GET_CHAR_TYPE(T) typename T::char_type# define FUSION_GET_TRAITS_TYPE(T) typename T::traits_type#endif#if defined (BOOST_NO_TEMPLATED_STREAMS)#define FUSION_STRING_OF_STREAM(Stream) std::string#else#define FUSION_STRING_OF_STREAM(Stream)                                         \    std::basic_string<                                                          \        FUSION_GET_CHAR_TYPE(Stream)                                            \      , FUSION_GET_TRAITS_TYPE(Stream)                                          \    >#endifnamespace boost { namespace fusion{    namespace detail    {        template <typename Tag>        int get_xalloc_index(Tag* = 0)        {            // each Tag will have a unique index            static int index = std::ios::xalloc();            return index;        }        template <typename Stream, typename Tag, typename T>        struct stream_data        {            struct arena            {                ~arena()                {                    for (                        typename std::vector<T*>::iterator i = data.begin()                      ; i != data.end()                      ; ++i)                    {                        delete *i;                    }                }                std::vector<T*> data;            };            static void attach(Stream& stream, T const& data)            {                static arena ar; // our arena                ar.data.push_back(new T(data));                stream.pword(get_xalloc_index<Tag>()) = ar.data.back();            }            static T const* get(Stream& stream)            {                return (T const*)stream.pword(get_xalloc_index<Tag>());            }        };        template <class Tag, class Stream>        class string_ios_manip        {        public:            typedef FUSION_STRING_OF_STREAM(Stream) string_type;            typedef stream_data<Stream, Tag, string_type> stream_data_t;            string_ios_manip(Stream& str_)                : stream(str_)            {}            void            set(string_type const& s)            {                stream_data_t::attach(stream, s);            }            void            print(char const* default_) const            {                // print a delimiter                string_type const* p = stream_data_t::get(stream);                if (p)                    stream << *p;                else                    stream << default_;            }            void            read(char const* default_) const            {                // read a delimiter                string_type const* p = stream_data_t::get(stream);                using namespace std;                ws(stream);                if (p)                {                    typedef typename string_type::const_iterator iterator;                    for (iterator i = p->begin(); i != p->end(); ++i)                        check_delim(*i);                }                else                {                    while (*default_)                        check_delim(*default_++);                }            }        private:            template <typename Char>            void            check_delim(Char c) const            {                if (!isspace(c))                {                    if (stream.get() != c)                    {                        stream.unget();                        stream.setstate(std::ios::failbit);                    }                }            }            Stream& stream;        };    } // detail#if defined (BOOST_NO_TEMPLATED_STREAMS)#define STD_TUPLE_DEFINE_MANIPULATOR(name)                                      \    namespace detail                                                            \

⌨️ 快捷键说明

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