blob: 19f025ff50cd986e93cc57bd980b0fad7184d23d [file] [log] [blame]
license.botbf09a502008-08-24 00:55:551// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
initial.commit09911bf2008-07-26 23:55:294
[email protected]8ff1d422009-07-07 21:31:395#include "printing/page_number.h"
initial.commit09911bf2008-07-26 23:55:296
avi126e93c2015-12-21 21:48:167#include <stddef.h>
8
[email protected]d3ad8b72008-09-17 17:45:029#include <limits>
10
initial.commit09911bf2008-07-26 23:55:2911#include "base/logging.h"
[email protected]8ff1d422009-07-07 21:31:3912#include "printing/print_settings.h"
initial.commit09911bf2008-07-26 23:55:2913
14namespace printing {
15
16PageNumber::PageNumber(const PrintSettings& settings, int document_page_count) {
17 Init(settings, document_page_count);
18}
19
20PageNumber::PageNumber()
21 : ranges_(NULL),
22 page_number_(-1),
23 page_range_index_(-1),
24 document_page_count_(0) {
25}
26
27void PageNumber::operator=(const PageNumber& other) {
28 ranges_ = other.ranges_;
29 page_number_ = other.page_number_;
30 page_range_index_ = other.page_range_index_;
31 document_page_count_ = other.document_page_count_;
32}
33
34void PageNumber::Init(const PrintSettings& settings, int document_page_count) {
35 DCHECK(document_page_count);
[email protected]e5324b52013-10-29 03:16:3736 ranges_ = settings.ranges().empty() ? NULL : &settings.ranges();
initial.commit09911bf2008-07-26 23:55:2937 document_page_count_ = document_page_count;
38 if (ranges_) {
39 page_range_index_ = 0;
40 page_number_ = (*ranges_)[0].from;
41 } else {
42 if (document_page_count) {
43 page_number_ = 0;
44 } else {
45 page_number_ = -1;
46 }
47 page_range_index_ = -1;
48 }
49}
50
51int PageNumber::operator++() {
52 if (!ranges_) {
53 // Switch to next page.
54 if (++page_number_ == document_page_count_) {
55 // Finished.
56 *this = npos();
57 }
58 } else {
59 // Switch to next page.
60 ++page_number_;
61 // Page ranges are inclusive.
62 if (page_number_ > (*ranges_)[page_range_index_].to) {
[email protected]d3ad8b72008-09-17 17:45:0263 DCHECK(ranges_->size() <= static_cast<size_t>(
64 std::numeric_limits<int>::max()));
65 if (++page_range_index_ == static_cast<int>(ranges_->size())) {
initial.commit09911bf2008-07-26 23:55:2966 // Finished.
67 *this = npos();
68 } else {
69 page_number_ = (*ranges_)[page_range_index_].from;
70 }
71 }
72 }
73 return ToInt();
74}
75
76bool PageNumber::operator==(const PageNumber& other) const {
77 return page_number_ == other.page_number_ &&
78 page_range_index_ == other.page_range_index_;
79}
80bool PageNumber::operator!=(const PageNumber& other) const {
81 return page_number_ != other.page_number_ ||
82 page_range_index_ != other.page_range_index_;
83}
84
85} // namespace printing