/*
- * Copyright 2014 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#pragma once
-#include <functional>
-#include <iostream>
+#include <cstring>
-#include <boost/operators.hpp>
+#include <array>
+#include <functional>
+#include <iosfwd>
#include <folly/Hash.h>
#include <folly/Range.h>
*
* @see IPAddress
*/
-class IPAddressV4 : boost::totally_ordered<IPAddressV4> {
+class IPAddressV4 {
public:
+ // returns true iff the input string can be parsed as an ipv4-address
+ static bool validate(StringPiece ip);
+
// create an IPAddressV4 instance from a uint32_t (network byte order)
static IPAddressV4 fromLong(uint32_t src);
// same as above but host byte order
return addr;
}
+ /**
+ * Returns the address as a Range.
+ */
+ ByteRange toBinary() const {
+ return ByteRange((const unsigned char *) &addr_.inAddr_.s_addr, 4);
+ }
+
/**
* Convert a IPv4 address string to a long in network byte order.
* @param [in] ip the address to convert
// Return the V6 mapped representation of the address.
IPAddressV6 createIPv6() const;
+ /**
+ * Return a V6 address in the format of an 6To4 address.
+ */
+ IPAddressV6 getIPv6For6To4() const;
+
// Return the long (network byte order) representation of the address.
uint32_t toLong() const {
return toAddr().s_addr;
bool inSubnetWithMask(const IPAddressV4& subnet, const ByteArray4 mask) const;
// @see IPAddress#isLoopback
- bool isLoopback() const {
- return (INADDR_LOOPBACK == toLongHBO());
- }
+ bool isLoopback() const;
+
+ // @see IPAddress#isLinkLocal
+ bool isLinkLocal() const;
// @see IPAddress#isNonroutable
bool isNonroutable() const;
// @see IPAddress#isZero
bool isZero() const {
- return detail::Bytes::isZero(bytes(), 4);
+ constexpr auto zero = ByteArray4{{}};
+ return 0 == std::memcmp(bytes(), zero.data(), zero.size());
}
bool isLinkLocalBroadcast() const {
ByteArray4 toByteArray() const {
ByteArray4 ba{{0}};
std::memcpy(ba.data(), bytes(), 4);
- return std::move(ba);
+ return ba;
}
// @see IPAddress#toFullyQualified
*/
static const ByteArray4 fetchMask(size_t numBits);
- // Given 2 IPAddressV4,mask pairs extract the longest common IPAddress,
+ // Given 2 IPAddressV4, mask pairs extract the longest common IPAddress,
// mask pair
static CIDRNetworkV4 longestCommonPrefix(
- const CIDRNetworkV4& one, const CIDRNetworkV4& two) {
- auto prefix =
- detail::Bytes::longestCommonPrefix(one.first.addr_.bytes_, one.second,
- two.first.addr_.bytes_, two.second);
- return {IPAddressV4(prefix.first), prefix.second};
- }
+ const CIDRNetworkV4& one,
+ const CIDRNetworkV4& two);
// Number of bytes in the address representation.
static size_t byteCount() { return 4; }
//get nth most significant bit - 0 indexed
private:
union AddressStorage {
+ static_assert(sizeof(in_addr) == sizeof(ByteArray4),
+ "size of in_addr and ByteArray4 are different");
in_addr inAddr_;
ByteArray4 bytes_;
AddressStorage() {
inline bool operator<(const IPAddressV4& addr1, const IPAddressV4& addr2) {
return (addr1.toLongHBO() < addr2.toLongHBO());
}
+// Derived operators
+inline bool operator!=(const IPAddressV4& a, const IPAddressV4& b) {
+ return !(a == b);
+}
+inline bool operator>(const IPAddressV4& a, const IPAddressV4& b) {
+ return b < a;
+}
+inline bool operator<=(const IPAddressV4& a, const IPAddressV4& b) {
+ return !(a > b);
+}
+inline bool operator>=(const IPAddressV4& a, const IPAddressV4& b) {
+ return !(a < b);
+}
} // folly