Home | History | Annotate | Download | only in detail
      1 //
      2 // generic/detail/endpoint.hpp
      3 // ~~~~~~~~~~~~~~~~~~~~~~~~~~~
      4 //
      5 // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com)
      6 //
      7 // Distributed under the Boost Software License, Version 1.0. (See accompanying
      8 // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
      9 //
     10 
     11 #ifndef ASIO_GENERIC_DETAIL_ENDPOINT_HPP
     12 #define ASIO_GENERIC_DETAIL_ENDPOINT_HPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 
     17 #include <cstddef>
     18 #include "asio/detail/socket_types.hpp"
     19 
     20 #include "asio/detail/push_options.hpp"
     21 
     22 namespace asio {
     23 namespace generic {
     24 namespace detail {
     25 
     26 // Helper class for implementing a generic socket endpoint.
     27 class endpoint
     28 {
     29 public:
     30   // Default constructor.
     31   ASIO_DECL endpoint();
     32 
     33   // Construct an endpoint from the specified raw bytes.
     34   ASIO_DECL endpoint(const void* sock_addr,
     35       std::size_t sock_addr_size, int sock_protocol);
     36 
     37   // Copy constructor.
     38   endpoint(const endpoint& other)
     39     : data_(other.data_),
     40       size_(other.size_),
     41       protocol_(other.protocol_)
     42   {
     43   }
     44 
     45   // Assign from another endpoint.
     46   endpoint& operator=(const endpoint& other)
     47   {
     48     data_ = other.data_;
     49     size_ = other.size_;
     50     protocol_ = other.protocol_;
     51     return *this;
     52   }
     53 
     54   // Get the address family associated with the endpoint.
     55   int family() const
     56   {
     57     return data_.base.sa_family;
     58   }
     59 
     60   // Get the socket protocol associated with the endpoint.
     61   int protocol() const
     62   {
     63     return protocol_;
     64   }
     65 
     66   // Get the underlying endpoint in the native type.
     67   asio::detail::socket_addr_type* data()
     68   {
     69     return &data_.base;
     70   }
     71 
     72   // Get the underlying endpoint in the native type.
     73   const asio::detail::socket_addr_type* data() const
     74   {
     75     return &data_.base;
     76   }
     77 
     78   // Get the underlying size of the endpoint in the native type.
     79   std::size_t size() const
     80   {
     81     return size_;
     82   }
     83 
     84   // Set the underlying size of the endpoint in the native type.
     85   ASIO_DECL void resize(std::size_t size);
     86 
     87   // Get the capacity of the endpoint in the native type.
     88   std::size_t capacity() const
     89   {
     90     return sizeof(asio::detail::sockaddr_storage_type);
     91   }
     92 
     93   // Compare two endpoints for equality.
     94   ASIO_DECL friend bool operator==(
     95       const endpoint& e1, const endpoint& e2);
     96 
     97   // Compare endpoints for ordering.
     98   ASIO_DECL friend bool operator<(
     99       const endpoint& e1, const endpoint& e2);
    100 
    101 private:
    102   // The underlying socket address.
    103   union data_union
    104   {
    105     asio::detail::socket_addr_type base;
    106     asio::detail::sockaddr_storage_type generic;
    107   } data_;
    108 
    109   // The length of the socket address stored in the endpoint.
    110   std::size_t size_;
    111 
    112   // The socket protocol associated with the endpoint.
    113   int protocol_;
    114 
    115   // Initialise with a specified memory.
    116   ASIO_DECL void init(const void* sock_addr,
    117       std::size_t sock_addr_size, int sock_protocol);
    118 };
    119 
    120 } // namespace detail
    121 } // namespace generic
    122 } // namespace asio
    123 
    124 #include "asio/detail/pop_options.hpp"
    125 
    126 # include "asio/generic/detail/impl/endpoint.ipp"
    127 
    128 #endif // ASIO_GENERIC_DETAIL_ENDPOINT_HPP
    129