diff --git a/src/uvw/async.hpp b/src/uvw/async.hpp index 0785a216..2106ebd5 100644 --- a/src/uvw/async.hpp +++ b/src/uvw/async.hpp @@ -6,7 +6,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/check.hpp b/src/uvw/check.hpp index b9dbde52..f854a201 100644 --- a/src/uvw/check.hpp +++ b/src/uvw/check.hpp @@ -6,7 +6,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/dns.hpp b/src/uvw/dns.hpp index 924754a7..2fca4ee0 100644 --- a/src/uvw/dns.hpp +++ b/src/uvw/dns.hpp @@ -7,7 +7,7 @@ #include #include "event.hpp" #include "request.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/event.hpp b/src/uvw/event.hpp index 9b4e8f94..1e8346f8 100644 --- a/src/uvw/event.hpp +++ b/src/uvw/event.hpp @@ -4,7 +4,6 @@ #include #include #include -#include "util.hpp" namespace uvw { diff --git a/src/uvw/fs.hpp b/src/uvw/fs.hpp index 88b87872..b7e0c52d 100644 --- a/src/uvw/fs.hpp +++ b/src/uvw/fs.hpp @@ -8,7 +8,7 @@ #include #include "event.hpp" #include "request.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/fs_event.hpp b/src/uvw/fs_event.hpp index f25d715a..2e0c6d64 100644 --- a/src/uvw/fs_event.hpp +++ b/src/uvw/fs_event.hpp @@ -7,7 +7,7 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/fs_poll.hpp b/src/uvw/fs_poll.hpp index bbe59ad9..a57eb7d8 100644 --- a/src/uvw/fs_poll.hpp +++ b/src/uvw/fs_poll.hpp @@ -7,7 +7,7 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/handle.hpp b/src/uvw/handle.hpp index 06d537b3..89f6b3a0 100644 --- a/src/uvw/handle.hpp +++ b/src/uvw/handle.hpp @@ -6,6 +6,7 @@ #include #include #include "resource.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/idle.hpp b/src/uvw/idle.hpp index 1ccc0c1c..7f35e862 100644 --- a/src/uvw/idle.hpp +++ b/src/uvw/idle.hpp @@ -6,7 +6,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/loop.hpp b/src/uvw/loop.hpp index 208173b1..27b6aa45 100644 --- a/src/uvw/loop.hpp +++ b/src/uvw/loop.hpp @@ -8,7 +8,6 @@ #include #include #include "emitter.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/misc.hpp b/src/uvw/misc.hpp new file mode 100644 index 00000000..544396e5 --- /dev/null +++ b/src/uvw/misc.hpp @@ -0,0 +1,106 @@ +#pragma once + + +#include +#include +#include +#include +#include +#include +#include "util.hpp" + + +namespace uvw { + + +namespace details { + + +struct IPv4 { }; +struct IPv6 { }; + + +template +struct IpTraits; + +template<> +struct IpTraits { + using Type = sockaddr_in; + using AddrFuncType = int(*)(const char *, int, sockaddr_in *); + using NameFuncType = int(*)(const sockaddr_in *, char *, std::size_t); + static constexpr AddrFuncType addrFunc = &uv_ip4_addr; + static constexpr NameFuncType nameFunc = &uv_ip4_name; +}; + +template<> +struct IpTraits { + using Type = sockaddr_in6; + using AddrFuncType = int(*)(const char *, int, sockaddr_in6 *); + using NameFuncType = int(*)(const sockaddr_in6 *, char *, std::size_t); + static constexpr AddrFuncType addrFunc = &uv_ip6_addr; + static constexpr NameFuncType nameFunc = &uv_ip6_name; +}; + + +template +Addr address(const typename IpTraits::Type *aptr, int len) noexcept { + std::pair addr{}; + char name[len]; + + int err = IpTraits::nameFunc(aptr, name, len); + + if(0 == err) { + addr = { std::string{name}, ntohs(aptr->sin_port) }; + } + + /** + * See Boost/Mutant idiom: + * https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Boost_mutant + */ + return reinterpret_cast(addr); +} + + +template +Addr address(F &&f, const H *handle) noexcept { + sockaddr_storage ssto; + int len = sizeof(ssto); + Addr addr{}; + + int err = std::forward(f)(handle, reinterpret_cast(&ssto), &len); + + if(0 == err) { + typename IpTraits::Type *aptr = reinterpret_cast::Type *>(&ssto); + addr = address(aptr, len); + } + + return addr; +} + + +template +std::string path(F &&f, H *handle) noexcept { + std::size_t size = N; + char buf[size]; + std::string str{}; + auto err = std::forward(f)(handle, buf, &size); + + if(UV_ENOBUFS == err) { + std::unique_ptr data{new char[size]}; + err = std::forward(f)(handle, data.get(), &size); + + if(0 == err) { + str = data.get(); + } + } else { + str.assign(buf, size); + } + + return str; +} + + +} + + +} diff --git a/src/uvw/pipe.hpp b/src/uvw/pipe.hpp index 0d9b3c2f..9a98c6e2 100644 --- a/src/uvw/pipe.hpp +++ b/src/uvw/pipe.hpp @@ -9,7 +9,7 @@ #include "event.hpp" #include "request.hpp" #include "stream.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/poll.hpp b/src/uvw/poll.hpp index 968211f7..805d5c22 100644 --- a/src/uvw/poll.hpp +++ b/src/uvw/poll.hpp @@ -7,7 +7,7 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/prepare.hpp b/src/uvw/prepare.hpp index ae384f0b..2564688f 100644 --- a/src/uvw/prepare.hpp +++ b/src/uvw/prepare.hpp @@ -6,7 +6,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/process.hpp b/src/uvw/process.hpp index 783fa270..4575c920 100644 --- a/src/uvw/process.hpp +++ b/src/uvw/process.hpp @@ -8,7 +8,7 @@ #include "event.hpp" #include "handle.hpp" #include "stream.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/signal.hpp b/src/uvw/signal.hpp index 79357f19..4b445cdc 100644 --- a/src/uvw/signal.hpp +++ b/src/uvw/signal.hpp @@ -6,7 +6,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/stream.hpp b/src/uvw/stream.hpp index 36d04667..51e433b6 100644 --- a/src/uvw/stream.hpp +++ b/src/uvw/stream.hpp @@ -9,7 +9,6 @@ #include "event.hpp" #include "request.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/tcp.hpp b/src/uvw/tcp.hpp index cea0e9fb..dca3da3e 100644 --- a/src/uvw/tcp.hpp +++ b/src/uvw/tcp.hpp @@ -10,7 +10,7 @@ #include "event.hpp" #include "request.hpp" #include "stream.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/timer.hpp b/src/uvw/timer.hpp index 1e4c0b58..a8d29fea 100644 --- a/src/uvw/timer.hpp +++ b/src/uvw/timer.hpp @@ -7,7 +7,6 @@ #include #include "event.hpp" #include "handle.hpp" -#include "util.hpp" namespace uvw { diff --git a/src/uvw/tty.hpp b/src/uvw/tty.hpp index f11839c0..6e7f7d3f 100644 --- a/src/uvw/tty.hpp +++ b/src/uvw/tty.hpp @@ -7,7 +7,7 @@ #include #include "event.hpp" #include "stream.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/udp.hpp b/src/uvw/udp.hpp index 9a53c202..3b5fbee5 100644 --- a/src/uvw/udp.hpp +++ b/src/uvw/udp.hpp @@ -9,7 +9,7 @@ #include "event.hpp" #include "request.hpp" #include "handle.hpp" -#include "util.hpp" +#include "misc.hpp" namespace uvw { diff --git a/src/uvw/util.hpp b/src/uvw/util.hpp index 397f7de1..21bf5d50 100644 --- a/src/uvw/util.hpp +++ b/src/uvw/util.hpp @@ -177,94 +177,4 @@ using Uid = uv_uid_t; using Gid = uv_gid_t; -namespace details { - - -struct IPv4 { }; -struct IPv6 { }; - - -template -struct IpTraits; - -template<> -struct IpTraits { - using Type = sockaddr_in; - using AddrFuncType = int(*)(const char *, int, sockaddr_in *); - using NameFuncType = int(*)(const sockaddr_in *, char *, std::size_t); - static constexpr AddrFuncType addrFunc = &uv_ip4_addr; - static constexpr NameFuncType nameFunc = &uv_ip4_name; -}; - -template<> -struct IpTraits { - using Type = sockaddr_in6; - using AddrFuncType = int(*)(const char *, int, sockaddr_in6 *); - using NameFuncType = int(*)(const sockaddr_in6 *, char *, std::size_t); - static constexpr AddrFuncType addrFunc = &uv_ip6_addr; - static constexpr NameFuncType nameFunc = &uv_ip6_name; -}; - - -template -Addr address(const typename IpTraits::Type *aptr, int len) noexcept { - std::pair addr{}; - char name[len]; - - int err = IpTraits::nameFunc(aptr, name, len); - - if(0 == err) { - addr = { std::string{name}, ntohs(aptr->sin_port) }; - } - - /** - * See Boost/Mutant idiom: - * https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Boost_mutant - */ - return reinterpret_cast(addr); -} - - -template -Addr address(F &&f, const H *handle) noexcept { - sockaddr_storage ssto; - int len = sizeof(ssto); - Addr addr{}; - - int err = std::forward(f)(handle, reinterpret_cast(&ssto), &len); - - if(0 == err) { - typename IpTraits::Type *aptr = reinterpret_cast::Type *>(&ssto); - addr = address(aptr, len); - } - - return addr; -} - - -template -std::string path(F &&f, H *handle) noexcept { - std::size_t size = N; - char buf[size]; - std::string str{}; - auto err = std::forward(f)(handle, buf, &size); - - if(UV_ENOBUFS == err) { - std::unique_ptr data{new char[size]}; - err = std::forward(f)(handle, data.get(), &size); - - if(0 == err) { - str = data.get(); - } - } else { - str.assign(buf, size); - } - - return str; -} - - -} - - } diff --git a/src/uvw/work.hpp b/src/uvw/work.hpp index 4132b986..20a5e687 100644 --- a/src/uvw/work.hpp +++ b/src/uvw/work.hpp @@ -7,7 +7,6 @@ #include #include "event.hpp" #include "request.hpp" -#include "util.hpp" namespace uvw {