blob: e3df295967dd099e6461ab30dadaa7267a5c9343 [file] [log] [blame]
// Copyright (c) 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef QUICHE_QUIC_QBONE_PLATFORM_IP_RANGE_H_
#define QUICHE_QUIC_QBONE_PLATFORM_IP_RANGE_H_
#include "absl/strings/str_cat.h"
#include "quic/platform/api/quic_ip_address.h"
namespace quic {
class IpRange {
public:
// Default constructor to have an uninitialized IpRange.
IpRange() : prefix_length_(0) {}
// prefix will be automatically truncated to prefix_length, so that any bit
// after prefix_length are zero.
IpRange(const QuicIpAddress& prefix, size_t prefix_length);
bool operator==(IpRange other) const;
bool operator!=(IpRange other) const;
// Parses range that looks like "10.0.0.1/8". Tailing bits will be set to zero
// after prefix_length. Return false if the parsing failed.
bool FromString(const std::string& range);
// Returns the string representation of this object.
std::string ToString() const {
if (IsInitialized()) {
return absl::StrCat(prefix_.ToString(), "/", prefix_length_);
}
return "(uninitialized)";
}
// Whether this object is initialized.
bool IsInitialized() const { return prefix_.IsInitialized(); }
// Returns the first available IP address in this IpRange. The resulting
// address will be uninitialized if there is no available address.
QuicIpAddress FirstAddressInRange() const;
// The address family of this IpRange.
IpAddressFamily address_family() const { return prefix_.address_family(); }
// The subnet's prefix address.
QuicIpAddress prefix() const { return prefix_; }
// The subnet's prefix length.
size_t prefix_length() const { return prefix_length_; }
private:
QuicIpAddress prefix_;
size_t prefix_length_;
};
} // namespace quic
#endif // QUICHE_QUIC_QBONE_PLATFORM_IP_RANGE_H_