⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 binary.hpp

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 HPP
字号:
//  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(BOOST_SPIRIT_BINARY_MAY_08_2007_0808AM)#define BOOST_SPIRIT_BINARY_MAY_08_2007_0808AM#if defined(_MSC_VER) && (_MSC_VER >= 1020)#pragma once      // MS compatible compilers support #pragma once#endif#include <boost/spirit/home/support/component.hpp>#include <boost/spirit/home/support/detail/integer/endian.hpp>#include <boost/spirit/home/support/attribute_of.hpp>#include <boost/spirit/home/qi/domain.hpp>#include <boost/spirit/home/qi/detail/assign_to.hpp>#include <boost/spirit/home/qi/skip.hpp>namespace boost { namespace spirit { namespace qi{    namespace detail    {        template <int bits>        struct integer        {#ifdef BOOST_HAS_LONG_LONG            BOOST_MPL_ASSERT_MSG(                bits == 8 || bits == 16 || bits == 32 || bits == 64,                not_supported_binary_size, ());#else            BOOST_MPL_ASSERT_MSG(                bits == 8 || bits == 16 || bits == 32,                not_supported_binary_size, ());#endif        };        template <>        struct integer<8>        {            typedef uint_least8_t type;        };        template <>        struct integer<16>        {            typedef uint_least16_t type;        };        template <>        struct integer<32>        {            typedef uint_least32_t type;        };#ifdef BOOST_HAS_LONG_LONG        template <>        struct integer<64>        {            typedef uint_least64_t type;        };#endif        ///////////////////////////////////////////////////////////////////////        template <boost::integer::endianness bits>        struct what;        template <>        struct what<boost::integer::native>        {            static std::string is()            {                return "native-endian binary";            }        };        template <>        struct what<boost::integer::little>        {            static char const* is()            {                return "little-endian binary";            }        };        template <>        struct what<boost::integer::big>        {            static char const* is()            {                return "big-endian binary";            }        };    }    ///////////////////////////////////////////////////////////////////////////    template <integer::endianness endian, int bits>    struct any_binary_director    {        template <typename Component, typename Context, typename Iterator>        struct attribute        {            typedef boost::integer::endian<                endian, typename qi::detail::integer<bits>::type, bits            > type;        };        template <            typename Component          , typename Iterator, typename Context          , typename Skipper, typename Attribute>        static bool parse(            Component const&          , Iterator& first, Iterator const& last          , Context&, Skipper const& skipper          , Attribute& attr)        {            qi::skip(first, last, skipper);            typename                traits::attribute_of<                    qi::domain, Component, Context, Iterator>::type            attr_;            unsigned char* bytes = reinterpret_cast<unsigned char*>(&attr_);            Iterator it = first;            for (unsigned int i = 0; i < sizeof(attr_); ++i)            {                if (it == last)                    return false;                *bytes++ = *it++;            }            first = it;            detail::assign_to(attr_, attr);            return true;        }        template <typename Component, typename Context>        static std::string what(Component const& component, Context const& ctx)        {            return qi::detail::what<endian>::is();        }    };    ///////////////////////////////////////////////////////////////////////////    template <integer::endianness endian, int bits>    struct binary_lit_director    {        template <typename Component, typename Context, typename Iterator>        struct attribute        {            typedef unused_type type;        };        template <            typename Component          , typename Iterator, typename Context          , typename Skipper, typename Attribute>        static bool parse(            Component const& component          , Iterator& first, Iterator const& last          , Context&, Skipper const& skipper          , Attribute& attr)        {            qi::skip(first, last, skipper);            boost::integer::endian<                endian, typename qi::detail::integer<bits>::type, bits            > attr_ (fusion::at_c<0>(component.elements));            unsigned char* bytes = reinterpret_cast<unsigned char*>(&attr_);            Iterator it = first;            for (unsigned int i = 0; i < sizeof(attr_); ++i)            {                if (it == last || *bytes++ != *it++)                    return false;            }            first = it;            detail::assign_to(attr_, attr);            return true;        }        template <typename Component, typename Context>        static std::string what(Component const& component, Context const& ctx)        {            return qi::detail::what<endian>::is();        }    };}}}#endif

⌨️ 快捷键说明

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