Home | History | Annotate | Download | only in impl
      1 //
      2 // generic/detail/impl/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_IMPL_ENDPOINT_IPP
     12 #define ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP
     13 
     14 
     15 #include "asio/detail/config.hpp"
     16 
     17 #include <cstring>
     18 #include <typeinfo>
     19 #include "asio/detail/socket_ops.hpp"
     20 #include "asio/detail/throw_error.hpp"
     21 #include "asio/detail/throw_exception.hpp"
     22 #include "asio/error.hpp"
     23 #include "asio/generic/detail/endpoint.hpp"
     24 
     25 #include "asio/detail/push_options.hpp"
     26 
     27 namespace asio {
     28 namespace generic {
     29 namespace detail {
     30 
     31 endpoint::endpoint()
     32 {
     33   init(0, 0, 0);
     34 }
     35 
     36 endpoint::endpoint(const void* sock_addr,
     37     std::size_t sock_addr_size, int sock_protocol)
     38 {
     39   init(sock_addr, sock_addr_size, sock_protocol);
     40 }
     41 
     42 void endpoint::resize(std::size_t new_size)
     43 {
     44   if (new_size > sizeof(asio::detail::sockaddr_storage_type))
     45   {
     46     asio::error_code ec(asio::error::invalid_argument);
     47     asio::detail::throw_error(ec);
     48   }
     49   else
     50   {
     51     size_ = new_size;
     52     protocol_ = 0;
     53   }
     54 }
     55 
     56 bool operator==(const endpoint& e1, const endpoint& e2)
     57 {
     58   using namespace std; // For memcmp.
     59   return e1.size() == e2.size() && memcmp(e1.data(), e2.data(), e1.size()) == 0;
     60 }
     61 
     62 bool operator<(const endpoint& e1, const endpoint& e2)
     63 {
     64   if (e1.protocol() < e2.protocol())
     65     return true;
     66 
     67   if (e1.protocol() > e2.protocol())
     68     return false;
     69 
     70   using namespace std; // For memcmp.
     71   std::size_t compare_size = e1.size() < e2.size() ? e1.size() : e2.size();
     72   int compare_result = memcmp(e1.data(), e2.data(), compare_size);
     73 
     74   if (compare_result < 0)
     75     return true;
     76 
     77   if (compare_result > 0)
     78     return false;
     79 
     80   return e1.size() < e2.size();
     81 }
     82 
     83 void endpoint::init(const void* sock_addr,
     84     std::size_t sock_addr_size, int sock_protocol)
     85 {
     86   if (sock_addr_size > sizeof(asio::detail::sockaddr_storage_type))
     87   {
     88     asio::error_code ec(asio::error::invalid_argument);
     89     asio::detail::throw_error(ec);
     90   }
     91 
     92   using namespace std; // For memset and memcpy.
     93   memset(&data_.generic, 0, sizeof(asio::detail::sockaddr_storage_type));
     94   memcpy(&data_.generic, sock_addr, sock_addr_size);
     95 
     96   size_ = sock_addr_size;
     97   protocol_ = sock_protocol;
     98 }
     99 
    100 } // namespace detail
    101 } // namespace generic
    102 } // namespace asio
    103 
    104 #include "asio/detail/pop_options.hpp"
    105 
    106 #endif // ASIO_GENERIC_DETAIL_IMPL_ENDPOINT_IPP
    107