diff options
author | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
---|---|---|
committer | Kae <80987908+Novaenia@users.noreply.github.com> | 2023-06-20 14:33:09 +1000 |
commit | 6352e8e3196f78388b6c771073f9e03eaa612673 (patch) | |
tree | e23772f79a7fbc41bc9108951e9e136857484bf4 /source/core/StarHostAddress.hpp | |
parent | 6741a057e5639280d85d0f88ba26f000baa58f61 (diff) |
everything everywhere
all at once
Diffstat (limited to 'source/core/StarHostAddress.hpp')
-rw-r--r-- | source/core/StarHostAddress.hpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/source/core/StarHostAddress.hpp b/source/core/StarHostAddress.hpp new file mode 100644 index 0000000..2f5a128 --- /dev/null +++ b/source/core/StarHostAddress.hpp @@ -0,0 +1,89 @@ +#ifndef STAR_HOST_ADDRESS_HPP +#define STAR_HOST_ADDRESS_HPP + +#include "StarString.hpp" +#include "StarEither.hpp" + +namespace Star { + +STAR_EXCEPTION(NetworkException, IOException); + +STAR_CLASS(HostAddress); + +enum class NetworkMode { + IPv4, + IPv6 +}; + +class HostAddress { +public: + static HostAddress localhost(NetworkMode mode = NetworkMode::IPv4); + + // Returns either error or valid HostAddress + static Either<String, HostAddress> lookup(String const& address); + + // If address is nullptr, constructs the zero address. + HostAddress(NetworkMode mode = NetworkMode::IPv4, uint8_t* address = nullptr); + // Throws if address is not valid + explicit HostAddress(String const& address); + + NetworkMode mode() const; + uint8_t const* bytes() const; + uint8_t octet(size_t i) const; + size_t size() const; + + bool isLocalHost() const; + bool isZero() const; + + bool operator==(HostAddress const& a) const; + +private: + void set(String const& address); + void set(NetworkMode mode, uint8_t const* addr); + + NetworkMode m_mode; + uint8_t m_address[16]; +}; + +std::ostream& operator<<(std::ostream& os, HostAddress const& address); + +template <> +struct hash<HostAddress> { + size_t operator()(HostAddress const& address) const; +}; + +class HostAddressWithPort { +public: + // Returns either error or valid HostAddressWithPort + static Either<String, HostAddressWithPort> lookup(String const& address, uint16_t port); + // Format may have [] brackets around address or not, to distinguish address + // portion from port portion. + static Either<String, HostAddressWithPort> lookupWithPort(String const& address); + + HostAddressWithPort(); + HostAddressWithPort(HostAddress const& address, uint16_t port); + HostAddressWithPort(NetworkMode mode, uint8_t* address, uint16_t port); + // Throws if address or port is not valid + HostAddressWithPort(String const& address, uint16_t port); + explicit HostAddressWithPort(String const& address); + + HostAddress address() const; + uint16_t port() const; + + bool operator==(HostAddressWithPort const& a) const; + +private: + HostAddress m_address; + uint16_t m_port; +}; + +std::ostream& operator<<(std::ostream& os, HostAddressWithPort const& address); + +template <> +struct hash<HostAddressWithPort> { + size_t operator()(HostAddressWithPort const& address) const; +}; + +} + +#endif |