521 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			521 lines
		
	
	
		
			19 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  boost/system/error_code.hpp  ---------------------------------------------//
 | 
						|
 | 
						|
//  Copyright Beman Dawes 2006, 2007
 | 
						|
//  Copyright Christoper Kohlhoff 2007
 | 
						|
 | 
						|
//  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)
 | 
						|
 | 
						|
//  See library home page at http://www.boost.org/libs/system
 | 
						|
 | 
						|
#ifndef BOOST_ERROR_CODE_HPP
 | 
						|
#define BOOST_ERROR_CODE_HPP
 | 
						|
 | 
						|
#include <boost/system/config.hpp>
 | 
						|
#include <boost/cstdint.hpp>
 | 
						|
#include <boost/assert.hpp>
 | 
						|
#include <boost/noncopyable.hpp>
 | 
						|
#include <boost/utility/enable_if.hpp>
 | 
						|
#include <ostream>
 | 
						|
#include <string>
 | 
						|
#include <stdexcept>
 | 
						|
#include <functional>
 | 
						|
 | 
						|
// TODO: undef these macros if not already defined
 | 
						|
#include <boost/cerrno.hpp>
 | 
						|
 | 
						|
#if !defined(BOOST_POSIX_API) && !defined(BOOST_WINDOWS_API)
 | 
						|
#  error BOOST_POSIX_API or BOOST_WINDOWS_API must be defined
 | 
						|
#endif
 | 
						|
 | 
						|
#include <boost/config/abi_prefix.hpp> // must be the last #include
 | 
						|
 | 
						|
#ifndef BOOST_SYSTEM_NOEXCEPT
 | 
						|
#define BOOST_SYSTEM_NOEXCEPT BOOST_NOEXCEPT
 | 
						|
#endif
 | 
						|
 | 
						|
namespace boost
 | 
						|
{
 | 
						|
  namespace system
 | 
						|
  {
 | 
						|
 | 
						|
    class error_code;
 | 
						|
    class error_condition;
 | 
						|
 | 
						|
    //  "Concept" helpers  ---------------------------------------------------//
 | 
						|
 | 
						|
    template< class T >
 | 
						|
    struct is_error_code_enum { static const bool value = false; };
 | 
						|
 | 
						|
    template< class T >
 | 
						|
    struct is_error_condition_enum { static const bool value = false; };
 | 
						|
 | 
						|
    //  generic error_conditions  --------------------------------------------//
 | 
						|
 | 
						|
    namespace errc
 | 
						|
    {
 | 
						|
      enum errc_t
 | 
						|
      {
 | 
						|
        success = 0,
 | 
						|
        address_family_not_supported = EAFNOSUPPORT,
 | 
						|
        address_in_use = EADDRINUSE,
 | 
						|
        address_not_available = EADDRNOTAVAIL,
 | 
						|
        already_connected = EISCONN,
 | 
						|
        argument_list_too_long = E2BIG,
 | 
						|
        argument_out_of_domain = EDOM,
 | 
						|
        bad_address = EFAULT,
 | 
						|
        bad_file_descriptor = EBADF,
 | 
						|
        bad_message = EBADMSG,
 | 
						|
        broken_pipe = EPIPE,
 | 
						|
        connection_aborted = ECONNABORTED,
 | 
						|
        connection_already_in_progress = EALREADY,
 | 
						|
        connection_refused = ECONNREFUSED,
 | 
						|
        connection_reset = ECONNRESET,
 | 
						|
        cross_device_link = EXDEV,
 | 
						|
        destination_address_required = EDESTADDRREQ,
 | 
						|
        device_or_resource_busy = EBUSY,
 | 
						|
        directory_not_empty = ENOTEMPTY,
 | 
						|
        executable_format_error = ENOEXEC,
 | 
						|
        file_exists = EEXIST,
 | 
						|
        file_too_large = EFBIG,
 | 
						|
        filename_too_long = ENAMETOOLONG,
 | 
						|
        function_not_supported = ENOSYS,
 | 
						|
        host_unreachable = EHOSTUNREACH,
 | 
						|
        identifier_removed = EIDRM,
 | 
						|
        illegal_byte_sequence = EILSEQ,
 | 
						|
        inappropriate_io_control_operation = ENOTTY,
 | 
						|
        interrupted = EINTR,
 | 
						|
        invalid_argument = EINVAL,
 | 
						|
        invalid_seek = ESPIPE,
 | 
						|
        io_error = EIO,
 | 
						|
        is_a_directory = EISDIR,
 | 
						|
        message_size = EMSGSIZE,
 | 
						|
        network_down = ENETDOWN,
 | 
						|
        network_reset = ENETRESET,
 | 
						|
        network_unreachable = ENETUNREACH,
 | 
						|
        no_buffer_space = ENOBUFS,
 | 
						|
        no_child_process = ECHILD,
 | 
						|
        no_link = ENOLINK,
 | 
						|
        no_lock_available = ENOLCK,
 | 
						|
        no_message_available = ENODATA,
 | 
						|
        no_message = ENOMSG,
 | 
						|
        no_protocol_option = ENOPROTOOPT,
 | 
						|
        no_space_on_device = ENOSPC,
 | 
						|
        no_stream_resources = ENOSR,
 | 
						|
        no_such_device_or_address = ENXIO,
 | 
						|
        no_such_device = ENODEV,
 | 
						|
        no_such_file_or_directory = ENOENT,
 | 
						|
        no_such_process = ESRCH,
 | 
						|
        not_a_directory = ENOTDIR,
 | 
						|
        not_a_socket = ENOTSOCK,
 | 
						|
        not_a_stream = ENOSTR,
 | 
						|
        not_connected = ENOTCONN,
 | 
						|
        not_enough_memory = ENOMEM,
 | 
						|
        not_supported = ENOTSUP,
 | 
						|
        operation_canceled = ECANCELED,
 | 
						|
        operation_in_progress = EINPROGRESS,
 | 
						|
        operation_not_permitted = EPERM,
 | 
						|
        operation_not_supported = EOPNOTSUPP,
 | 
						|
        operation_would_block = EWOULDBLOCK,
 | 
						|
        owner_dead = EOWNERDEAD,
 | 
						|
        permission_denied = EACCES,
 | 
						|
        protocol_error = EPROTO,
 | 
						|
        protocol_not_supported = EPROTONOSUPPORT,
 | 
						|
        read_only_file_system = EROFS,
 | 
						|
        resource_deadlock_would_occur = EDEADLK,
 | 
						|
        resource_unavailable_try_again = EAGAIN,
 | 
						|
        result_out_of_range = ERANGE,
 | 
						|
        state_not_recoverable = ENOTRECOVERABLE,
 | 
						|
        stream_timeout = ETIME,
 | 
						|
        text_file_busy = ETXTBSY,
 | 
						|
        timed_out = ETIMEDOUT,
 | 
						|
        too_many_files_open_in_system = ENFILE,
 | 
						|
        too_many_files_open = EMFILE,
 | 
						|
        too_many_links = EMLINK,
 | 
						|
        too_many_symbolic_link_levels = ELOOP,
 | 
						|
        value_too_large = EOVERFLOW,
 | 
						|
        wrong_protocol_type = EPROTOTYPE
 | 
						|
      };
 | 
						|
 | 
						|
    } // namespace errc
 | 
						|
 | 
						|
# ifndef BOOST_SYSTEM_NO_DEPRECATED
 | 
						|
    namespace posix = errc;
 | 
						|
    namespace posix_error = errc;
 | 
						|
# endif
 | 
						|
 | 
						|
    template<> struct is_error_condition_enum<errc::errc_t>
 | 
						|
      { static const bool value = true; };
 | 
						|
 | 
						|
 | 
						|
    //  ----------------------------------------------------------------------//
 | 
						|
 | 
						|
    //  Operating system specific interfaces  --------------------------------//
 | 
						|
 | 
						|
 | 
						|
    //  The interface is divided into general and system-specific portions to
 | 
						|
    //  meet these requirements:
 | 
						|
    //
 | 
						|
    //  * Code calling an operating system API can create an error_code with
 | 
						|
    //    a single category (system_category), even for POSIX-like operating
 | 
						|
    //    systems that return some POSIX errno values and some native errno
 | 
						|
    //    values. This code should not have to pay the cost of distinguishing
 | 
						|
    //    between categories, since it is not yet known if that is needed.
 | 
						|
    //
 | 
						|
    //  * Users wishing to write system-specific code should be given enums for
 | 
						|
    //    at least the common error cases.
 | 
						|
    //
 | 
						|
    //  * System specific code should fail at compile time if moved to another
 | 
						|
    //    operating system.
 | 
						|
 | 
						|
    //  The system specific portions of the interface are located in headers
 | 
						|
    //  with names reflecting the operating system. For example,
 | 
						|
    //
 | 
						|
    //       <boost/system/cygwin_error.hpp>
 | 
						|
    //       <boost/system/linux_error.hpp>
 | 
						|
    //       <boost/system/windows_error.hpp>
 | 
						|
    //
 | 
						|
    //  These headers are effectively empty for compiles on operating systems
 | 
						|
    //  where they are not applicable.
 | 
						|
 | 
						|
    //  ----------------------------------------------------------------------//
 | 
						|
 | 
						|
    //  class error_category  ------------------------------------------------//
 | 
						|
 | 
						|
    class error_category : public noncopyable
 | 
						|
    {
 | 
						|
    public:
 | 
						|
      virtual ~error_category(){}
 | 
						|
 | 
						|
      virtual const char *     name() const BOOST_SYSTEM_NOEXCEPT = 0;
 | 
						|
      virtual std::string      message( int ev ) const = 0;
 | 
						|
      inline virtual error_condition  default_error_condition( int ev ) const  BOOST_SYSTEM_NOEXCEPT;
 | 
						|
      inline virtual bool             equivalent( int code,
 | 
						|
                                           const error_condition & condition ) const  BOOST_SYSTEM_NOEXCEPT;
 | 
						|
      inline virtual bool             equivalent( const error_code & code,
 | 
						|
                                           int condition ) const  BOOST_SYSTEM_NOEXCEPT;
 | 
						|
 | 
						|
      bool operator==(const error_category & rhs) const BOOST_SYSTEM_NOEXCEPT { return this == &rhs; }
 | 
						|
      bool operator!=(const error_category & rhs) const BOOST_SYSTEM_NOEXCEPT { return this != &rhs; }
 | 
						|
      bool operator<( const error_category & rhs ) const BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        return std::less<const error_category*>()( this, &rhs );
 | 
						|
      }
 | 
						|
    };
 | 
						|
 | 
						|
    //  predefined error categories  -----------------------------------------//
 | 
						|
 | 
						|
# ifdef BOOST_ERROR_CODE_HEADER_ONLY
 | 
						|
    inline const error_category &  system_category() BOOST_SYSTEM_NOEXCEPT;
 | 
						|
    inline const error_category &  generic_category() BOOST_SYSTEM_NOEXCEPT;
 | 
						|
#else
 | 
						|
    BOOST_SYSTEM_DECL const error_category &  system_category() BOOST_SYSTEM_NOEXCEPT;
 | 
						|
    BOOST_SYSTEM_DECL const error_category &  generic_category() BOOST_SYSTEM_NOEXCEPT;
 | 
						|
#endif
 | 
						|
    //  deprecated synonyms --------------------------------------------------//
 | 
						|
 | 
						|
# ifndef BOOST_SYSTEM_NO_DEPRECATED
 | 
						|
    inline const error_category &  get_system_category() { return system_category(); }
 | 
						|
    inline const error_category &  get_generic_category() { return generic_category(); }
 | 
						|
    inline const error_category &  get_posix_category() { return generic_category(); }
 | 
						|
    static const error_category &  posix_category = generic_category();
 | 
						|
    static const error_category &  errno_ecat     = generic_category();
 | 
						|
    static const error_category &  native_ecat    = system_category();
 | 
						|
# endif
 | 
						|
 | 
						|
    //  class error_condition  -----------------------------------------------//
 | 
						|
 | 
						|
    //  error_conditions are portable, error_codes are system or library specific
 | 
						|
 | 
						|
    class error_condition
 | 
						|
    {
 | 
						|
    public:
 | 
						|
 | 
						|
      // constructors:
 | 
						|
      error_condition() BOOST_SYSTEM_NOEXCEPT : m_val(0), m_cat(&generic_category()) {}
 | 
						|
      error_condition( int val, const error_category & cat ) BOOST_SYSTEM_NOEXCEPT : m_val(val), m_cat(&cat) {}
 | 
						|
 | 
						|
      template <class ErrorConditionEnum>
 | 
						|
        error_condition(ErrorConditionEnum e,
 | 
						|
          typename boost::enable_if<is_error_condition_enum<ErrorConditionEnum> >::type* = 0) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        *this = make_error_condition(e);
 | 
						|
      }
 | 
						|
 | 
						|
      // modifiers:
 | 
						|
 | 
						|
      void assign( int val, const error_category & cat ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        m_val = val;
 | 
						|
        m_cat = &cat;
 | 
						|
      }
 | 
						|
 | 
						|
      template<typename ErrorConditionEnum>
 | 
						|
        typename boost::enable_if<is_error_condition_enum<ErrorConditionEnum>, error_condition>::type &
 | 
						|
          operator=( ErrorConditionEnum val ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        *this = make_error_condition(val);
 | 
						|
        return *this;
 | 
						|
      }
 | 
						|
 | 
						|
      void clear() BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        m_val = 0;
 | 
						|
        m_cat = &generic_category();
 | 
						|
      }
 | 
						|
 | 
						|
      // observers:
 | 
						|
      int                     value() const BOOST_SYSTEM_NOEXCEPT    { return m_val; }
 | 
						|
      const error_category &  category() const BOOST_SYSTEM_NOEXCEPT { return *m_cat; }
 | 
						|
      std::string             message() const  { return m_cat->message(value()); }
 | 
						|
 | 
						|
      typedef void (*unspecified_bool_type)();
 | 
						|
      static void unspecified_bool_true() {}
 | 
						|
 | 
						|
      operator unspecified_bool_type() const BOOST_SYSTEM_NOEXCEPT  // true if error
 | 
						|
      {
 | 
						|
        return m_val == 0 ? 0 : unspecified_bool_true;
 | 
						|
      }
 | 
						|
 | 
						|
      bool operator!() const BOOST_SYSTEM_NOEXCEPT  // true if no error
 | 
						|
      {
 | 
						|
        return m_val == 0;
 | 
						|
      }
 | 
						|
 | 
						|
      // relationals:
 | 
						|
      //  the more symmetrical non-member syntax allows enum
 | 
						|
      //  conversions work for both rhs and lhs.
 | 
						|
      inline friend bool operator==( const error_condition & lhs,
 | 
						|
                                     const error_condition & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        return lhs.m_cat == rhs.m_cat && lhs.m_val == rhs.m_val;
 | 
						|
      }
 | 
						|
 | 
						|
      inline friend bool operator<( const error_condition & lhs,
 | 
						|
                                    const error_condition & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
        //  the more symmetrical non-member syntax allows enum
 | 
						|
        //  conversions work for both rhs and lhs.
 | 
						|
      {
 | 
						|
        return lhs.m_cat < rhs.m_cat
 | 
						|
          || (lhs.m_cat == rhs.m_cat && lhs.m_val < rhs.m_val);
 | 
						|
      }
 | 
						|
 | 
						|
    private:
 | 
						|
      int                     m_val;
 | 
						|
      const error_category *  m_cat;
 | 
						|
 | 
						|
    };
 | 
						|
 | 
						|
    //  class error_code  ----------------------------------------------------//
 | 
						|
 | 
						|
    //  We want error_code to be a value type that can be copied without slicing
 | 
						|
    //  and without requiring heap allocation, but we also want it to have
 | 
						|
    //  polymorphic behavior based on the error category. This is achieved by
 | 
						|
    //  abstract base class error_category supplying the polymorphic behavior,
 | 
						|
    //  and error_code containing a pointer to an object of a type derived
 | 
						|
    //  from error_category.
 | 
						|
    class error_code
 | 
						|
    {
 | 
						|
    public:
 | 
						|
 | 
						|
      // constructors:
 | 
						|
      error_code() BOOST_SYSTEM_NOEXCEPT : m_val(0), m_cat(&system_category()) {}
 | 
						|
      error_code( int val, const error_category & cat ) BOOST_SYSTEM_NOEXCEPT : m_val(val), m_cat(&cat) {}
 | 
						|
 | 
						|
      template <class ErrorCodeEnum>
 | 
						|
        error_code(ErrorCodeEnum e,
 | 
						|
          typename boost::enable_if<is_error_code_enum<ErrorCodeEnum> >::type* = 0) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        *this = make_error_code(e);
 | 
						|
      }
 | 
						|
 | 
						|
      // modifiers:
 | 
						|
      void assign( int val, const error_category & cat ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        m_val = val;
 | 
						|
        m_cat = &cat;
 | 
						|
      }
 | 
						|
 | 
						|
      template<typename ErrorCodeEnum>
 | 
						|
        typename boost::enable_if<is_error_code_enum<ErrorCodeEnum>, error_code>::type &
 | 
						|
          operator=( ErrorCodeEnum val ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        *this = make_error_code(val);
 | 
						|
        return *this;
 | 
						|
      }
 | 
						|
 | 
						|
      void clear() BOOST_SYSTEM_NOEXCEPT
 | 
						|
      {
 | 
						|
        m_val = 0;
 | 
						|
        m_cat = &system_category();
 | 
						|
      }
 | 
						|
 | 
						|
      // observers:
 | 
						|
      int                     value() const  BOOST_SYSTEM_NOEXCEPT   { return m_val; }
 | 
						|
      const error_category &  category() const BOOST_SYSTEM_NOEXCEPT { return *m_cat; }
 | 
						|
      error_condition         default_error_condition() const BOOST_SYSTEM_NOEXCEPT  { return m_cat->default_error_condition(value()); }
 | 
						|
      std::string             message() const  { return m_cat->message(value()); }
 | 
						|
 | 
						|
      typedef void (*unspecified_bool_type)();
 | 
						|
      static void unspecified_bool_true() {}
 | 
						|
 | 
						|
      operator unspecified_bool_type() const  BOOST_SYSTEM_NOEXCEPT // true if error
 | 
						|
      {
 | 
						|
        return m_val == 0 ? 0 : unspecified_bool_true;
 | 
						|
      }
 | 
						|
 | 
						|
      bool operator!() const  BOOST_SYSTEM_NOEXCEPT // true if no error
 | 
						|
      {
 | 
						|
        return m_val == 0;
 | 
						|
      }
 | 
						|
 | 
						|
      // relationals:
 | 
						|
      inline friend bool operator==( const error_code & lhs,
 | 
						|
                                     const error_code & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
        //  the more symmetrical non-member syntax allows enum
 | 
						|
        //  conversions work for both rhs and lhs.
 | 
						|
      {
 | 
						|
        return lhs.m_cat == rhs.m_cat && lhs.m_val == rhs.m_val;
 | 
						|
      }
 | 
						|
 | 
						|
      inline friend bool operator<( const error_code & lhs,
 | 
						|
                                    const error_code & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
        //  the more symmetrical non-member syntax allows enum
 | 
						|
        //  conversions work for both rhs and lhs.
 | 
						|
      {
 | 
						|
        return lhs.m_cat < rhs.m_cat
 | 
						|
          || (lhs.m_cat == rhs.m_cat && lhs.m_val < rhs.m_val);
 | 
						|
      }
 | 
						|
 | 
						|
    private:
 | 
						|
      int                     m_val;
 | 
						|
      const error_category *  m_cat;
 | 
						|
 | 
						|
    };
 | 
						|
 | 
						|
    //  predefined error_code object used as "throw on error" tag
 | 
						|
# ifndef BOOST_SYSTEM_NO_DEPRECATED
 | 
						|
    BOOST_SYSTEM_DECL extern error_code throws;
 | 
						|
# endif
 | 
						|
 | 
						|
    //  Moving from a "throws" object to a "throws" function without breaking
 | 
						|
    //  existing code is a bit of a problem. The workaround is to place the
 | 
						|
    //  "throws" function in namespace boost rather than namespace boost::system.
 | 
						|
 | 
						|
  }  // namespace system
 | 
						|
 | 
						|
  namespace detail { inline system::error_code * throws() { return 0; } }
 | 
						|
    //  Misuse of the error_code object is turned into a noisy failure by
 | 
						|
    //  poisoning the reference. This particular implementation doesn't
 | 
						|
    //  produce warnings or errors from popular compilers, is very efficient
 | 
						|
    //  (as determined by inspecting generated code), and does not suffer
 | 
						|
    //  from order of initialization problems. In practice, it also seems
 | 
						|
    //  cause user function error handling implementation errors to be detected
 | 
						|
    //  very early in the development cycle.
 | 
						|
 | 
						|
  inline system::error_code & throws()
 | 
						|
    { return *detail::throws(); }
 | 
						|
 | 
						|
  namespace system
 | 
						|
  {
 | 
						|
    //  non-member functions  ------------------------------------------------//
 | 
						|
 | 
						|
    inline bool operator!=( const error_code & lhs,
 | 
						|
                            const error_code & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return !(lhs == rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    inline bool operator!=( const error_condition & lhs,
 | 
						|
                            const error_condition & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return !(lhs == rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    inline bool operator==( const error_code & code,
 | 
						|
                            const error_condition & condition ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return code.category().equivalent( code.value(), condition )
 | 
						|
        || condition.category().equivalent( code, condition.value() );
 | 
						|
    }
 | 
						|
 | 
						|
    inline bool operator!=( const error_code & lhs,
 | 
						|
                            const error_condition & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return !(lhs == rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    inline bool operator==( const error_condition & condition,
 | 
						|
                            const error_code & code ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return condition.category().equivalent( code, condition.value() )
 | 
						|
        || code.category().equivalent( code.value(), condition );
 | 
						|
    }
 | 
						|
 | 
						|
    inline bool operator!=( const error_condition & lhs,
 | 
						|
                            const error_code & rhs ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return !(lhs == rhs);
 | 
						|
    }
 | 
						|
 | 
						|
    // TODO: both of these may move elsewhere, but the LWG hasn't spoken yet.
 | 
						|
 | 
						|
    template <class charT, class traits>
 | 
						|
    inline std::basic_ostream<charT,traits>&
 | 
						|
      operator<< (std::basic_ostream<charT,traits>& os, error_code ec)
 | 
						|
    {
 | 
						|
      os << ec.category().name() << ':' << ec.value();
 | 
						|
      return os;
 | 
						|
    }
 | 
						|
 | 
						|
    inline std::size_t hash_value( const error_code & ec )
 | 
						|
    {
 | 
						|
      return static_cast<std::size_t>(ec.value())
 | 
						|
        + reinterpret_cast<std::size_t>(&ec.category());
 | 
						|
    }
 | 
						|
 | 
						|
    //  make_* functions for errc::errc_t  -----------------------------//
 | 
						|
 | 
						|
    namespace errc
 | 
						|
    {
 | 
						|
      //  explicit conversion:
 | 
						|
      inline error_code make_error_code( errc_t e ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
        { return error_code( e, generic_category() ); }
 | 
						|
 | 
						|
      //  implicit conversion:
 | 
						|
      inline error_condition make_error_condition( errc_t e ) BOOST_SYSTEM_NOEXCEPT
 | 
						|
        { return error_condition( e, generic_category() ); }
 | 
						|
    }
 | 
						|
 | 
						|
    //  error_category default implementation  -------------------------------//
 | 
						|
 | 
						|
    error_condition error_category::default_error_condition( int ev ) const BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return error_condition( ev, *this );
 | 
						|
    }
 | 
						|
 | 
						|
    bool error_category::equivalent( int code,
 | 
						|
      const error_condition & condition ) const BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return default_error_condition( code ) == condition;
 | 
						|
    }
 | 
						|
 | 
						|
    bool error_category::equivalent( const error_code & code,
 | 
						|
      int condition ) const BOOST_SYSTEM_NOEXCEPT
 | 
						|
    {
 | 
						|
      return *this == code.category() && code.value() == condition;
 | 
						|
    }
 | 
						|
 | 
						|
  } // namespace system
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
 | 
						|
 | 
						|
# ifdef BOOST_ERROR_CODE_HEADER_ONLY
 | 
						|
#   include <boost/system/detail/error_code.ipp>
 | 
						|
# endif
 | 
						|
 | 
						|
#endif // BOOST_ERROR_CODE_HPP
 | 
						|
 | 
						|
 |