//
// Copyright (C) 2013 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

#ifndef SHILL_IP_ADDRESS_STORE_H_
#define SHILL_IP_ADDRESS_STORE_H_

#include <random>
#include <set>

#include "shill/net/ip_address.h"

namespace shill {

struct IPAddressLTIgnorePrefix {
  bool operator () (const IPAddress& lhs, const IPAddress& rhs) const;
};

// Stores a set of IP addresses used by ConnectionHealthChecker to check
// connectivity when there is a chance that the service has run out-of-credits.
// The IP addresses are populated (using DNS queries) opportunistically and
// must be persistent so that they can be used in an out-of-credit scenario
// (when DNS queries would also fail).
// To make the store persistent across Device resets (e.g. suspend-resume), it
// is owned by the Manager.
// Currently, this is a thin wrapper around an STL container.
class IPAddressStore {
 public:
  using IPAddresses = std::set<IPAddress, IPAddressLTIgnorePrefix>;

  IPAddressStore();
  virtual ~IPAddressStore();

  // Add a new IP address if it does not already exist.
  virtual void AddUnique(const IPAddress& ip);
  virtual void Remove(const IPAddress& ip);
  virtual void Clear();
  virtual bool Contains(const IPAddress& ip) const;
  virtual size_t Count() const;
  virtual bool Empty() const;
  const IPAddresses& GetIPAddresses() const { return ip_addresses_; }

  virtual IPAddress GetRandomIP();

 protected:
  friend class IPAddressStoreTest;

 private:
  IPAddresses ip_addresses_;
  std::default_random_engine random_engine_;

  DISALLOW_COPY_AND_ASSIGN(IPAddressStore);
};

}  // namespace shill

#endif  // SHILL_IP_ADDRESS_STORE_H_
