// Copyright (c) 2011 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 PRINTING_PAGE_RANGE_H_
#define PRINTING_PAGE_RANGE_H_

#include <stdint.h>

#include <limits>
#include <vector>

#include "base/component_export.h"

namespace printing {

struct PageRange;

using PageRanges = std::vector<PageRange>;

// Print range is inclusive. To select one page, set from == to.
struct COMPONENT_EXPORT(PRINTING) PageRange {
  // Any value above maximum practical page count (enforced by PageNumber)
  // would work, but we chose something that works even where the page
  // numbers are 1-based (i.e. can be increased by one without overflow).
  static constexpr uint32_t kMaxPage = std::numeric_limits<uint32_t>::max() - 1;

  uint32_t from;
  uint32_t to;

  bool operator<(const PageRange& rhs) const {
    return from < rhs.from || (from == rhs.from && to < rhs.to);
  }
  bool operator==(const PageRange& rhs) const {
    return from == rhs.from && to == rhs.to;
  }

  // Ensures entries come in monotonically increasing order and do not
  // overlap.
  static void Normalize(PageRanges& ranges);
};

}  // namespace printing

#endif  // PRINTING_PAGE_RANGE_H_
