// Copyright (c) 2012 The Chromium OS 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 SHILL_SERVICE_SORTER_H_
#define SHILL_SERVICE_SORTER_H_

#include <vector>

#include "shill/refptr_types.h"
#include "shill/service.h"

namespace shill {

class Manager;

// This is a closure used by the Manager for STL sorting of the
// Service array.  We pass instances of this object to STL sort(),
// which in turn will call the selected function in the Manager to
// compare two Service objects at a time.
class ServiceSorter {
 public:
  ServiceSorter(Manager *manager,
                bool compare_connectivity_state,
                const std::vector<Technology::Identifier> &tech_order)
      : manager_(manager),
        compare_connectivity_state_(compare_connectivity_state),
        technology_order_(tech_order) {}
  bool operator() (ServiceRefPtr a, ServiceRefPtr b) {
    const char *reason;
    return Service::Compare(manager_, a, b, compare_connectivity_state_,
                            technology_order_, &reason);
  }

 private:
  Manager *manager_;
  const bool compare_connectivity_state_;
  const std::vector<Technology::Identifier> &technology_order_;
  // We can't DISALLOW_COPY_AND_ASSIGN since this is passed by value to STL
  // sort.
};

}  // namespace shill

#endif  // SHILL_SERVICE_SORTER_H_
