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

📄 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_KARMA_BINARY_MAY_04_2007_0904AM)#define BOOST_SPIRIT_KARMA_BINARY_MAY_04_2007_0904AM#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/karma/domain.hpp>#include <boost/spirit/home/karma/detail/generate_to.hpp>#include <boost/spirit/home/karma/delimit.hpp>namespace boost { namespace spirit { namespace karma{    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 Unused>        struct attribute        {            typedef boost::integer::endian<                endian, typename karma::detail::integer<bits>::type, bits            > type;        };        template <typename Component, typename OutputIterator,            typename Context, typename Delimiter, typename Parameter>        static bool        generate(Component const& /*component*/, OutputIterator& sink,            Context& /*ctx*/, Delimiter const& d, Parameter const& param)        {            typename traits::attribute_of<                karma::domain, Component, Context>::type p (param);            unsigned char const* bytes =                reinterpret_cast<unsigned char const*>(&p);            for (unsigned int i = 0; i < sizeof(p); ++i)                detail::generate_to(sink, *bytes++);            karma::delimit(sink, d);           // always do post-delimiting            return true;        }        // this any_byte_director has no parameter attached, it needs to have        // been initialized from a direct literal        template <typename Component, typename OutputIterator,            typename Context, typename Delimiter>        static bool        generate(Component const&, OutputIterator&, Context&, Delimiter const&,            unused_type)        {            BOOST_MPL_ASSERT_MSG(false,                binary_generator_not_usable_without_attribute, ());            return false;        }        template <typename Component, typename Context>        static std::string what(Component const& component, Context const& ctx)        {            return karma::detail::what<endian>::is();        }    };    ///////////////////////////////////////////////////////////////////////////    template <integer::endianness endian, int bits>    struct binary_lit_director    {        template <typename Component, typename Context, typename Unused>        struct attribute        {            typedef unused_type type;        };        template <typename Component, typename OutputIterator,            typename Context, typename Delimiter, typename Parameter>        static bool        generate(Component const& component, OutputIterator& sink,            Context& /*ctx*/, Delimiter const& d, Parameter const& /*param*/)        {            boost::integer::endian<                endian, typename karma::detail::integer<bits>::type, bits            > p (fusion::at_c<0>(component.elements));            unsigned char const* bytes =                reinterpret_cast<unsigned char const*>(&p);            for (unsigned int i = 0; i < sizeof(p); ++i)                detail::generate_to(sink, *bytes++);            karma::delimit(sink, d);           // always do post-delimiting            return true;        }        template <typename Component, typename Context>        static std::string what(Component const& component, Context const& ctx)        {            return karma::detail::what<endian>::is();        }    };}}}#endif

⌨️ 快捷键说明

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