// 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 "net/third_party/quiche/src/quic/platform/api/quic_ip_address.h"
#include "net/third_party/quiche/src/common/platform/api/quiche_str_cat.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 quiche::QuicheStrCat(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_
